2015-10-18 42 views
1

我试图通过产品编号查询我在Elasticsearch数据库中记录的产品的定价统计信息。定价可能是新的,二手或翻新产品,所以我希望过滤条件。条件过滤器在Marvel基于两个具有新条件的价格文档返回统计信息时用作JSON查询。Spring Elasticsearch Aggregation Filtering Not Working

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

在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查询您的mpc领域有match_phrase,而在Java代码中你对一个term查询mpn字段。所以你可能也需要解决这个问题,但上面的代码只修复了聚合部分。

+0

好的,谢谢!我快到了。子聚合看起来是lowPriceStatsAgg.subAggregation(...)。查询和提取器后,我得到一个空值。因为它是一个子集合,我需要制作一个不同的ResultExtractor吗? –