ElasticSearch-基础-07-上手Demo
2025-01-22 08:19:30    1.6k 字   
This post is also available in English and alternative languages.

ElasticSearch版本:6.5.0(点击跳转官方文档)

来个小Demo,上手体验下,毕竟实践出真知。


1. 建立索引

我们要做的是存储员工数据,每个文档代表一个员工。在Elasticsearch中存储数据的行为就叫索引(indexing),文档(Document)归属于一种类型(Type),而这些类型存在于索引(Index)中。

Elasticsearch集群可以包含多个索引(indexes),每一个索引可以包含多个类型(Types),每一个类型包含多个文档(Documents),然后每个文档包含多个字段(Fields).


2. 添加数据

1
2
3
4
5
6
7
8
http://localhost:9200/megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}

path:/megacorp/employee/1 包含了三部分:

名字说明
megacorp索引名
employee类型名称
1员工id

使用PostMan发送请求,如下图,也可以使用kibana

添加数据

我们继续添加更多的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http://localhost:9200/megacorp/employee/2
{
"first_name": "Jane",
"last_name": "Smith",
"age": 32,
"about": "I like to collect rock albums",
"interests": ["music"]
}

http://localhost:9200/megacorp/employee/3
{
"first_name": "Douglas",
"last_name": "Fir",
"age": 35,
"about": "I like to build cabinets",
"interests": ["forestry"]
}

通过elasticsearch-head工具,可以浏览数据。

elasticsearch-head查看数据


3. 检索文档

执行Http GET请求,并指出文档的"地址 - 索引 - 类型 - ID" 即可。

1
http://localhost:9200/megacorp/employee/1

使用curl查询数据

curl检索数据

响应的内容中,包含了一些文档的元信息,John Smith的原始JSON文档存储在_source字段中。


4. 删除文档

postMan删除文档


5. 简单搜索

搜索全部员工信息

1
http://localhost:9200/megacorp/employee/_search

依旧使用megacorp索引 和 employee类型,但是在结尾使用关键字 "_search"来取代原来的文档ID。

响应内容的hits数组中包含了所有的文档(默认情况下,会返回前10个结果)。

curl全部查询


6. 查询字符串搜索

我们搜索下姓氏中包含"smith"的员工。

在命令行中使用轻量级的搜索方法,这种方法被称作 "查询字符串(query string)"搜索,因为我们像传递URL参数一样去传递查询语句

1
http://localhost:9200/megacorp/employee/_search?q=last_name:Smith

在请求中依旧使用 "_search"关键字,然后将查询语句传递给参数 “q=”,这样就能得到所有姓氏为Smith的结果。

curl查询字符串搜索


7. 使用DSL语句查询

使用Kibana工具,进行DSL语句查询。

DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现

1
2
3
4
5
6
7
8
get /megacorp/employee/_search
{
"query":{
"match":{
"last_name":"Smith"
}
}
}

DSL查询-1


8. 更复杂的搜索

将搜索条件再复杂一些。

查找姓氏为"Smith"的,年龄大于30的员工。

我们为DSL查询语句增加过滤器(fitler),它使我们高效率的执行一个结构化搜索。

(注意《Elasticsearch权威指南》中的例子,会出错,因为 过滤查询已被弃用,并在ES 5.0中删除。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GET /megacorp/employee/_search
{
"query" : {
"bool" : {
"filter" : {
"range" : {
"age" : { "gt" : 30 }
}
},
"must" : {
"match" : {
"last_name" : "smith"
}
}
}
}
}

DSL查询-2


9. 全文搜索

搜索喜欢"rock climbing"的员工

1
2
3
4
5
6
7
8
GET /megacorp/employee/_search
{
"query":{
"match":{
"about":"rock climbing"
}
}
}

DSL全文检索

默认情况下,elasticsearch根据结果相关性评分来对结果集进行排序;

所谓的 [结果相关性评分] 就是文档与查询条件的匹配程度。

但为什么jane smith 也会出现在结果中呢?

原因是"rock"在它的about字段中也被提及了,因为只有“rock”被提及而“climbing”没有, 所以她的 _score 要低于John。


10. 短语搜索

上面的例子,都是单独搜索一个词,如果想确切的匹配若干个单词或者短语,就要使用match_phrase

1
2
3
4
5
6
7
8
GET megacorp/employee/_search
{
"query": {
"match_phrase": {
"about": "rock climbing"
}
}
}

短语搜索


11. 聚合搜索

查找所有职员中 最大的共同点(兴趣爱好)是什么…

5.x后对排序,聚合这些操作用单独的数据结构(fielddata)缓存到内存里了,需要单独开启

在执行聚合之前,要先执行,下面的内容

1
2
3
4
5
6
7
8
9
PUT /megacorp/_mapping/employee/
{
"properties":{
"interests":{
"type":"text",
"fielddata":true
}
}
}

然后执行聚合搜索

1
2
3
4
5
6
7
8
9
10
GET megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": {
"field": "interests"
}
}
}
}

聚合搜索-1

忽略其他的,看interests中的内容;查询结果将所有员工的interests都输出了。


11.1. 查找所有姓氏为"smith"的人,兴趣爱好最多的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET /megacorp/employee/_search
{
"query": {
"match": {
"last_name": "smith"
}
},
"aggs": {
"all_interests": {
"terms": {
"field": "interests"
}
}
}
}

输出结果:

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
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
...
},
"hits": {
"total": 2,
"max_score": 0.9808292,
"hits": [
{
...
"_score": 0.9808292,
"_source": {
"first_name": "Jane",
"last_name": "Smith",
"age": 32,
"about": "I like to collect rock albums",
"interests": [
"music"
]
}
},
{
...
"_id": "1",
"_score": 0.6931472,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
}
]
},
"aggregations": {
"all_interests": {
...
"buckets": [
{
"key": "music",
"doc_count": 2
},
{
"key": "sports",
"doc_count": 1
}
]
}
}
}

all_interests中已经将信息聚合了


11.2. 统计每种兴趣下,职员的平均年龄

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": {
"field": "interests"
},
"aggs": {
"avg_age": {
"avg": {
"field": "age"
}
}
}
}
}
}

返回结果有些复杂,比较长,直接贴下面比较重要的:

聚合搜索-2

结果很好理解,该聚合结果比之前的聚合结果要更加丰富;

我们得到了兴趣以及员工数量以及平均年龄

12. Reference

  • 《Elasticsearch 权威指南(中文版)》