例如:先查询出所有name为"张三"的员工,再对所有name为"张三"员工的工资进行求和.
/**
* 求和聚合查询: AggregationBuilders.sum("sum_salary").field("salary")
*/
@Test
void sumAggregation() throws IOException {
//创建一个查询请求,并指定索引名称
SearchRequest searchRequest = new SearchRequest("user");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//查询name="张三"的员工
TermQueryBuilder termQueryBuilder=QueryBuilders.termQuery("name","张三");
//求员工总工资
SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("sum_salary").field("salary");
searchSourceBuilder.query(termQueryBuilder);
//聚合查询时会先执行查询,再执行求和函数,由于该处只需要返回求和的值,所以将size设置为0
searchSourceBuilder.aggregation(sumAggregationBuilder).size(0);
searchRequest.source(searchSourceBuilder);
SearchResponse response;
try {
//发起请求,获取响应结果
response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//获取聚合的结果
Aggregations aggregations = response.getAggregations();
System.out.println(JSON.toJSONString(aggregations));
System.out.println(JSON.toJSONString(aggregations.getAsMap().get("sum_salary")));
} catch (IOException e) {
e.printStackTrace();
}
//关闭restHighLevelClient
restHighLevelClient.close();
}
响应结果如下:
{"asMap":{"sum_salary":{"fragment":true,"name":"sum_salary","type":"sum","value":15000.0,"valueAsString":"15000.0"}},"fragment":true}
{"fragment":true,"name":"sum_salary","type":"sum","value":15000.0,"valueAsString":"15000.0"}