如何筛选ElasticSearch全局聚合?

6jjcrrmo  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(2)|浏览(218)

我想实现的目标:我希望我的“年龄”聚合不被查询筛选器筛选,并且我希望能够对它应用筛选器。
所以如果我从这个查询开始:

{
    "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应用到我的全局聚合中呢?或者我应该如何实现这一点呢?我记得我写了一些类似的方面过滤器...

9o685dep

9o685dep1#

在我看来,这是一个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"
              }
            }
          }
        }
      }
    }
  }
}
4nkexdtk

4nkexdtk2#

不允许全局和筛选器位于同一级别您必须将筛选器置于全局聚合内一个级别
这样东西应该适合你

{
    "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"
                        }
                    }
                }
            }
        }
    }
}

相关问题