0%

ElasticSearch-结构化搜索

日期、布尔类型和数字都是结构化数据,文本也可以是结构化的,比如彩色笔可以有离散的颜色集合:红(red)、绿(green)、蓝(blue)。或者如一个博客标记的标签,如分布式(distributed)和搜索(search)等。

结构化搜索(Structured search)是指对结构化数据的搜索。布尔、时间、日期和数字这类结构化数据有精确的格式,我们可以对这些格式进行逻辑操作。包括比较数字或时间的范围以及判定两个值的大小等。而对于结构化文本可以做精确匹配或者部分匹配,比如采用 Term 查询或者 Prefix 前缀查询。

下面进行举例介绍下结构化数据的查询,先批量存入示例文档:

1
2
3
4
5
6
7
8
9
POST /products/_bulk
{ "index": { "_id": 1 }}
{ "price" : 10,"avaliable":true,"date":"2018-01-01", "productID" : "XHDK-A-1293-#fJ3" }
{ "index": { "_id": 2 }}
{ "price" : 20,"avaliable":true,"date":"2019-01-01", "productID" : "KDKE-B-9947-#kL5" }
{ "index": { "_id": 3 }}
{ "price" : 30,"avaliable":true, "productID" : "JODL-X-1937-#pV7" }
{ "index": { "_id": 4 }}
{ "price" : 30,"avaliable":false, "productID" : "QQPX-R-3956-#aD8" }
  • 布尔值

下面通过布尔值字段检索匹配的文档,这里检索的值既可以是 true 或者是文本 "true",检索数值类型字段时同理:

1
2
3
4
5
6
7
8
POST products/_search
{
"query": {
"term": {
"avaliable": true
}
}
}
  • 数字 Range

ES 支持通过对数字进行范围查询,比如查询价格大于等于 20 且小于等于 30 的数据,示例如下:

1
2
3
4
5
6
7
8
9
10
11
GET products/_search
{
"query" : {
"range" : {
"price" : {
"gte" : 20,
"lte" : 30
}
}
}
}

其中 gt(大于)、lt(小于)、get(大于等于)、lte(小于等于)。

  • 日期 Range

可以对日期进行范围查询,例如查询大于等于一年前的数据,示例如下:

1
2
3
4
5
6
7
8
9
10
11

POST products/_search
{
"query" : {
"range" : {
"date" : {
"gte" : "now-1y"
}
}
}
}

日期表示规则如下图示:

日期规则

  • 处理空值

另外,也可以查询文档中某个字段值是否为空或者不存在该字段,如下分别是检索 ES 中存在 date 字段且值不为 null 和不存在 date 字段或者值为 null 的文档:

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
// 检索出索引中存在 date 字段且值不为 null 的文档
POST products/_search
{
"query": {
"constant_score": {
"filter": {
"exists": {
"field": "date"
}
}
}
}
}
// 检索出索引中不存在 date 字段或值为 null 的文档
POST products/_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "date"
}
}
}
}
}
  • 包含而不是相等

需要说明的是,通过如下的 term 查询,仅是查询字段 genre 中包含文本 "Comedy" 的文档,而不是等于"Comedy" 的文档,具体如下:

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
POST movies/_search
{
"query": {
"term": {
"genre.keyword": "Comedy"
}
}
}
// 响应
[
{
"_id": "1",
"_index": "movies",
"_score": 1.2356555,
"_source": {
"@version": "1",
"genre": [
"Adventure",
"Animation",
"Children",
"Comedy",
"Fantasy"
],
"id": "1",
"title": "Toy Story",
"year": 1995
},
"_type": "_doc"
},
{
"_id": "5",
"_index": "movies",
"_score": 1.2356555,
"_source": {
"@version": "1",
"genre": [
"Comedy"
],
"id": "5",
"title": "Father of the Bride Part II",
"year": 1995
},
"_type": "_doc"
}
]
------ 本文结束------