ES嵌套查询与退出嵌套

挺久没更新博客了,随手更新一篇吧,最新在使用ES时遇到的一个小问题,记录一下。

业务上有种场景需要对数据进行多条件的查询,数据结构大体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"batch": 1111,
"status": 100,
"stages": [
{
"id": 123,
"waybill": {
"companyId": 123,
"companyProduct": 321
}
}
]
}

在es中索引信息大体如下:

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
{
"mappings": {
"properties": {
"batch": {
"type": "long"
},
"stages": {
"type": "nested",
"properties": {
"id": {
"type": "long"
},
"waybill": {
"properties": {
"companyId": {
"type": "integer"
},
"companyProduct": {
"type": "integer"
}
}
}
}
}
}
}
}

现在需要先按照 batch 字段做聚合,再根据stages下waybill的companyId和companyProduct做聚合,最后再根据status做聚合。

前面条件很容易能想到再aggs里这样写:

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
{
"aggs": {
"batch": {
"terms": {
"field": "batch"
},
"aggs": {
"stages": {
"nested": {
"path": "stages"
},
"aggs": {
"companyId": {
"terms": {
"field": "stages.waybill.companyId"
},
"aggs": {
"companyProduct": {
"terms": {
"field": "stages.waybill.companyProduct"
}
}
}
}
}
}
}
}
}
}

而最后一个条件status字段又是在这个对象结构的根属性,如果继续在上面的json中companyProduct下添加子aggs,那么将查不到结果。

原因是在使用nested进行嵌套聚合时,后续的查询都在这个桶中,如果需要再对不属于当前嵌套的字段进行聚合时,需要先跳出这个桶,即退出嵌套:reverse_nested。

最终可以这样实现:

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
{
"aggs": {
"batch": {
"terms": {
"field": "batch"
},
"aggs": {
"stages": {
"nested": {
"path": "stages"
},
"aggs": {
"companyId": {
"terms": {
"field": "stages.waybill.companyId"
},
"aggs": {
"companyProduct": {
"terms": {
"field": "stages.waybill.companyProduct"
},
"aggs": {
"rev": {
"reverse_nested": {}, // 退出嵌套
"aggs": {
"status": {
"terms": {
"field": "status"
}
}
}
}
}
}
}
}
}
}
}
}
}
}
秋月 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
随缘打赏,您的支持将鼓励我继续创作!