ES单桶-Java API实现

ES单桶-Java API实现

数据准备

  • PUT cars
    {
      "mappings": {
          "transactions": {
            "properties": {
              "color": {
                "type": "keyword"
              },
              "make": {
                "type": "text"
              },
              "price": {
                "type": "long"
              },
              "sold": {
                "type": "date"
              }
            }
          }
        }
    }
    
  • POST /cars/transactions/_bulk
    { "index": {}}
    { "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
    { "index": {}}
    { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
    { "index": {}}
    { "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
    { "index": {}}
    { "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
    { "index": {}}
    { "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
    { "index": {}}
    { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
    { "index": {}}
    { "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
    { "index": {}}
    { "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
    

单桶

  • 要求:哪个颜色的汽车销量最好

  • @Test
    public void test02(){
    
        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("popular_colors").field("color");
    
        SearchResponse searchResponse = elasticsearchTemplate.getClient().prepareSearch("cars")
                .setTypes("transactions")
                .addAggregation(termsAggregationBuilder)
                .execute()
                .actionGet();
        StringTerms stringTerms = searchResponse.getAggregations().get("popular_colors");
        List<StringTerms.Bucket> buckets = stringTerms.getBuckets();
        for (StringTerms.Bucket bucket:buckets){
            String key = bucket.getKeyAsString();
            long count = bucket.getDocCount();
            System.out.println(key+"---"+count);
        }
    }
    
  • 查询结果
    red---4
    blue---2
    green---2
    
  • AggregationBuilder抽象类的实现类由AggregationBuilders聚合条件构造器类创建

在这里插入图片描述

在这里插入图片描述

  • 常用的聚合函数一般有Min(最小值)、Max(最大值)、Terms(精准匹配)、Avg(平均值)、ValueCount(数量)、Sum(总数)

在这里插入图片描述

  • 返回值放在aggregations集合中,通过自定义的桶名称可以获取相应的StringTerms,聚合的结果存放在buckets集合中

在这里插入图片描述

  • buckets集合中固定带有key(termBytes)和docCount(统计的数量)

添加度量指标

  • 要求:每种颜色汽车的平均价格是多少?

  • @Test
    public void test02() {
    
        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("popular_colors").field("color");
    
        AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_price").field("price");
    
        termsAggregationBuilder.subAggregation(avgAggregationBuilder);
    
        SearchResponse searchResponse = elasticsearchTemplate.getClient().prepareSearch("cars")
                .setTypes("transactions")
                .addAggregation(termsAggregationBuilder)
                .execute()
                .actionGet();
        StringTerms stringTerms = searchResponse.getAggregations().get("popular_colors");
        List<StringTerms.Bucket> buckets = stringTerms.getBuckets();
        for (StringTerms.Bucket bucket : buckets) {
            String key = bucket.getKeyAsString();
            long count = bucket.getDocCount();
            System.out.println(key + "---" + count);
    
            InternalAvg internalAvg = bucket.getAggregations().get("avg_price");
            double value = internalAvg.getValue();
            System.out.println(value);
        }
    }
    
  • 先根据颜色分组,再求每个分组的平均值

在这里插入图片描述

  • 返回值同样放在bucket里的aggregations中,不过注意的是,平均值取出来的类是InternalAvg,也是Aggregation接口的一个实现类

在这里插入图片描述

  • 查询结果 red---4 32500.0 blue---2 20000.0 green---2 21000.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值