我认为用查询解释会更容易。考虑一下我的问题:
GET _search
{
"aggs": {
"group_by_app": {
"terms": {
"field": "application"
}
},
"aggs": {
"installs": {
"filter": {
"fquery": {
"query": {
"match": {
"action": "install"
}
},
"_cache": true
}
}
},
"launches": {
"filter": {
"fquery": {
"query": {
"match": {
"action": "launch"
}
},
"_cache": true
}
}
}
}
}
}
这会返回以下结果:
"aggregations": {
"apps": {
"buckets": [
{
"key": "app1",
"doc_count": 2313,
"launches": {
"doc_count": 0
},
"installs": {
"doc_count": 48
}
},
{
"key": "app2",
"doc_count": 5,
"launches": {
"doc_count": 0
},
"installs": {
"doc_count": 0
}
},
]
}
}
现在,如果您注意到,app2的安装和启动均为0。如果两个子聚合都启动并且安装都为0,我不希望将key =“app2”的桶显示在结果中。
我看到了min_doc_count并想知道是否有可能为我的案件做类似的事情?
[编辑]:我认为我可以尝试的另一件事是,而不是为每个可能的“动作”进行聚合“group_by_app”,如果我可以仅通过“action”=“install”或“action”聚合它“=”发射“。所以基本上我的意思是桶聚合仅在“action”=“launch”或“install”之上,并且子聚合在查询中基本相同。我可以在桶聚合上执行min_doc_count以不显示子聚合结果。但是,聚合仅允许术语/术语或过滤器,而不是两者。如果有人可以提出另一种方法来实现这一点,即使这将是一个很大的帮助!
答案 0 :(得分:1)
我意识到这并不困难。我可以使用" query"而不是尝试在聚合中过滤。限制我聚合的文件。因此,不是聚合所有"应用程序"的所有文档。每一个"动作",只聚合所有" aplication"的文件。只有两个"动作",即"动作" ="安装"或"行动" ="启动",然后在桶聚合上执行min_doc_count = 1将不会显示" application"如果两者都安装"安装"和"发布"子聚合为0。
这是完整的查询:
GET _search
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"fquery": {
"query": {
"match": {
"action": "install OR launch"
}
},
"_cache": true
}
}
]
}
}
}
},
"aggs": {
"group_by_app": {
"terms": {
"field": "application"
}
},
"aggs": {
"installs": {
"filter": {
"fquery": {
"query": {
"match": {
"action": "install"
}
},
"_cache": true
}
}
},
"launches": {
"filter": {
"fquery": {
"query": {
"match": {
"action": "launch"
}
},
"_cache": true
}
}
}
}
}
}