关于elasticsearch聚合查询
命令如下
#查看每个年龄段的分布情况
GET bank/_search
{
"aggregations": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
}
}
}
#查看每个年龄段的分布情况。 查看整体的平均工资
GET bank/_search
{
"aggregations": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_key": "asc"
}
]
}
},
"balanceAvg":{
"avg": {
"field": "balance"
}
}
}
}
#聚合中的聚合 查看每个年龄段的平均薪资
GET bank/_search
{
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
},
"aggs": {
"balanceAvg": {
"avg": {
"field": "balance"
}
}
}
}
}
}
Java客户端代码如下
@SpringBootTest
public class AggregationsTest {
private String indexName = "bank";
@Autowired
RestHighLevelClient restHighLevelClient;
/**
* term聚合 查看每个年龄段的分布情况
*/
@Test
public void test1() throws IOException {
String ageAggName = "ageAgg";
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder termsBuilder = AggregationBuilders.terms(ageAggName).field("age");
searchSourceBuilder.aggregation(termsBuilder);
System.out.println("输出查询参数:"+searchSourceBuilder.toString());
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Terms term = searchResponse.getAggregations().get(ageAggName);
for (Terms.Bucket bucket : term.getBuckets()) {
System.out.println("文档的key:"+bucket.getKeyAsString());
System.out.println("文档的值:"+bucket.getDocCount());
}
}
/**
* avg 平均聚合 查看整体的平均薪资
* @throws IOException
*/
@Test
public void test2() throws IOException {
String ageAggName = "ageAgg";
String balanceAvgName = "balanceAvg";
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.aggregation(AggregationBuilders.terms(ageAggName).field("age"));
searchSourceBuilder.aggregation(AggregationBuilders.avg(balanceAvgName).field("balance"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Terms terms = searchResponse.getAggregations().get(ageAggName);
if (terms != null) {
for (Terms.Bucket bucket : terms.getBuckets()) {
System.out.println("文档的key:"+bucket.getKeyAsString());
System.out.println("文档的值:"+bucket.getDocCount());
}
}
//查询整体平均薪资
Avg balanceAvg = searchResponse.getAggregations().get(balanceAvgName);
if (balanceAvg != null) {
System.out.println("平均薪资:"+balanceAvg.getValue());
}
}
/**
* 聚合中的聚合 查看每个年龄段的平均薪资
*/
@Test
public void test3() throws IOException {
String ageAggName = "ageAgg";
String balanceAvgName = "balanceAvg";
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.aggregation(AggregationBuilders.terms(ageAggName).field("age").subAggregation(AggregationBuilders.avg(balanceAvgName).field("balance")));
searchRequest.source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Terms terms = search.getAggregations().get(ageAggName);
if (terms != null) {
for (Terms.Bucket bucket : terms.getBuckets()) {
System.out.println("文档的key:"+bucket.getKeyAsString()+"-----"+"文档的值:"+bucket.getDocCount());
Avg balanceAvg = bucket.getAggregations().get(balanceAvgName);
System.out.println("平均薪资:"+balanceAvg.getValue());
}
}
}
}