Elastic Search:聚合查询中包含和过滤之间的区别

Ron*_*wal 2 elasticsearch

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

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

{
"aggs" : {
    "data" : {
        "filter" : { "term": { "gender": "male" } },
        "aggs" : {
            "data_aggs" : { 
                "terms" : { 
                    "field" : "gender"
                } 
            }
        }
    }
}}
Run Code Online (Sandbox Code Playgroud)

{
"aggs" :{
    "data" : {
        "terms" :{
            "field" :"gender",
            "include" : "male"
        }
    }
}}
Run Code Online (Sandbox Code Playgroud)

Val*_*Val 5

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

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

在第一种情况下,聚合是在运行之前对数据进行预过滤。在第二种情况下,聚合正在动态过滤数据,但它将适用于所有文档,因为它必须检索所有文档中的字段才能知道性别值是否需要聚合。不言而喻,第一个聚合应该比第二个聚合更高效,特别是当您的文档库很大时。gender