Elasticsearch笔记

ElasticSearch简介

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

ElasticSearch对比MySQL

ELasticSearch MySQL
index database
type table
document row
field column

RESTful

RESTful中文意思是表现层状态转化。

在RESTful架构中:每一个URI代表一种资源;客户端和服务器之间,传递这种资源的某种表现层;客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化”。通过URI指定资源,如Index,Document等。通过Http Method指明资源操作类型,如GET POST PUT DELETE等。

索引创建

使用postman工具创建一个名为shopping的索引,请求方式为PUT

1

索引查询

获取单个索引信息

2

获取全部索引信息

请求地址后面添加_cat/indices?v

3

索引删除

删除名为shopping的索引,请求方式为DELETE

4

创建文档

请求方式为POST,请求地址为http://localhost:9200/索引名/_doc,请求体为JSON格式

5

由于ES自动生成的id不便于记忆,因此我们可以自定义id,只需要在_doc后写入自定义的id即可

6

查询文档

只需要将创建文档的请求方式改为GET即可,其中_doc后面的1001相当于主键

7

获取索引下的所有数据,可以在请求的索引后加_search

8

修改索引下的数据

全量更新

因为全量更新的请求是满足幂等条件的,因此请求方式为PUT,将需要修改的内容以JSON格式写入请求体

9

局部更新

局部更新的请求不满足幂等条件,因此请求方式为POST,而且因为是局部更新,因此索引名后面要写_update而不能写_doc

10

删除数据

资源地址和创建时是一样的,请求方式变为DELETE

11

条件查询

请求路径查询

请求方式为GET,请求路径为http://localhost:9200/shopping/_search?q=category:iphone13

该请求路径表示查询shopping索引下category=iphone13的所有结果

12

请求体查询

请求体查询在请求路径只需要输入http://localhost:9200/shopping/_search,在请求体中添加JSON查询请求如下

1
2
3
4
5
6
7
{
"query":{
"match":{
"category":"iphone13"
}
}
}

13

如果要全量查询,只需要将请求体中的match改为match_all即可

分页查询

全量查询的话数据量会很大,因此我们可以采用分页查询

请求体中添加JSON如下,其中from表示从哪一页开始,0表示第一页。size表示页的大小,即每一页有多少条数据。

1
2
3
4
5
6
7
8
9
{
"query":{
"match_all":{

}
},
"from" : 0,
"size": 2
}

14

查询结果数据源控制

在请求体中添加JSON请求查询如下,其中_source表示所要展示的数据源,这里我们设置只显示title字段

1
2
3
4
5
6
7
8
9
10
{
"query":{
"match_all":{

}
},
"from" : 0,
"size": 2,
"_source" : ["title"]
}

15

查询结果排序

在请求体中添加JSON请求查询如下,其中sort表示所要要对数据进行排序,这里我们设置按照价格进行降序排序,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"query":{
"match_all":{

}
},
"from" : 0,
"size": 2,
"_source" : ["title"],
"sort" : {
"price" : {
"order" : "desc"
}
}
}

16

多条件查询

多条件同时成立

请求体如下,其中bool代表条件查询,must表示多个条件必须同时成立

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"query":{
"bool" : {
"must" : [
{
"match" :{
"category":"iphone13"
}
},
{
"match" :{
"price":"7999"
}
}
]
}
}
}

17

多条件任意成立

请求体如下,其中bool代表条件查询,should表示多个条件任意成立一个都行,这个时候我们会同时查出价格为5999和7999的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"query":{
"bool" : {
"should" : [
{
"match" :{
"price":"5999"
}
},
{
"match" :{
"price":"7999"
}
}
]
}
}
}

18

范围查询

请求体如下,其中filter表示过滤,range表示范围,我们选择price大于6000作为条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"query":{
"bool" : {
"should" : [
{
"match" :{
"category":"iphone13"
}
}
],
"filter" : {
"range" : {
"price" : {
"gt" : 6000
}
}
}
}
}
}

19

完全匹配

ES在进行匹配查询的时候,会对文字进行插词之后倒排索引,因此对于category=华为来讲,我们在match匹配的时候只写一个华或是一个为,ES都会匹配出category=华为的结果。如果我们需要完全匹配的话,需要将match改为match_phrase

高亮查询

请求体如下,这里我们的匹配规则是category=iphone13,并对category字段进行高亮处理

1
2
3
4
5
6
7
8
9
10
11
12
{
"query" : {
"match" : {
"category" : "iphone13"
}
},
"highlight" : {
"fields" : {
"category" : {}
}
}
}

20

映射关系

创建一个索引映射

首先创建一个test索引

21

创建索引的结构信息

请求路径为http://localhost:9200/test/_mapping,请求方式为PUT,请求体如下,其中properties表示属性设置,type=text表示name可以分词处理,index=true表示name可以被索引查询,type=keyword表示sex不可以分词处理,必须完整匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"properties" : {
"name" : {
"type" : "text",
"index" : true
},
"sex" : {
"type" : "keyword",
"index" : true
},
"tel" : {
"type" : "keyword",
"index" : false
}
}
}

22

增加数据

23

查询数据

因为我们的name设置的是可以分词,因此我们在查询的时候对于name只匹配一个字也可以查询出来结果。

24

对于sex因为我们设置的是keyword,因此不可以分词查询。必须完全匹配。

25

26

而对于tel字段,因为indexfalse,即不可以通过索引进行查询,因此我们无法根据tel字段查到数据。

27