Elasticsearch聚合构建如何正确添加Nested嵌套聚合块
问题解答
1. 当前创建nested聚合的代码正确性判断
你写的创建代码是错误的。AggregationBuilders.nested() 方法的参数顺序为:第一个参数传入聚合的自定义名称,第二个参数传入nested类型字段的映射路径。你当前代码把两个参数顺序写反了,生成的聚合名称为path、绑定路径为names,和预期结构完全不符。
2. 组装目标聚合结构的实现方案
你需要的DSL结构中,main_aggregation本身就是nested类型的聚合,不需要额外创建外层聚合包装,直接按正确参数初始化nested聚合、添加子聚合后挂载到搜索请求即可,完整实现步骤如下:
- 第一步:按正确参数顺序初始化nested聚合,将聚合名设为
main_aggregation,绑定nested路径为names - 第二步:调用
subAggregation()方法,往该nested聚合中添加你需要的内层子聚合 - 第三步:将构建完成的nested聚合直接添加到搜索请求的聚合根节点
参考实现代码
import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.search.builder.SearchSourceBuilder; public class EsAggDemo { public void buildNestedAgg() { // 1. 正确构建名为main_aggregation的nested聚合 NestedAggregationBuilder mainAgg = AggregationBuilders.nested("main_aggregation", "names"); // 2. 添加内层子聚合,示例为添加一个terms聚合,可替换为你实际需要的聚合逻辑 // mainAgg.subAggregation(AggregationBuilders.terms("name_group").field("names.title")); // 3. 将聚合挂载到搜索请求 SearchRequest searchRequest = new SearchRequest("你的目标索引名"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.aggregation(mainAgg); searchRequest.source(sourceBuilder); // 后续执行查询逻辑即可 } }
生成的DSL结构
上述代码生成的聚合DSL和你预期的结构完全一致:
{ "aggregations": { "main_aggregation": { "nested": { "path": "names" }, "aggregations": { // 你添加的所有子聚合会展示在此处 } } } }
之前无法生成目标结构的核心原因是参数顺序写反导致聚合名称不匹配,不存在额外的"把nested块塞进main_aggregation"的步骤,因为main_aggregation本身就是这个nested聚合。
内容的提问来源于stack exchange,提问作者Cugomastik
相关产品推荐
相关产品推荐

