spring - Spring Elasticsearch聚合过滤不起作用

标签 spring elasticsearch

我正在尝试按产品编号查询我在Elasticsearch数据库中记录的产品的定价统计信息。定价可能针对新产品,二手产品或翻新产品,因此我希望根据情况进行过滤。条件筛选器在Marvel中用作JSON查询,基于两个条件为new的价格文档返回统计信息。

当我尝试使用Java API执行类似操作时,我会根据4个文档(包括2个新版和2个翻新版)获得统计信息。

任何人都可以在下面的Java代码中确定我做错了什么吗?

谢谢。

这是有效的JSON查询:

GET /stats/price/_search
{
  "query": {
  "match_phrase": {"mpc": "MGTX2LL/A"}
  },
  "size": 0,
  "aggs" : {
      "low_price_stats" : { 
      "filter": {
          "term" : { "condition" : "new"}
      },
      "aggs" : {
          "price_stats" : { "extended_stats" : { "field" : "price" } }
      }
    }
  }
}

还有问题的Java:
public Aggregations aggByManufacturerPartNumber(String mpn) {

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withIndices("stats")
        .withTypes("price")
        .withQuery(termQuery("mpn", mpn))
        .withFilter(
            FilterBuilders.termFilter("condition", "New")
        )
        .addAggregation(AggregationBuilders.extendedStats("stats_agg").field("price"))
        .build();

    Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
        @Override
        public Aggregations extract(SearchResponse response) {
            return response.getAggregations();
        }
    });

    return aggregations;
}

最佳答案

在您的Java代码中,您仅构建price_stats子聚合而没有其父filter聚合。调用withFilter将在查询级别(而不是聚合级别)创建过滤器。与您的JSON查询匹配的正确Java代码如下所示:

// build top-level filter aggregation
FilterAggregationBuilder lowPriceStatsAgg = AggregationBuilders.filter("low_price_stats")
    .filter(FilterBuilders.termFilter("condition", "new"));

// build extended stats sub-aggregation
lowPriceStatsAgg.subAggregation(AggregationBuilders.extendedStats("stats_agg").field("price"));

// build query
SearchQuery searchQuery = new NativeSearchQueryBuilder()
    .withIndices("stats")
    .withTypes("price")
    .withQuery(termQuery("mpn", mpn))
    .addAggregation(lowPriceStatsAgg)
    .build();

// then get the results
Aggregations aggs = response.getAggregations();
Filter lowPriceStats = aggs.get("low_price_stats");
ExtendedStats statsAgg = lowPriceStats.get("stats_agg");

此外,还请注意,在JSON查询中,您在match_phrase字段上有一个mpc,而在Java代码中,您在term字段中有一个mpn查询。因此,您可能也需要修复此问题,但是以上代码仅修复了聚合部分。

关于spring - Spring Elasticsearch聚合过滤不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33193856/

相关文章:

java - Camel JMS : how to configure custom message listener when connecting to a topic

java - 使用 sa 帐户但不使用其他帐户的代码

spring - Camel动态构建处理器bean调用

c# - 列表项上的ElasticSearch聚合

elasticsearch - 是否可以使用 org.springframework.data.elasticsearch.core.ReactiveElasticsearchTemplate 删除索引?

elasticsearch - 在Elasticsearch中具有完全匹配的 bool AND

java - 是否有更好的方法来减少长时间运行的 quartz 作业的执行时间?

java - 在 Spring 框架中使用 registerShutdownHook()

elasticsearch - 为什么在Elasticsearch中,关键字类型比文本占用更多的空间?

elasticsearch - 查询一个字段不等于 elasticsearch 中的另一个字段