ElasticSearch快速入门(1)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ElasticSearch快速入门(1)

1 初识ElasticSearch

1.1 基于数据库查询的问题

20201222161124828.png

1.2 倒排索引

20201227173146463.png

20201227173136883.png

20201223193641613.png

创建索引相当于创建数据库,创建映射就相当创建表结构,文档就是对应的数据.

倒排索引:将文档进行分词,形成词条和id的对应关系即为反向索引。

以唐诗为例,所处包含“前”的诗句

正向索引:由《静夜思》–>窗前明月光—>“前”字

反向索引:“前”字–>窗前明月光–>《静夜思》

反向索引的实现就是对诗句进行分词,分成单个的词,由词推据,即为反向索引

“床前明月光”–> 分词

将一段文本按照一定的规则,拆分为不同的词条(term)

20201223191430883.png

20201223192000530.png

1.3 ES存储和查询的原理

index(索引):相当于mysql的库

映射:相当于mysql 的表结构

document(文档):相当于mysql的表中的数据

数据库查询存在的问题:

  1. 性能低:使用模糊查询,左边有通配符,不会走索引,会全表扫描,性能低
  2. 功能弱:如果以”华为手机“作为条件,查询不出来数据

Es使用倒排索引,对title 进行分词

20201223192156128.png

  1. 使用“手机”作为关键字查询
    生成的倒排索引中,词条会排序,形成一颗树形结构,提升词条的查询速度
  2. 使用“华为手机”作为关键字查询
    华为:1,3
    手机:1,2,3

20201223192210922.png

1.4 ES概念详解

•ElasticSearch是一个基于Lucene的搜索服务器

20201223192232489.png

•是一个分布式、高扩展、高实时的搜索与数据分析引擎

•基于RESTful web接口

•Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎

•官网:https://www.elastic.co/

应用场景

•搜索:海量数据的查询

•日志数据分析

•实时数据分析

1.5 知识总结

ElasticSearch和Mysql的区别

  1. •MySQL有事务性,而ElasticSearch没有事务性,所以你删了的数据是无法恢复的。
  1. •ElasticSearch没有物理外键这个特性,,如果你的数据强一致性要求比较高,还是建议慎用

ElasticSearch和MySql分工不同,MySQL负责存储数据,ElasticSearch负责搜索数据。

20201223192246940.png

2 安装ElasticSearch

2.1 ES安装

参见ElasticSearch-ES安装

查看elastic是否启动

ps -ef|grep elastic

2.2 ES辅助工具安装

参见ElasticSearch-ES安装.md

后台启动

nohup ../bin/kibana &

3 ElasticSearch核心概念

索引(index)

ElasticSearch存储数据的地方,可以理解成关系型数据库中的数据库概念。

映射(mapping)

mapping定义了每个字段的类型、字段所使用的分词器等。相当于关系型数据库中的表结构。

文档(document)

Elasticsearch中的最小数据单元,常以json格式显示。一个document相当于关系型数据库中的一行数据。

倒排索引

一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,对应一个包含它的文档id列表。

类型(type)

一种type就像一类表。如用户表、角色表等。在Elasticsearch7.X默认type为_doc

 \- ES 5.x中一个index可以有多种type。
  \- ES 6.x中一个index只能有一种type。
  \- ES 7.x以后,将逐步移除type这个概念,现在的操作已经不再使用,默认_doc

4 脚本操作ES

4.1 RESTful风格介绍

1.ST(Representational State Transfer),表述性状态转移,是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。就是一种定义接口的规范。

2.基于HTTP。

3.使用XML格式定义或JSON格式定义。

4.每一个URI代表1种资源。

5.客户端使用GET、POST、PUT、DELETE 4个表示操作方式的动词对服务端资源进行操作:

GET:用来获取资源

POST:用来新建资源(也可以用于更新资源)

PUT:用来更新资源

DELETE:用来删除资源

20201223192312628.png

4.2 操作索引

PUT

http://ip:端口/索引名称

查询

GET http://ip:端口/索引名称  # 查询单个索引信息
GET http://ip:端口/索引名称1,索引名称2...  # 查询多个索引信息
GET http://ip:端口/_all  # 查询所有索引信息

•删除索引

DELETE http://ip:端口/索引名称

•关闭、打开索引

POST http://ip:端口/索引名称/_close  
POST http://ip:端口/索引名称/_open 

4.3 kibana脚本操作ES

4.3.1 添加索引

PUT person

4.3.2 删除索引

DELETE person

4.3.3 查询索引(相当于表)

GET person

4.3.4 添加映射(相当于字段名+字段类型)

PUT person/_mapping
{
  "properties":{
    "name":{
      "type":"keyword"
    },
    "age":{
      "type":"integer"
    }
  }
}

4.3.5 创建索引并添加映射

PUT person
{
  "mappings": {
    "properties": {
      "name":{
      "type":"keyword"
      },
      "age":{
        "type":"integer"
      },
      "address":{
        "type":"text"
      }
    }
  }
}

4.3.6 查询文档

GET person/_doc/1

#添加文档,指定ID

PUT person/_doc/1
{
"name":"刘德华",
"age":30,
"address":"北京海淀区"
}

4.3.7 添加文档,自动生成ID

POST person/_doc/
{
"name":"张学友",
"age":20,
"address":"上海闵行区"
}

4.3.8 修改文档

PUT person/_doc/1
{
"name":"刘德华222",
"age":30,
"address":"北京海淀区"
}

4.3.9 删除文档

DELETE person/_doc/1

4.3.10 查询全部结果

默认情况下,es一次展示10条数据,通过from和size来控制分页

GET goods/_search
{
  "query": {
    "match_all": {
    }
  },
  "from": 0,
  "size": 100
}

4.3.11 term查询

GET goods/_search
{
  "query": {
    "term": {
      "title": {
        "value": "华为"
      }
    }
  }
}

4.3.11 match查询

GET goods/_search
{
  "query": {
    "match": {
      "title": "华为手机"
    }
  },
  "size": 500
}
GET goods/_search
{
  "query": {
    "match": {
      "title": {
        "query": "华为手机",
        "operator": "and"
      }
    }
  }
}
GET _analyze
{
  "analyzer": "ik_smart",
  "text": "施华洛世奇"
}

4.3.12 wildcard 查询。查询条件分词,模糊查询

GET goods/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "华*"
      }
    }
  }
}

4.3.13 正则查询

GET goods/_search
{
  "query": {
    "regexp": {
      "title": "\\w+(.)*"
    }
  }
}

4.3.14 前缀查询

GET goods/_search
{
  "query": {
    "prefix": {
      "brandName": {
        "value": "三"
      }
    }
  }
}

4.3.15 范围查询

GET goods/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 2000,
        "lte": 3000
      }
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

3.4.17queryString和simpleQueryString

 GET goods/_search
         {
           "query": {
             "query_string": {
               "fields": ["title","categoryName","brandName"],
               "query": "华为 AND 手机"
             }
           }
         }
GET goods/_search
         {
           "query": {
             "simple_query_string": {
               "fields": ["title","categoryName","brandName"],
               "query": "华为 AND 手机"
             }
           }
         }

3.4.17 boolquery

GET goods/_search
         {
           "query": {
             "bool": {
               "must": [
                 {
                   "term": {
                     "brandName": {
                       "value": "华为"
                     }
                   }
                 }
               ],
               "filter":[
                 {
                 "term": {
                   "title": "手机"
                 }
                },
                {
                  "range":{
                   "price": {
                     "gte": 2000,
                     "lte": 3000
                  }
                  }
                }
               ]
             }
           }
         }
GET goods/_search
         {
           "query": {
             "bool": {
               "filter": [
                 {
                   "term": {
                     "brandName": {
                       "value": "华为"
                     }
                   }
                 }
               ]
             }
           }
         }

3.4.18 聚合查询

         GET goods/_search
         {
           "query": {
             "match": {
               "title": "手机"
             }
           },
           "aggs": {
             "max_price": {
               "max": {
                 "field": "price"
               }
             }
           }
         }

4.3.19 桶聚合(分组)

 GET goods/_search
         {
           "query": {
             "match": {
               "title": "手机"
             }
           },
           "aggs": {
             "goods_brands": {
               "terms": {
                 "field": "brandName",
                 "size": 100
               }
             }
           }
         }
GET goods/_search
         {
           "query": {
             "match": {
               "title": "电视"
             }
           },
           "highlight": {
             "fields": {
               "title": {
                 "pre_tags": "<font color='red'>",
                 "post_tags": "</font>"
               }
             }
           }
         }

4.3.20 重建索引

         # 新建student_index_v1。索引名称必须全部小写
PUT student_index_v1
         {
           "mappings": {
             "properties": {
               "birthday":{
                 "type": "date"
               }
             }
           }
         }
GET student_index_v1
PUT student_index_v1/_doc/1
         {
           "birthday":"1999-11-11"
         }
GET student_index_v1/_search
PUT student_index_v1/_doc/1
         {
           "birthday":"1999年11月11日"
         }

4.3.21 改变字段的类型

  1. 创建新的索引 student_index_v2
  2. 将student_index_v1 数据拷贝到 student_index_v2
# 创建新的索引 student_index_v2
PUT student_index_v2
{
  "mappings": {
    "properties": {
      "birthday": {
        "type": "text"
      }
    }
  }
}
# 将student_index_v1 数据拷贝到 student_index_v2
# _reindex 拷贝数据
POST _reindex
{
  "source": {
    "index": "student_index_v1"
  },
  "dest": {
    "index": "student_index_v2"
  }
}
GET student_index_v2/_search
        PUT student_index_v2/_doc/2
{
  "birthday": "1999年11月11日"
}

4.3.22 有java代码切换索引库

  1. 改代码(不推荐)
  2. 索引别名(推荐)
# 步骤:
# 0. 先删除student_index_v1
# 1. 给student_index_v2起个别名 student_index_v1
# 先删除student_index_v1
DELETE student_index_v1
# 给student_index_v2起个别名 student_index_v1
POST student_index_v2/_alias/student_index_v1
GET student_index_v1/_search
GET student_index_v2/_search


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
JSON 自然语言处理 Java
ElasticSearch快速入门(2)
ElasticSearch快速入门(2)
131 1
|
JSON Java 程序员
教你快速入门ElasticSearch,超详细简单~ 2
教你快速入门ElasticSearch,超详细简单~
173 0
|
存储 JSON 自然语言处理
教你快速入门ElasticSearch,超详细简单~ 1
教你快速入门ElasticSearch,超详细简单~
211 0
|
存储 前端开发 Java
ElasticSearch快速入门之创建索引库、创建映射、创建文档、搜索文档
ElasticSearch快速入门之创建索引库、创建映射、创建文档、搜索文档
393 0
|
存储 JSON JavaScript
Elasticsearch 快速入门|学习笔记
快速学习 Elasticsearch 快速入门
104 0
Elasticsearch 快速入门|学习笔记
|
存储 自然语言处理 关系型数据库
还不会ES?Elasticsearch快速入门实操指南送上(上)
还不会ES?Elasticsearch快速入门实操指南送上(上)
390 0
还不会ES?Elasticsearch快速入门实操指南送上(上)
|
自然语言处理 Java 索引
还不会ES?Elasticsearch快速入门实操指南送上(下)
还不会ES?Elasticsearch快速入门实操指南送上(下)
200 0
|
自然语言处理 Java 数据挖掘
【Spring Boot 快速入门】十三、Spring Boot集成Elasticsearch
【Spring Boot 快速入门】十三、Spring Boot集成Elasticsearch
310 0
【Spring Boot 快速入门】十三、Spring Boot集成Elasticsearch
|
消息中间件 缓存 JSON
|
消息中间件 Kafka Docker
【Elasticsearch全文搜索引擎实战】之Filebeat快速入门
0. 背景 用过ELK(Elasticsearch, Logstash, Kibana)的人应该都面临过同样的问题,Logstash虽然功能强大:支持许多的input/output plugin、强大的filter功能。
3001 0