【大数据】elasticsearch聚合查询

本文详细介绍了如何使用Elasticsearch进行聚合查询,包括查看每个年龄段的分布、整体平均薪资以及每个年龄段的平均薪资,并提供了相应的Java客户端代码示例。通过对`age`字段的术语聚合和`balance`字段的平均值聚合,实现了数据的深度分析。
摘要由CSDN通过智能技术生成

关于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());
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰肥啊

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值