白话Elasticsearch33-深入聚合数据分析之案例实战bucket + metrics 统计每种颜色电视平均价格

2021-08-17 14:57:47 浏览数 (3)


概述

继续跟中华石杉老师学习ES,第33篇

课程地址: https://www.roncoo.com/view/55


先回顾一下,白话Elasticsearch32-深入聚合数据分析之案例实战Terms Aggregation 中演示了Terms Aggregation ,其实就是分组操作 ,根据某个字段将数据分到不同的bucket中,DSL及返回结果如下

按照color去分bucket,可以拿到每个color bucket中的数量,这个仅仅只是一个bucket操作,返回结果中 包含key 和 doc_count 。 doc_count可以理解为es的bucket操作默认执行的一个内置metric(其实不是)。

这里我们将学习下除了bucket操作(分组),还要对每个bucket执行一个metric聚合统计操作


官方说明Avg Aggregation

官方说明: Avg Aggregation

更多说明请参考官网


案例:统计每种颜色电视平均价格

原始数据:

思路:

  • 先按照颜色进行bucket分组操作
  • 再对每个bucket执行一个metric聚合统计操作

先按照颜色进行bucket分组

代码语言:javascript复制
GET /tvs/sales/_search
{
  "size": 0 ,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      }
    }
  }
}

紧接着: 在一个aggs执行的bucket操作(terms),平级的json结构下,再加一个aggs,这个第二个aggs内部,同样取个名字,执行一个metric操作,avg,对之前的每个bucket中的数据的指定的field,price field,求一个平均值

全部的DSL如下:

代码语言:javascript复制
GET /tvs/sales/_search
{
  "size": 0 ,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      },
      "aggs":{
        "avg_price":{
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

请求DSL 分析下:

代码语言:javascript复制
"aggs": { 
   "avg_price": { 
      "avg": {
         "field": "price" 
      }
   }
}

就是一个metric,就是一个对一个bucket分组操作之后,对每个bucket都要执行的一个metric


返回结果分析下:

  • buckets: key (分组关键字)和doc_count (数量)
  • avg_price:我们自己取的metric aggs的名字
  • value:我们的metric计算的结果,每个bucket中的数据的price字段求平均值后的结果

类比下我们常用的SQL:

代码语言:javascript复制
select avg(price) from tvs.sales group by color

0 人点赞