忽略聚合中查询的“匹配”子句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了忽略聚合中查询的“匹配”子句相关的知识,希望对你有一定的参考价值。
我有一个聚合查询。其中一个聚合在starsCount
领域。有一个查询子句可以过滤starsCount
字段以及其他匹配子句(为清晰起见,隐藏)。
我希望starsCount
聚合忽略其结果中的starsCount
过滤(聚合的结果应该好像我在starsCount
字段上没有匹配子句的情况下运行相同的查询)而另一个聚合保持其当前行为
这可以在一个查询中完成,还是应该使用多个?
这是(简化)查询:
{
[...]
"aggs": {
"group_by_service": {
"comment": "keep current behaviour",
"terms": {
"field": "services",
"size": 46
}
},
"group_by_stars": {
"comment": "ignore the filter on the starsCount field",
"terms": {
"field": "starsCount",
"size": 100
}
}
},
"query": {
"bool": {
"must": [
[...] filters on other properties, non-relevant
{
"match": {
"starsCount": {
"query": "2"
}
}
}
]
}
}
}
答案
是的,您可以通过使用post filter和filter aggregation在单个查询中实现此目的。您需要按照以下步骤创建查询:
- 从主查询中删除
starsCount
匹配查询,因为它不应影响group_by_stars
聚合。 - 由于
starsCount
匹配查询应该过滤文档,将其移动到post_filter
。 post_filter中的任何查询都会在计算聚合后过滤文档。 - 现在因为
starsCount
不再是主要查询的一部分,所以所有聚合都不会受到它的影响。但是需要的是这个过滤器应该影响除group_by_stars
聚合之外的所有其他聚合。为实现此目的,我们将使用过滤器聚合并将其应用于除group_by_stars
聚合之外的所有聚合。
结果查询如下。 (请注意,我使用match
查询而不是term
查询。您仍然可以使用匹配,但在这种情况下,术语是更好的选择。):
{
"aggs": {
"some_other_agg":{
"filter": {
"term": {
"starsCount": "2"
}
},
"aggs": {
"some_other_agg_filtered": {
"terms": {
"field": "some_other_field"
}
}
}
},
"group_by_service": {
"filter": {
"term": {
"starsCount": "2"
}
},
"aggs": {
"group_by_service_filtered": {
"terms": {
"field": "services",
"size": 46
}
}
}
},
"group_by_stars": {
"terms": {
"field": "starsCount",
"size": 100
}
}
},
"query": {
"bool": {
"must": [
{...} //filter on other properties
]
}
},
"post_filter": {
"term": {
"starsCount": "2"
}
}
}
以上是关于忽略聚合中查询的“匹配”子句的主要内容,如果未能解决你的问题,请参考以下文章