文章目录


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


概述

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

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


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

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

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

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


官方说明Avg Aggregation

官方说明: ​​Avg Aggregation​

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

更多说明请参考官网


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

原始数据:

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

思路:

  • 先按照颜色进行bucket分组操作

  • 再对每个bucket执行一个metric聚合统计操作

先按照颜色进行bucket分组

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

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


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

全部的DSL如下:

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

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

请求DSL 分析下:

"aggs": { 
"avg_price": {
"avg": {
"field": "price"
}
}
}

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


返回结果分析下:

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

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

类比下我们常用的SQL:

select avg(price) from tvs.sales group by color