忽略聚合中查询的“匹配”子句

问题描述 投票:0回答:1

我有一个聚合查询。其中一个聚合在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"
                        }
                    }
                }
            ]
        }
    }
}
elasticsearch
1个回答
1
投票

是的,您可以通过使用post filterfilter aggregation在单个查询中实现此目的。您需要按照以下步骤创建查询:

  1. 从主查询中删除starsCount匹配查询,因为它不应影响group_by_stars聚合。
  2. 由于starsCount匹配查询应该过滤文档,将其移动到post_filter。 post_filter中的任何查询都会在计算聚合后过滤文档。
  3. 现在因为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"
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.