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

相关推荐
浊酒南街1 小时前
决策树python实现代码1
python·算法·决策树
FreedomLeo12 小时前
Python机器学习笔记(十三、k均值聚类)
python·机器学习·kmeans·聚类
星光樱梦2 小时前
32. 线程、进程与协程
python
阿正的梦工坊2 小时前
深入理解 PyTorch 的 view() 函数:以多头注意力机制(Multi-Head Attention)为例 (中英双语)
人工智能·pytorch·python
西猫雷婶3 小时前
python学opencv|读取图像(十九)使用cv2.rectangle()绘制矩形
开发语言·python·opencv
海绵波波1073 小时前
flask后端开发(10):问答平台项目结构搭建
后端·python·flask
赵谨言4 小时前
基于python网络爬虫的搜索引擎设计
爬虫·python·搜索引擎
code04号4 小时前
python脚本:批量提取excel数据
开发语言·python·excel
hakesashou4 小时前
python如何打乱list
开发语言·python
网络风云4 小时前
【魅力golang】之-反射
开发语言·后端·golang