使用Elasticsearch最新Java SDK实现嵌套字段聚合遇阻求助
"domain": { "type": "nested", "properties": { "name": { "type": "keyword", "store": true }, "tld": { "type": "keyword", "store": true }, "sld": { "type": "keyword", "store": true }, "subdomains": { "type": "keyword", "store": true } } },
...
我想要对`sld`字段执行terms聚合,但使用`co.elastic.clients:elasticsearch-java`库时,发现嵌套聚合API似乎存在功能缺失。 示例代码如下: ```java elasticsearch.search(s -> s.index(INDEX) .size(0) .aggregations("nesting", n -> n.nested( nesting -> nesting.path("domain"). NO OPTIONS TO ADD A TERMS AGG HERE ) ) , Void.class);
我当前使用的版本是co.elastic.clients:elasticsearch-java:7.16.2,同时也尝试过最新的7.x版本客户端库。这是否无法实现?如果可以,该如何操作?
更新
我尝试了以下写法:
Aggregation subAggregation = new Aggregation.Builder() .terms(new TermsAggregation.Builder().field("domain.sld").size(100).build()) .build(); Aggregation nestedAggregation = new Aggregation.Builder() .nested(new NestedAggregation.Builder().path("domain").build()) .aggregations("slds", subAggregation) .build(); elasticsearch.search(s -> s.index(INDEX) .size(0) .aggregations("nesting", nestedAggregation) , Void.class);
当我直接将生成的查询语句发送给Elasticsearch时能得到正确结果,但使用Java SDK时无法访问聚合结果的buckets:
NestedAggregate nestedAggregate = results.aggregations().get("nesting").nested() ... // what now? No options
解决方案
1. 正确构建嵌套聚合
你可以用更简洁的链式调用完成嵌套聚合构建,注意子聚合的字段无需添加嵌套路径前缀:
elasticsearch.search(s -> s .index(INDEX) .size(0) .aggregations("nesting", agg -> agg .nested(n -> n.path("domain")) .aggregations("slds", subAgg -> subAgg .terms(t -> t.field("sld").size(100)) ) ), Void.class);
2. 正确获取聚合结果
要访问嵌套聚合下的terms聚合桶数据,需要逐层获取子聚合并转换为对应类型:
// 获取顶层嵌套聚合 NestedAggregate nestedAgg = response.aggregations().get("nesting").nested(); // 从嵌套聚合中取出terms子聚合 TermsAggregate termsAgg = nestedAgg.aggregations().get("slds").terms(); // 遍历所有桶 for (TermsBucket bucket : termsAgg.buckets().array()) { String sld = bucket.key().stringValue(); long docCount = bucket.docCount(); // 这里处理每个sld的统计数据 }
3. 版本说明
在7.x版本的Elasticsearch Java客户端中,聚合结果的层级结构需要通过aggregations()方法逐层访问,每个聚合类型对应专属的xxxAggregate类,只要按照聚合定义的层级正确转换类型,就能正常获取桶数据。
内容的提问来源于stack exchange,提问作者ndtreviv
相关产品推荐
相关产品推荐

