Spring 数据 elasticsearch 过滤聚合

Spring data elasticsearch Filter aggregations

我有以下 JSON 查询正在运行并且正在执行我想要的操作:

{
  "aggs": {
    "values": {
      "filter": { "term": { "gender": "Male" } },
      "aggs" : {
        "names" : {
            "terms" : { "field" : "name", "size":10000 }
        }
    }
    }
  },
  "size":0
  }

它正在检索“gener”字段等于“Male”的所有不同名称。它是elasticseach中filter aggregation的一个例子。

我现在正在尝试用 spring-data-elasticsearch 编写它,我试过这个:

    AbstractAggregationBuilder<TermsAggregationBuilder> agBuilder = AggregationBuilders.terms("name").field("name").size(10000);

    Query query = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.matchAllQuery())
        .withFilter(QueryBuilders.termQuery("gender", "Male"))
        .withPageable(EmptyPage.INSTANCE)
        .addAggregation(agBuilder).build();

    //Execute request over the cluster
    SearchHits<Person> hits = elasticClient.search(query, Person.class);

    //Retrieve the aggregation details
    Aggregations aggs = hits.getAggregations();
    ParsedStringTerms topTags = (ParsedStringTerms) aggs.get("name");

请注意,EmptyPage.INSTANCE 与 PageRequest.of(0,0) 相同,是实现该目的的自定义 Impl。

不幸的是,它没有按照我的意愿行事,因为它忽略了 filter 子句,它返回了男性和女性的名字。 我怀疑 withQuery 应该包含另一个 Query 但我不知道如何将另一个 NativeSearchQuery 传递给该方法。

我使用的版本:

如何使用 spring-data-elasticsearch 编写上述 json 查询? 提前致谢。

过滤器实际上需要在 withQuery() 内。

Query query = new NativeSearchQueryBuilder()
    .withQuery(QueryBuilders.termQuery("gender", "Male"))
    ...

withFilter 有另一个用途,即 post_filter.

另请注意,您正在构建的查询与问题顶部指定的查询略有不同,它看起来像下面的查询,实际上是一个更优化的版本,因为您正在过滤文档 before 进行聚合,而不是对所有文档进行聚合,只考虑与过滤器匹配的文档。最终结果是一样的,但是性能却不一样。

{
  "size": 0,
  "query": {
    "term": {
      "gender": "Male"
    }
  },
  "aggs": {
    "names": {
      "terms": {
        "field": "name",
        "size": 10000
      }
    }
  }
}