弹性搜索:包含& amp;过滤聚合查询

时间:2015-08-09 18:05:37

标签: elasticsearch

我的性别数据包含男性,女性,未知

我想知道以下查询之间的区别。如何计算

{
"aggs" : {
    "data" : {
        "filter" : { "term": { "gender": "male" } },
        "aggs" : {
            "data_aggs" : { 
                "terms" : { 
                    "field" : "gender"
                } 
            }
        }
    }
}}

并且

{
"aggs" :{
    "data" : {
        "terms" :{
            "field" :"gender",
            "include" : "male"
        }
    }
}}

1 个答案:

答案 0 :(得分:4)

在您的第一个聚合中,过滤器将仅选择gender字段正好为male的文档子集。然后,您的data聚合将在所选文档上 运行。

您的第二个聚合将在所有您的查询匹配的文档上运行,然后terms聚合将仅返回其键匹配male的存储桶。

在第一种情况下,聚合预先过滤 运行之前的数据。在第二种情况下,聚合正在过滤数据即时,但它将适用于所有文档,因为它必须检索所有文档中的gender字段以了解是否性别价值需要汇总与否。毫无疑问,第一个聚合应该比第二个聚合更高效,特别是如果你的文档库很大。