Elasticsearch8.x Java 聚合结果带字段
时间: 2024-02-29 15:08:21 浏览: 172
java使用elasticsearch分组进行聚合查询过程解析
3星 · 编辑精心推荐
Elasticsearch 聚合结果带字段可以使用 Sub Aggregation 来实现。Sub Aggregation 是在一个 Aggregation 中嵌套另一个 Aggregation,可以对上一层聚合结果进行进一步的分析,包括对字段进行统计、排序等操作。
以下是一个简单的示例代码,实现按照某个字段进行分组,并统计每个分组中另一个字段的平均值:
```java
SearchRequest searchRequest = new SearchRequest("index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 构建聚合条件,按照字段1分组
TermsAggregationBuilder aggregationBuilder1 = AggregationBuilders.terms("agg_name1").field("field1");
// 构建子聚合条件,统计字段2的平均值
AvgAggregationBuilder aggregationBuilder2 = AggregationBuilders.avg("agg_name2").field("field2");
// 将子聚合条件添加到父聚合条件中
aggregationBuilder1.subAggregation(aggregationBuilder2);
// 将聚合条件添加到搜索请求中
searchSourceBuilder.aggregation(aggregationBuilder1);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 获取聚合结果
Terms aggResult1 = searchResponse.getAggregations().get("agg_name1");
// 遍历每个分组,获取子聚合结果
for (Terms.Bucket bucket : aggResult1.getBuckets()) {
Avg aggResult2 = bucket.getAggregations().get("agg_name2");
double avg = aggResult2.getValue();
System.out.println("Field1: " + bucket.getKeyAsString() + ", Avg of Field2: " + avg);
}
```
需要注意的是,Sub Aggregation 可以嵌套多层,可以根据具体需求进行扩展。同时还可以使用 Bucket Sort Aggregation 对分组结果进行排序,或使用 Bucket Selector Aggregation 对分组结果进行筛选。
阅读全文