概述
继续跟中华石杉老师学习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