Elasticsearch使用指南--查询

elasticsearch是什么

elasticsearch,简称es,是一个开源的搜索引擎,es的作用非常强大,普通的从数据库读取数据的方式已经不能满足我们形形色色的搜索要求,es就可以。就比如我们想要在茫茫人海中找到那些身高一米八、年龄在30岁到35岁之间、喜欢狗不喜欢猫的程序员,es不仅能满足所有的需求,而且能快速的帮你找到。
在使用es之前,建议先看看极客学院的es权威指南

es使用环境

在使用es之前,要在服务器端搭建一个es的集群,因为我是做前端的,所以具体怎么搭建集群我不是很懂,然后把我们需要的数据库的数据导到es环境里就可以用了。我们前端大都是构建es的DSL查询语句,去查询我们需要的东西。

查询

查询全部

1
2
3
4
5
{
"query":{
"match_all":{}
}
}

查询名字中有小明的

1
2
3
4
5
6
7
{
"query":{
"match":{
"name":"小明"
}
}
}

查询名字中有完整“小明”的,match是模糊匹配,他会对关键词进行分词查询

1
2
3
4
5
6
7
{
"query": {
"match_phrase": {
"name": "小明"
}
}
}

查询名字是“小明”,年龄“10”岁的 ··· ···

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"name": "小明"
}
},
{
"match_phrase": {
"age": "10"
}
}
]
}
}
}

从第一条数据开始查询5条数据

1
2
3
4
5
6
7
8
9
{
"from":0,
"size":5,
"query": {
"match_phrase": {
"name": "小明"
}
}
}

使查询结果的关键词即“小明”高亮的技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"from":0,
"size":5,
"query": {
"match_phrase": {
"name": "小明"
}
},
"highlight": {
"pre_tags": [
"<font color=red><b>"
],
"post_tags": [
"</b></font>"
],
"fields": [
{
"name": {}
}
]
}
}

对小明的查询结果排序,默认是针对匹配分数”_score”排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"from":0,
"size":5,
"query": {
"match_phrase": {
"name": "小明"
}
},
"sort": {
"_score": {
"order": "desc"
},
"time": {
"order": "desc"
}
}
}

对小明的查询结果聚类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"from":0,
"size":5,
"query": {
"match_phrase": {
"name": "小明"
}
},
"aggs": {
"type": {
"terms": {
"field": "_type"
}
}
}
}

查询出生日期在2000年到2005年之间的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"from": 0,
"size": "10",
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"range": {
"time_pub": {
"gte": "2000-01-01",
"lte": "2005-12-31"
}
}
}
}
}
}

将上面的所有功能结合起来就可以完成查询多个段的关键词,高亮显示,排序,聚类,范围的复合查询

查询结果的遍历

假设我们在这里构建了一条复杂的查询语句

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
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"name": "小明"
}
}
]
}
},
"highlight": {
"pre_tags": [
"<font color=red><b>"
],
"post_tags": [
"</b></font>"
],
"fields": [
{
"name": {}
}
]
},
"sort": {
"_score": {
"order": "desc"
},
"time_pub": {
"order": "desc"
}
},
"size": "5",
"from": 0,
"aggs": {
"type": {
"terms": {
"field": "_type"
}
}
}
}

我们查出了所有name字段中的小明的结果,并做了高亮显示,按照类型聚类查询结果

结果的结构是这样的,”hits”是查询的结果,”total”是结果的总条目,”aggregations”是聚类的结果

这里写图片描述

“hits”结果部分,”highlight”就是高亮显示了的字段,”sort”是排序的分值

这里写图片描述

“aggregations”聚类部分,”buckets”是聚类结果,关联数组的形式

这里写图片描述

只要清楚了它的结构,遍历是很简单的。