Elasticsearch 5.3:手动聚合查询转AggregationBuilder实现求助
解决Elasticsearch 5.3中AggregationBuilder构建嵌套聚合的结构问题
我来帮你搞定这个问题!你的手动查询结构是完全正确的,但用AggregationBuilder时把嵌套层级搞反了——你现在的代码把nested查询放到了filter内部,而正确的逻辑应该是nested聚合作为外层容器,内部依次嵌套filter聚合和terms聚合。
问题根源分析
先看你手动查询的核心层级结构:
{ "aggs": { "data": { "nested": { "path": "data" }, "aggs": { "my_filters": { "filter": {...}, "aggs": { "my_agg_field": { "terms": {...} } } } } } } }
而你的代码生成的查询把nested作为filter的子查询,完全打乱了层级关系,这就是聚合桶为空的原因。
正确的AggregationBuilder实现
下面是和你手动查询1:1匹配的Java代码:
// 先构建filter需要的查询条件:匹配data.genre为sci-fi的term查询 BoolQueryBuilder filterQuery = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery("data.genre", "sci-fi")); // 严格按照手动查询的层级构建聚合 AggregationBuilder aggregation = AggregationBuilders // 外层nested聚合,对应手动查询的"data"聚合 .nested("data", "data") // nested聚合的子聚合:filter聚合,对应手动查询的"my_filters" .subAggregation(AggregationBuilders.filter("my_filters", filterQuery) // filter聚合的子聚合:terms聚合,对应手动查询的"my_agg_field" .subAggregation(AggregationBuilders.terms("my_agg_field") .field("data.director.keyword")));
验证生成的查询结构
这段代码生成的JSON查询会和你手动编写的完全一致:
{ "size": 0, "aggs": { "data": { "nested": { "path": "data" }, "aggs": { "my_filters": { "filter": { "bool": { "must": [{ "term": { "data.genre": "sci-fi" } }] } }, "aggs": { "my_agg_field": { "terms": { "field": "data.director.keyword" } } } } } } } }
这样就能得到和手动查询完全相同的聚合结果了。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

