我的数据如下所示:
[
{
"name": "Scott",
"origin": "London",
"travel": [
{
"active": false,
"city": "Berlin",
"visited": "2020-02-01"
},
{
"active": true,
"city": "Prague",
"visited": "2020-02-15"
}
]
},
{
"name": "Lilly",
"origin": "London",
"travel": [
{
"active": true,
"city": "Scotland",
"visited": "2020-02-01"
}
]
}
]
我想执行一个聚合,其中每个顶级起点都是一个bucket,然后执行一个嵌套聚合,以查看当前访问每个城市的人数,因此我只关心 * 如果 * active
是true
,则城市是什么。
使用一个过滤器,它将搜索visited
数组,并返回完整的数组(两个对象),如果其中一个将active
设置为true,我不想包括active
为false的城市。
预期输出:
{
"aggregations": {
"origin": {
"buckets": [
{
"key": "London",
"buckets": [
{
"key": "travel",
"doc_count": 2555,
"buckets": [
{
"key": "Scotland",
"doc_count": 1
},
{
"key": "Prague",
"doc_count": 1
}
]
}
]
}
]
}
}
}
在上面,我只有2个travel聚合下的计数,因为只有两个travel对象的active设置为true。
目前,我的聚合设置如下:
{
"from": 0,
"aggs": {
"origin": {
"terms": {
"field": "origin"
},
"aggs": {
"travel": {
"filter": {
"term": {
"travel.active": true
}
},
"aggs": {
"city": {
"terms": {
"field": "city"
}
}
}
}
}
}
}
}
我在origin
上有一个顶级聚合,然后在travel
数组上有一个嵌套的聚合,这里我在travel.active = true
上有一个过滤器,然后有另一个嵌套的聚合为每个城市创建bucket。
在我的聚合中,它仍然产生Berlin
作为一个城市,即使我过滤了active = true。
我的猜测是因为它允许它,因为active: true
对于数组中的一个对象为真。
如何从聚合中完全过滤掉active: false
?
2条答案
按热度按时间3df52oht1#
您必须使用**“嵌套聚合"。**参考的官方文档链接
以下是查询的示例:
Map:
插入:
查询:
输出:
4dbbbstv2#
@karthick的建议很好,但是我在查询中添加了过滤器,这样你在聚合阶段的值会更少。