将聚合限制为过滤器的结果

时间:2014-04-02 16:02:28

标签: filter elasticsearch aggregation

给定一组在一个字段中具有给定值的文档,我想知道有多少文档具有第二个字段的每个值。

我尝试使用以下查询进行术语聚合:

{
    "size": 0,
    "filter": {
        "term": {
            "field1": "value"
        }
    },
    "aggregations": {
        "field2" : {
            "terms" : { "field" : "field2" }
        }
    }
}

但返回的计数显示整个索引中第二个字段的每个值的文档数,而不限于第一个字段具有给定值的文档。

我做错了什么?

2 个答案:

答案 0 :(得分:27)

您是否尝试过使用过滤查询?

{
    "query": {
        "filtered": {
           "query": {
                "match_all": {}
           },
           "filter": {
               "term": {
                  "field1": "value"
               }
           }
        }
    },
    "aggregations": {
        "field2": {
           "terms": { "field": "field2" }
        }
    }
}

答案 1 :(得分:8)

这里有一个比较: https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html

简而言之,您的顶级过滤器就像链接中的post_filter一样。要过滤,然后计算聚合,您需要使用查询。

如果您因为查询中得分的计算而担心性能下降,您可以查看基本上是过滤器包装查询的常量得分查询。