ElasticSearch系列三 分组 聚合

文章目录

基础知识

bucket 其实就是分组 相当于msql 中 group by
metric 就是统计 相当于 mysql 中的count

案例

以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析

GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "ppp": {
      "terms": {
        "field": "color"
      }
    }
  }
}

size:0 只获取统计之后的结果,统计用到的原始数据不显示
aggs:固定语法聚合统计的标志
ppp:为聚合后的字段随便起一个名字
terms:需要分组的字段
在这里插入图片描述

对每种颜色的家电求平均值

GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "colors": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

根据color分bucket之后 每个bucket再求平均值
在第一个aggs 里面 平级的json结购再添加一个aggs

每种颜色的平均价格,以及找到每种颜色每个品牌的平均价格
我们可以进行多层次的下钻
比如说,现在红色的电视有4台,同时这4台电视中,有3台是属于长虹的,1台是属于小米的
红色电视中的3台长虹的平均价格是多少?
红色电视中的1台小米的平均价格是多少?


GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "colors": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "group_brand":{
            "terms": {
              "field": "brand"
            },
            "aggs": {
              "b_avg_p": {
                "avg": {
                  "field": "price"
                }
              }
            }
          }    
      }
    }
  }
}

一次bucket之后多次metric 多次计算 取最大 最小 平均 求和

GET /tvs/sales/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": { "avg": { "field": "price" } },
            "min_price" : { "min": { "field": "price"} }, 
            "max_price" : { "max": { "field": "price"} },
            "sum_price" : { "sum": { "field": "price" } } 
         }
      }
   }
}

histogram:区间分组,0-2000 ,2000-4000 来分组

统计各个价格区间内的家电的销售总和

GET /tvs/sales/_search
{
 "size": 0,
 "aggs": {
   "price": {
     "histogram": {
       "field": "price",
       "interval": 2000
     },
     "aggs": {
       "revenue": {
         "sum": {
           "field": "price"
         }
       }
     }
   }
 }
}

在这里插入图片描述
date histogram,按照我们指定的某个date类型的日期field,以及日期interval,按照一定的日期间隔,去划分bucket

GET /tvs/sales/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold_date",
            "interval": "month", 
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, 
            "extended_bounds" : { 
                "min" : "2016-01-01",
                "max" : "2017-12-31"
            }
         }
      }
   }
}

min_doc_count:即使某个日期interval,2017-01-01~2017-01-31中,一条数据都没有,那么这个区间也是要返回的,不然默认是会过滤掉这个区间的
extended_bounds,min,max:划分bucket的时候,会限定在这个起始日期,和截止日期内
在这里插入图片描述

 欢迎大家关注我的微信公众号 您的关注就是我不懈的动力 

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值