我试图通过产品编号查询我在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;
}
答案 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
个查询。所以你可能也需要修复它,但上面的代码只修复了聚合部分。