【问题标题】:Spring data elasticsearch Filter aggregationsSpring数据elasticsearch过滤聚合
【发布时间】:2021-04-22 18:37:48
【问题描述】:

我有以下 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:4.0.3.RELEASE
  • Elasticsearch 客户端:7.6.2

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

【问题讨论】:

    标签: elasticsearch spring-data spring-data-elasticsearch elasticsearch-aggregation


    【解决方案1】:

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

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

    withFilter 有另一个用途,即它是一个post_filter

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

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

    【讨论】:

    • 没错!有用。感谢您的建议,我现在了解每个查询之间的区别。
    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2015-09-17
    • 2014-02-02
    • 2019-03-03
    • 2019-11-10
    • 2018-01-30
    • 2014-12-31
    相关资源
    最近更新 更多