You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用OpenSearch Java Client实现指定嵌套聚合

基于OpenSearch Java Client实现嵌套聚合

版本信息

opensearch-rest-client: 2.4.0
opensearch-java: 2.1.0

问题描述

需要通过OpenSearch Java Client实现如下JSON格式的嵌套聚合,并将其添加到搜索查询中:

{"aggs": {"2": {"terms": {"field": "bytes","order": {"_count": "desc"},"size": 5},"aggs": {"3": {"terms": {"field": "machine.ram","order": {"_count": "desc"},"size": 5}}}}}

实现步骤与代码

1. 构建内层聚合

先创建针对machine.ram字段的terms聚合(对应JSON中的3聚合):

TermsAggregation innerAggregation = TermsAggregation.of(t -> t
    .name("3")
    .field("machine.ram")
    .size(5)
    .order(TermsOrder.of(o -> o.count(SortOrder.Desc)))
);

2. 构建外层聚合并嵌套内层聚合

创建针对bytes字段的外层terms聚合,将内层聚合嵌套进去(对应JSON中的2聚合):

TermsAggregation outerAggregation = TermsAggregation.of(t -> t
    .name("2")
    .field("bytes")
    .size(5)
    .order(TermsOrder.of(o -> o.count(SortOrder.Desc)))
    .aggregations("3", innerAggregation)
);

3. 组装搜索请求

将外层聚合添加到搜索请求中,替换your-index-name为实际索引名:

SearchRequest searchRequest = SearchRequest.of(s -> s
    .index("your-index-name")
    .aggregations("2", outerAggregation)
);

4. 执行查询并解析结果

通过已初始化的OpenSearchClient实例执行请求,然后逐层解析聚合结果:

SearchResponse<Void> searchResponse = client.search(searchRequest, Void.class);

// 解析外层聚合
TermsAggregate outerAgg = searchResponse.aggregations().get("2").terms();
for (TermsBucket outerBucket : outerAgg.buckets().array()) {
    System.out.printf("Bytes: %s, 文档数: %d%n", 
        outerBucket.key().stringValue(), outerBucket.docCount());
    
    // 解析内层聚合
    TermsAggregate innerAgg = outerBucket.aggregations().get("3").terms();
    for (TermsBucket innerBucket : innerAgg.buckets().array()) {
        System.out.printf("  Machine RAM: %s, 文档数: %d%n", 
            innerBucket.key().stringValue(), innerBucket.docCount());
    }
}

内容的提问来源于stack exchange,提问作者Leonardo Mora López

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:30:57