如:统计0-20岁,20-40岁,40~60岁各个区间段的员工人数
/**
* range范围桶聚合查询: AggregationBuilders.range("age_ranges_count").field("age").addRange(0, 20).addRange(20, 40).addRange(40, 60)
*/
@Test
void rangeAggregation() throws IOException {
//创建一个查询请求,并指定索引名称
SearchRequest searchRequest = new SearchRequest("user");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//统计0-20岁,20-40岁,40~60岁各个区间段的用户人数
RangeAggregationBuilder rangeAggregationBuilder = AggregationBuilders.range("age_ranges_count")
.field("age")
.addRange(0, 20)
.addRange(20, 40)
.addRange(40, 60);
searchSourceBuilder.aggregation(rangeAggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse response;
try {
//发起请求,获取响应结果
response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//获取聚合的结果
Aggregations aggregations = response.getAggregations();
Aggregation aggregation = aggregations.get("age_ranges_count");
System.out.println(JSON.toJSONString(aggregation));
//获取桶聚合结果
List<? extends Range.Bucket> buckets = ((Range) aggregation).getBuckets();
//循环遍历各个桶结果
for (Range.Bucket bucket : buckets) {
//分组的key
String key = bucket.getKeyAsString();
//分组的值
long docCount = bucket.getDocCount();
System.out.println(key + "------->" + docCount);
}
} catch (IOException e) {
e.printStackTrace();
}
//关闭restHighLevelClient
restHighLevelClient.close();
}
响应结果:
{"buckets":[{"aggregations":{"asMap":{},"fragment":true},"docCount":1,"fragment":true,"from":0.0,"fromAsString":"0.0","key":"0.0-20.0","keyAsString":"0.0-20.0","to":20.0,"toAsString":"20.0"},{"aggregations":{"asMap":{},"fragment":true},"docCount":2,"fragment":true,"from":20.0,"fromAsString":"20.0","key":"20.0-40.0","keyAsString":"20.0-40.0","to":40.0,"toAsString":"40.0"},{"aggregations":{"asMap":{},"fragment":true},"docCount":2,"fragment":true,"from":40.0,"fromAsString":"40.0","key":"40.0-60.0","keyAsString":"40.0-60.0","to":60.0,"toAsString":"60.0"}],"fragment":true,"name":"age_ranges_count","type":"range"}
0.0-20.0------->1
20.0-40.0------->2
40.0-60.0------->2