我要实现的目标:我不希望查询过滤器过滤“年龄”聚合,并且希望能够对其应用过滤器。
因此,如果我从以下查询开始:
{ "query":{ "filtered":{ "filter":{ "terms":{ "family_name":"Brown" } } //filter_1 } }, "aggs":{ "young_age":{ "filter":{ "range":{ "lt":40, "gt":18 } //filter_2 }, "aggs":{ "age":{ "terms":{ "field":"age" } } } } } }
我的聚合“ young_age”将同时被filter_1和filter_2过滤。我不希望我的汇总被filter_1过滤。
在查看文档时,我认为全局聚合可以解决我的问题,因此我编写了以下查询:
{ "query":{ "filtered":{ "filter":{ "terms":{ "family_name":"Brown" } } //filter_1 } }, "aggs":{ "young_age":{ "global":{}, //<----------- add global "filter":{ "range":{ "lt":40, "gt":18 } //filter_2 }, "aggs":{ "age":{ "terms":{ "field":"age" } } } } } }
但是然后elasticsearch抱怨我的filter_2:
“”“在[global]和[filter]中找到了两个聚合类型定义[age]
当然,如果我删除filter_2:
{ "query":{ "filtered":{ "filter":{ "terms":{ "family_name":"Brown" } } } }, "aggs":{ "young_age":{ "global":{}, "aggs":{ "age":{ "terms":{ "field":"age" } } } } } }
然后,我的聚合不会被filter_1过滤(如预期的那样)。
那么我应该如何将filter_2应用于全局聚合?或者我应该如何实现?我记得用facet过滤器写过类似的东西…
我认为这是post_filter的典型用例。正如文档所说:
在已经计算出聚合之后,post_filter会在搜索请求的最后应用于搜索匹配
您的查询将如下所示:
{ "post_filter":{ "terms":{ "family_name":"Brown" //filter_1 } }, "aggs":{ "young_age":{ "filter":{ "range":{ "lt":40, "gt":18 } //filter_2 }, "aggs":{ "age":{ "terms":{ "field":"age" } } } } } }
在这种情况下,搜索结果是索引中的所有文档。然后计算聚合(在filter_1之前)。然后post_filter执行filter_1。
post_filter
编辑:正如您在表彰中所说,您有很多聚合,而且只有一个不受此影响,filter_1我使用全局聚合修复了查询
filter_1
{ "query": { "filtered": { "filter": { "term": { "family_name": "Brown" } } } }, "aggs": { "young_age": { "global": {}, "aggs": { "filter2": { "filter": { "range": { "lt": 40, "gt": 18 } }, "aggs": { "age": { "terms": { "field": "age" } } } } } } } }