Elasticsearch原理和语法

一. 介绍

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:

分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。

实时分析的分布式搜索引擎。

可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

二.基本概念

1.什么是Elasticsearch

Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式。

2.实时性

通常延迟1秒

3.集合

群集是一个或多个节点(服务器)的集合,这些节点一起保存您的全部数据,并在所有节点之间提供联合索引和搜索功能

4.节点

节点是单个服务器,它是群集的一部分,存储您的数据,并参与群集的索引和搜索功能。

5.索引

索引是具有相似特征的文档的集合。

6.类型

在6.0.0中已弃用。

7.文档

文档是可以建立索引的基本信息单位。

8.mysql和Elasticsearch 对照

  • Index:Elasticsearch的Index相当于数据库的Table
  • Type:这个在新的Elasticsearch版本已经废除(在以前的Elasticsearch版本,一个Index下支持多个Type–有点类似于消息队列一个topic下多个group的概念)
  • Document:Document相当于数据库的一行记录
  • Field:相当于数据库的Column的概念
  • Mapping:相当于数据库的Schema的概念
  • DSL:相当于数据库的SQL(给我们读取Elasticsearch数据的API)

img

9.分片及副本

1).分片

Elasticsearch提供了将索引细分为多个碎片的功能。创建索引时,只需定义所需的分片数量即可。每个分片本身就是一个功能齐全且独立的“索引”,可以托管在群集中的任何节点上。

分片很重要,主要有两个原因:

它允许您水平分割/缩放内容量

它使您可以跨多个分片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量

2).副本

在随时可能发生故障的网络/云环境中,非常有用,强烈建议您使用故障转移机制,以防碎片/节点因某种原因脱机或消失。为此,Elasticsearch允许您将索引分片的一个或多个副本制作为所谓的副本分片(简称副本)。

复制很重要,主要有两个原因:

如果分片/节点发生故障,它可提供高可用性。因此,重要的是要注意,副本碎片永远不会与从其复制原始/主要碎片的节点分配在同一节点上。

由于可以在所有副本上并行执行搜索,因此它可以扩展搜索量/吞吐量。

3).总结

总而言之,每个索引可以分为多个碎片。索引也可以复制零(表示没有副本)或多次。复制后,每个索引将具有主碎片(从中复制的原始碎片)和副本碎片(主碎片的副本)。可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,您可以随时动态更改副本数,但不能事后更改分片数。

默认情况下,Elasticsearch中的每个索引都分配有5个主分片和1个副本,这意味着如果集群中至少有两个节点,则索引将具有5个主分片和另外5个副本分片(1个完整副本),总共每个索引10个分片。

三. REST API

1.一些常用API

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#查看集群健康状况

GET /_cat/health?v


#查看节点信息

GET /_cat/nodes?v


#查看索引信息

GET /_cat/indices?v

2.索引管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#创建索引(加pretty友好显示)

PUT /索引名称?pretty

PUT /school?pretty

 

#删除索引

DELETE /索引名称?pretty

DELETE /school?pretty

3.文档管理

  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
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#索引文档(包含id)(新增或替换)

PUT /索引名称/文档名称/文档id?pretty

body内容(json)

PUT /school/teacher/1?pretty

{

    "id": 1,

    "name": "John Doe"

}

 

#索引文档(不包含id)(新增)

POST /索引名称/文档名称?pretty

body内容(json)

POST /school/teacher?pretty

{

  "name": "Jane Doe"

}

 

#获取文档

GET /索引名称/文档名称/文档id?pretty

GET /school/teacher/1?pretty

 

#更新文档

POST /索引名称/文档名称/文档id/_update?pretty

body内容(json)

POST /school/teacher/1/_update?pretty

{

  "doc": {

        "id": 1,

        "name": "John Doe",

        "age": "26"

    }

}

 

#更新文档(使用script)

POST /索引名称/文档名称/文档id/_update?pretty

{

  "script" : js

}

POST /school/teacher/1/_update?pretty

{

  "script" : "ctx._source.age += 5"

}

 

#删除文档

DELETE /索引名称/文档名称/文档id?pretty

DELETE /school/teacher/1?pretty

 

#批量处理文档

POST /索引名称/文档名称/文_bulk?pretty

json串

POST /school/teacher/_bulk?pretty

{"index":{"_id":"2"}}

{"name": "John Doe" }

{"index":{"_id":"3"}}

{"name": "Jane Doe" }

{"update":{"_id":"2"}}

{"doc": { "name": "John Doe becomes Jane Doe" } }

{"delete":{"_id":"3"}}

4.文档查询

  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
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
#新建索引

PUT /school?pretty

{

    "settings":{

        "analysis":{

            "analyzer":{

                "ik":{

                    "tokenizer":"ik_smart"

                }

            }

        }

    },

    "mappings":{

        "_doc":{

            "properties":{

                "id":{

                    "type":"long"

                },

                "name":{

                    "type":"text",

                    "analyzer":"ik_smart"

                },

                "age":{

                    "type":"long"

                },

                "class":{

                    "type":"keyword"

                },

                "create_at":{

                    "type":"date"

                }

            }

        }

    }

}

 

 

#新建实例文档

POST /school/teacher/_bulk?pretty

{"index":{"_id":"1"}}

{"id": 1,"name": "John Doe1","age": 21,"class":"一班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"2"}}

{"id": 2,"name": "John Doe2 Doe3","age": 22,"class":"一班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"3"}}

{"id": 3,"name": "John Doe3 Doe4","age": 23,"class":"一班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"4"}}

{"id": 4,"name": "John Doe4","age": 24,"class":"一班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"5"}}

{"id": 5,"name": "John Doe5","age": 25,"class":"一班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"6"}}

{"id": 6,"name": "John Doe6","age": 26,"class":"二班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"7"}}

{"id": 7,"name": "John Doe7","age": 27,"class":"二班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"8"}}

{"id": 8,"name": "John Doe8","age": 28,"class":"二班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"9"}}

{"id": 9,"name": "John Doe9","age": 29,"class":"二班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"10"}}

{"id": 10,"name": "John Doe10","age": 30,"class":"二班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"11"}}

{"id": 11,"name": "John Doe11","age": 22,"class":"二班","create_at":"2021-05-15T16:19:13"}

{"index":{"_id":"12"}}

{"id": 12,"name": "John Doe12","age": 22,"class":"二班","create_at":"2021-05-15T16:19:13"}

 

 

#搜索

GET /school/_search?q=*&sort=id:asc&pretty

GET /school/_search

{

    //"query":

    //{

      //"match_all": {}//匹配全部

      //"match" : {"age" : 21}

      //"match" : {"name" : "Doe3 Doe4 }

      //"match_phrase" : {"name" : "Doe3 Doe4"}

      //"bool" : {

      //  "must" : [

      //    {"match" : {"name" : "Doe3"}},

      //    {"match" : {"name" : "Doe4"}}

      //  ]

      //}

      //"bool" : {

      //  "should" : [

      //    {"match" : {"name" : "Doe3"}},

      //    {"match" : {"name" : "Doe4"}}

      //  ]

      //}

      //"bool" : {

      //  "must_not": [

      //    {"match" : {"name" : "Doe3"}},

      //    {"match" : {"name" : "Doe4"}}

      //  ]

      //}

      //"bool" : {

      //  "must": [

      //    {"match" : {"name" : "Doe3"}}

      //  ],

      //  "must_not": [

      //    {"match" : {"name" : "Doe4"}}

      //  ]

      //}

      //"bool" : {

      //  "must" : [

      //    {"term" : {"age" : {"value" : 21}}}},

      //    {"term" : {"name" : {"value" : "Doe3"}}}

      //  ]

      //}

      //"bool" : {

      //  "must": {"match_all" : {}},

      //  "filter": {

      //    "range": {

      //      "age": {

      //        "gte": 21,

      //        "lte": 30

      //      }

      //    }

      //  }

      //}

    //},

    //"_source": ["id", "name", "age"],

    //"from" : 0, //从0开始

    //"size" : 3,

    "size" : 0,

    "aggs": {

      "group_by_class": {

        "terms": {

          "field": "class.keyword"

        },

        "aggs": {

          "average_age": {

            "avg": {

              "field": "age"

            }

          }

        }

      }

    },

    "highlight" : {"fields":{"name":{}}}

    //"sort": [

    //  { "id": "asc" }

    //  { "id": {"order":"asc"} }

    //]

}