当前位置:  开发笔记 > 前端 > 正文

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

如何解决《将聚合限制为过滤器的结果》经验,为你挑选了2个好方法。

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

我尝试使用以下查询的术语聚合来做到这一点:

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

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

我究竟做错了什么?



1> Mihai Ionesc..:

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

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


但是[文档](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filters.html)建议使用过滤器而不是查询来按精确值过滤?另一个问题:如何应用多个条件?过滤器提供[`和`](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-and-filter.html),没有找到查询...
@VitorM是的,聚合总是在查询范围内运行(默认情况下使用`match_all`).不,你不应该停止使用聚合过滤器.有一个[过滤查询](http://www.elastic.co/guide/en/elasticsearch/reference/1.5/query-dsl-filtered-query.html)通过性能和缓存过滤器来缩小范围,然后是a [过滤器聚合](http://www.elastic.co/guide/en/elasticsearch/reference/1.5/search-aggregations-bucket-filter-aggregation.html)过滤其子分段的聚合桶.将这两者结合起来可以实现真正强大的过滤.

2> Mehmet K..:

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

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

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

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有