ElasticSearch版本:6.5.0(点击跳转官方文档)
来个小Demo,上手体验下,毕竟实践出真知。
1. 建立索引
我们要做的是存储员工数据,每个文档代表一个员工。在Elasticsearch中存储数据的行为就叫索引(indexing),文档(Document)归属于一种类型(Type),而这些类型存在于索引(Index)中。
Elasticsearch集群可以包含多个索引(indexes),每一个索引可以包含多个类型(Types),每一个类型包含多个文档(Documents),然后每个文档包含多个字段(Fields).
2. 添加数据
1 | http://localhost:9200/megacorp/employee/1 |
path:/megacorp/employee/1 包含了三部分:
名字 | 说明 |
---|---|
megacorp | 索引名 |
employee | 类型名称 |
1 | 员工id |
使用PostMan发送请求,如下图,也可以使用kibana
我们继续添加更多的数据:
1 | http://localhost:9200/megacorp/employee/2 |
通过elasticsearch-head工具,可以浏览数据。
3. 检索文档
执行Http GET请求,并指出文档的"地址 - 索引 - 类型 - ID" 即可。
1 | http://localhost:9200/megacorp/employee/1 |
使用curl查询数据
响应的内容中,包含了一些文档的元信息,John Smith的原始JSON文档存储在_source字段中。
4. 删除文档
5. 简单搜索
搜索全部员工信息
1 | http://localhost:9200/megacorp/employee/_search |
依旧使用megacorp索引 和 employee类型,但是在结尾使用关键字 "_search"来取代原来的文档ID。
响应内容的hits数组中包含了所有的文档(默认情况下,会返回前10个结果)。
6. 查询字符串搜索
我们搜索下姓氏中包含"smith"的员工。
在命令行中使用轻量级的搜索方法,这种方法被称作 "查询字符串(query string)"搜索,因为我们像传递URL参数一样去传递查询语句
1 | http://localhost:9200/megacorp/employee/_search?q=last_name:Smith |
在请求中依旧使用 "_search"关键字,然后将查询语句传递给参数 “q=”,这样就能得到所有姓氏为Smith的结果。
7. 使用DSL语句查询
使用Kibana工具,进行DSL语句查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现
1 | get /megacorp/employee/_search |
8. 更复杂的搜索
将搜索条件再复杂一些。
查找姓氏为"Smith"的,年龄大于30的员工。
我们为DSL查询语句增加过滤器(fitler),它使我们高效率的执行一个结构化搜索。
(注意《Elasticsearch权威指南》中的例子,会出错,因为 过滤查询已被弃用,并在ES 5.0中删除。)
1 | GET /megacorp/employee/_search |
9. 全文搜索
搜索喜欢"rock climbing"的员工
1 | GET /megacorp/employee/_search |
默认情况下,elasticsearch根据结果相关性评分来对结果集进行排序;
所谓的 [结果相关性评分] 就是文档与查询条件的匹配程度。
但为什么jane smith 也会出现在结果中呢?
原因是"rock"在它的about字段中也被提及了,因为只有“rock”被提及而“climbing”没有, 所以她的 _score 要低于John。
10. 短语搜索
上面的例子,都是单独搜索一个词,如果想确切的匹配若干个单词或者短语,就要使用match_phrase
1 | GET megacorp/employee/_search |
11. 聚合搜索
查找所有职员中 最大的共同点(兴趣爱好)是什么…
5.x后对排序,聚合这些操作用单独的数据结构(fielddata)缓存到内存里了,需要单独开启
在执行聚合之前,要先执行,下面的内容
1 | PUT /megacorp/_mapping/employee/ |
然后执行聚合搜索
1 | GET megacorp/employee/_search |
忽略其他的,看interests中的内容;查询结果将所有员工的interests都输出了。
11.1. 查找所有姓氏为"smith"的人,兴趣爱好最多的
1 | GET /megacorp/employee/_search |
输出结果:
1 | { |
all_interests中已经将信息聚合了
11.2. 统计每种兴趣下,职员的平均年龄
1 | GET /megacorp/employee/_search |
返回结果有些复杂,比较长,直接贴下面比较重要的:
结果很好理解,该聚合结果比之前的聚合结果要更加丰富;
我们得到了兴趣以及员工数量以及平均年龄
12. Reference
- 《Elasticsearch 权威指南(中文版)》