Spring Elasticsearch聚合过滤不起作用

时间:2015-10-18 03:00:55

标签: spring elasticsearch

我试图通过产品编号查询我在Elasticsearch数据库中记录的产品的定价统计信息。定价可能适用于新产品,二手产品或翻新产品,因此我希望按条件进行过滤。条件过滤器在Marvel基于具有条件new的两个价格文档返回统计数据时用作JSON查询。

当我尝试使用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;
}

1 个答案:

答案 0 :(得分:1)

在您的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个查询。所以你可能也需要修复它,但上面的代码只修复了聚合部分。