我想要实现的目标:我想要我的"年龄"聚合不被查询过滤器过滤,我希望能够对其应用过滤器。
所以如果我从这个查询开始:
{
"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"
}
}
}
}
}
}
然后弹性搜索抱怨我的filter_2:
&#34;&#34;&#34; 在[global]和[filter]中找到两个聚合类型定义[age] &#34;&#34;&#34;
当然,如果我删除了filter_2:
{
"query":{
"filtered":{
"filter":{
"terms":{
"family_name":"Brown"
}
}
}
},
"aggs":{
"young_age":{
"global":{},
"aggs":{
"age":{
"terms":{
"field":"age"
}
}
}
}
}
}
然后我的聚合不会被filter_1过滤(正如预期的那样)。
那么我想如何将filter_2应用于我的全局聚合?或者我该如何实现呢?我记得用facet过滤器写了类似的东西......
答案 0 :(得分:3)
在我看来,这是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之前)。然后,将执行带有filter_1的post_filter
。
编辑:正如您在推荐中所述,您有许多聚合,只有一个不应受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"
}
}
}
}
}
}
}
}
答案 1 :(得分:0)
不允许在同一级别使用全局变量和过滤器。你必须将过滤器放在一个内部的全局聚合中。
这样的事情应该适合你。
{
"query":{
"filtered":{
"filter":{
"terms":{
"family_name":"Brown"
}
}
}
},
"aggs":{
"young_age":{
"global":{},
"aggs":{
"filter": {"term": {"family_name": "Brown"}}, #or {"bool": {"filter": {"term": {"family_name": "Brown"}}}}
"aggs": {
"age":{
"terms":{
"field":"age"
}
}
}
}
}
}
}