如何使用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
相关产品推荐
相关产品推荐

