ElasticSearch搜索详细讲解与操作

全文检索基础

全文检索流程

流程:

创建索引

返回结果

查询索引

原始文档

创建索引

索引库

查询索引

创建索引:

获取文档

构建文档对象

分析文档'分词'

创建索引

查询索引:

用户查询结构

创建查询

执行查询

渲染结果

相关概念

索引库

索引库就是存储索引的保存在磁盘上的一系列的文件。里面存储了建立好的索引消息以及文档对象。

** 一个索引库相当于数据库中的一张表,一个文档对象相当于数据库中的一行数据

doucument对象

获取原始内容的目的是为了索引,在索引前需要将原始内容建成文档,文档中包含一个一个的域(字段),域中存储内容。每个文档都有一个唯一的编号,就是文档id。

field对象

如果我们把document看作是数据库中的一条记录的话,field相当于是记录中的字段。field是索引库中存储数据的最小单位。field的数据类型大致可以分为数值类型和文本类型,一般需要查询的字段都是文本类型的,field还有如下属性:

是否分词:是否对域的内容进行分词处理。前提是我们对域的内容进行查询

是否索引:将Field分析后的词或整个Field值进行索引,只有索引方可搜索到

是否存储:Field值存储在文档中,存储在文档中的Field才可以从Document中获取

term对象

从文档对象中拆分出来的每个单词叫做term,不同域中拆分出来的相同的单词是不同term。term中包含两部分,一部分是文档的域名。另一部分是单词的内容。term是创建索引的关键词对象。

ElasticSearch相关概念

概述

ES是面对文档的,这意味这它可以存储整个对象或文档。然而它不仅仅是存储,还会索引每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。

ES比较传统关系型数据库如下:

Relational DB -> Databases->Tables->Rows ->Columns

ES->Indices->Types->Documents->Fields

ES核心概念

索引index

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。

类型type

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定,通常,会为具有一组共同字段文档定义一个类型。比如说,我们假设你运营一个博客平台

字段Field

相当于是字段表的字段,对文档数据根据不同属性进行的分类标识

映射mapping

mapping是处理数据的范式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其他就是处理es里面的数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。

文档document

一个文档是一个可被索引的基础消息单元。比如,你可以拥有某一个客户的文档,某个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON格式来表示,而JSON是一个到处存在的互联网数据交互格式

在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type

接近实时NRT

ES是一个接近实时的搜索平台,这意味这,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟

集群cluster

集群就是有一个或多个节点组织在一起,它们共同持有整个数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是es。这个名字是重要的,意味一个节点只能通过指定某个集群的名字来加入这个集群

节点node

一个节点是集群的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识,默认情况下,这个名字是一个随机的名字。

分片和复制 shards&replicas

一个索引可以存储超出单个节点硬件限制的大量数据。每个分片本身也是一个功能完善并且独立的索引,这个索引可以被放置到集群的任何节点上。分片很重要,主要有两方面:

1)允许你水平分割/扩展你的内容容量

2)允许你的分片(潜在地,位于多个节点上)之上进行分布式、并行的操作,进而提高性能/吞吐量

要复制的两个原因:在分片/节点失败的情况下,提高了高可用性。因为这个原因,主要到复制分片从不与原/主要分片置于同一节点上是非常重要的。扩展你的搜索量/吞吐量。因为搜索可以在所有的复制上并行运行。总之,每个索引可以被分成多个分片,一个索引也可以被复制0次或多次,一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你是不能改变分片的数量

安装

docker安装

sudo docker pull elasticsearch:5.6.8

1

启动

sudo docker run -id --name=zys_es -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8

1

注意:可能因为内存不够或者进程满等原因会中断es进程

安装包安装

sudo apt-get install openjdk-8-jdk #1、安装open-jdk

#2、官网查找需要的es版本 es官网:https://www.elastic.co/cn/downloads/elasticsearch

#点击【apt-get】

#查找自己想要的版本,点击使用deb方式安装

#安装es-7.6.2

1、wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-amd64.deb

2、wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-amd64.deb.sha512

3、shasum -a 512 -c elasticsearch-7.6.2-amd64.deb.sha512

4、sudo dpkg -i elasticsearch-7.6.2-amd64.deb

#修改配置文件elasticsearch.yml

vi /etc/elasticsearch/elasticsearch.yml

{

node.name: node-1

network.host: 0.0.0.0 #允许外网访问

http.port: 9200 #指定es端口号

clauster.initial_master_nodes: ["node-1"]

}

#修改jvm.options

{

-Xms4g

-Xms4g

}

#启动es

sudo chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/  #目录的owner和group改成elasticsearch

systemctl enable elasticsearch.service #设置es开机自启动

sudo systemctl start elasticsearch.service #启动es

sudo systemctl stop elasticsearch.service #停止es

#查看es运行状态

service elasticsearch status

#查看报错日志

tail -f /var/log/elasticsearch/elasticsearch.log

#检查是否运行正常

curl localhost:9200

开启跨域访问支持,默认为false

http.cors.enabled: true

跨域访问允许的域名地址

http.cors.allow-origin: "*"

通过为 cluster.initial_master_nodes 参数设置符合主节点条件的节点的 IP 地址来引导启动集群

cluster.initial_master_nodes: ["node-1"]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

ElasticSearch的客户端操作

三种方式:

第一种:elasticsearch-head操作

第二种:使用elasticsearch提供的Restful接口直接访问

第三种:使用es提供的API直接访问

elasticsearch-head

下载elasticsearch-head安装包

进入目录下打开cmd

npm install -g grunt-cli

启动

npm install

grunt server

1

2

3

4

5

6

Postman

创建索引index和映射Mapping

注意:elasticsearch7默认不在支持指定索引类型,默认索引类型是_doc,如果想改变,则配置include_type_name: true 即可(这个没有测试,官方文档说的,无论是否可行,建议不要这么做,因为elasticsearch8后就不在提供该字段)。官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html

7.x之前:

{

"settings":{

"number_of_shards" : 3,

"number_of_replicas" : 0

},

"mappings":{

"books":{ //指定索引

"properties":{

"title":{"type":"text"},

"name":{"type":"text","index":false}, //有index

"publish_date":{"type":"date","index":false},

"price":{"type":"double"},

"number":{

"type":"object",

"dynamic":true

}

}

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

7.x之后:

{

"settings":{

"number_of_shards":3, #分片数量

"number_of_replicas":2 #每个分片副本

},

"mappings":{

//无索引

"properties":{

"id":{"type":"long"},

"name":{"type":"text","analyzer":"standard"}, //无指定index为true或为false,standard为分词器的一种,standard一个汉字一个词

"text":{"type":"text","analyzer":"ik_max_word"}

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

创建索引后设置Mapping

http://120.78.130.50:9200/blog7/hello/mapping

{

"properties":{

"id":{"type":"long"},

"name":{"type":"text","analyzer":"ik_smart"}, //无指定index为true或为false

"text":{"type":"text","analyzer":"ik_max_word"}

}

}

1

2

3

4

5

6

7

8

9

10

创建文档document

请求url:

post http://120.78.130.50:9200/blog1/_doc/1

请求体:

{

"id":1,

"name":"es是一个lucene的搜索服务器",

"text":"阿萨的贺卡收到萨拉DHL收到啦收到啦实打实的拉萨机的卡拉卡斯德拉夫拉上来就"

}

1

2

3

4

5

修改文档

请求url:

post http://120.78.130.50:9200/blog1/_doc/1

请求体:

{

"id":1,

"name":"es是一个lucene的搜索服务器反对犯得上",

"text":"阿萨的贺卡收到萨拉DHL收到啦收到啦实打实的拉萨机的卡拉卡斯德拉夫拉上来就"

}

1

2

3

4

5

文档删除document

delete http://120.78.130.50:9200/blog1/_doc/1

根据id查询文档

GET http://120.78.130.50:9200/blog1/_doc/2

结果

{

"_index": "blog1", //索引名称

"_type": "_doc", //索引类型

"_id": "2",

"_version": 1,

"_seq_no": 2,

"_primary_term": 1,

"found": true,

"_source": { //数据

"id": 1,

"name": "es是一个lucene的搜索服务器", //无指定index为true或为false

"text": "阿萨的贺卡收到萨拉DHL收到啦收到啦实打实的拉萨机的卡拉卡斯德拉夫拉上来就"

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

查询文档-querystring查询

url:

POST http://120.78.130.50:9200/blog1/_doc/_search

请求体:

{

"query": {

"query_string": {

"default_field": "name",

"query": "搜索服务器"

}

}

}

1

2

3

4

5

6

7

8

钢索->"钢","索",搜索是分为两个词,注意Standard标准分词器,会把汉字每个字分为一个词存到索引库中的name,也就是按照Standard进行的分词,所以搜索钢索能搜到这个document

查询文档-term查询

url:

POST http://120.78.130.50:9200/blog1/_doc/_search

body

{

"query": {

"term": {

"name": "搜索"

}

}

}

1

2

3

4

5

6

7

query_string :搜索之前对搜索的关键词分词

term:对搜索的关键词不分词

IK分词器

安装

下载安装包 :https://github.com/medcl/elasticsearch-analysis-ik/releases

放到/ usr/share/elasticsearch/plugins

重启es

7.x之前测试:

http://120.78.130.50:9200/_analyze?analyzer=ik_smart\&pretty=true\&text=我是程序员

http://120.78.130.50:9200/_analyze?analyzer=ik_max_word\&pretty=true\&text=我是程序员

7.x之后测试:url+body

http://120.78.130.50:9200/_analyze

{

"analyzer": "ik_smart",

"text": "我是傻逼"

}

注意:

​ ik_smart:会做最粗粒度的拆分

​ ik_max_word: 会将文本做最细粒度的拆分

注意出错:将ik解压成功后es可能就启动不了,可能是ik中所有文件的用户组和所有者属于root,需要改成当前的用户组和所有者,用

sudo chmod zys_ergou ./ik/*

sudo chown zys_ergou ./ik/*

还有一种情况就是es和ik的版本不兼容,需要进入plugin-descriptor.properties文件更改es的version

相关推荐
5:0016 小时前
Python进阶语法
开发语言·python
橙子家16 小时前
Serilog 日志库简单实践(四)消息队列 Sinks(.net8)
后端
Victor35616 小时前
Hibernate(21)Hibernate的映射文件是什么?
后端
pe7er16 小时前
如何阅读英文文档
java·前端·后端
pe7er16 小时前
IDEA 实用小技巧(自用)
后端
Victor35616 小时前
Hibernate(22)Hibernate的注解配置是什么?
后端
喵叔哟16 小时前
15.故障排查与调试
后端·docker·容器·服务发现
小康小小涵16 小时前
睿抗机器人大赛魔力元宝
python·ubuntu·gitee·github
勇往直前plus16 小时前
Python 类与实例对象的内存存储
java·开发语言·python
禾叙_17 小时前
【canal】canal同步msyql到redis
android·redis·python