这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人专栏
Elasticsearch aggs 聚合
桶和指标
如何理解 桶和指标,我们可以通过熟悉的 sql 语句来进行举例 SELECT COUNT(tag_code) FROM table GROUP BY tag_code
根据上面例子我们可以看出:
- COUNT(tag_code) 求数量: 与 Elasticsearch
指标
含义相同。 - GROUP BY tag_code 根据某一维度聚合: 与 Elasticsearch
桶
含义相同。
桶是拿来装东西的,而我们会把相似的东西放在同一个桶里;在 Elasticsearch 中也是一样,
桶
就是一个集合
:筛选符合条件的 文档 集合
举个例子:
- 以为工程师 属于 前端桶 或者 后端桶
- 新恒结衣属于 日本桶
在 Elasticsearch 中
桶
能让我们根据筛选条件
对不同的文档分类出不同的集合。从而对集合进行相关指标
的聚合统计。多数 指标 都是是加减乘除
、对数据的统计(例如最小值、平均值、最大值,还有求数量)
尝试聚合
以每个标签
作为桶
, 比如:
{ "size": 0, "aggs": { "tag": { "terms": { "field": "tag_id" } } } }
添加指标
每个标签
的总消耗
{
"size": 0,
"aggs": {
"tag": {
"terms": {
"field": "tag_id"
},
"aggs": {
"total_cost": {
"sum": {
"field": "cost"
}
}
}
}
}
}
标签
消耗中,嵌套桶
每个设计师拥有素材
{
"size": 0,
"aggs": {
"tag": {
"terms": {
"field": "tag_id"
},
"aggs": {
"total_cost": {
"sum": {
"field": "cost"
}
},
"designer": {
"terms": {
"field": "designer_id"
}
}
}
}
}
}
标签
消耗中,嵌套桶
每个设计师最大、最小消耗
{
"size": 0,
"aggs": {
"tag": {
"terms": {
"field": "tag_id"
},
"aggs": {
"total_cost": {
"sum": {
"field": "cost"
}
},
"designer": {
"terms": {
"field": "designer_id"
},
"aggs": {
"avg_cost": {
"avg": { "field": "cost" }
},
"max_cost": {
"max": { "field": "cost" }
}
}
}
}
}
}
}
条形图
date_histogram
(和histogram
一样)默认只会返回文档数目非零
的 buckets
基础条形图
- histogram 桶要求两个参数:一个数值字段以及一个定义桶大小间隔。
- sum 度量嵌套在每个售价区间内,用来显示每个区间内的总收入。
例子:展示&点击之间关系
{
"size" : 0,
"aggs":{
"show":{
"histogram":{
"field": "show",
"interval": 1000
},
"aggs":{
"total_click": {
"sum": {
"field" : "click"
}
}
}
}
}
}
按时间统计
每月素材多少展示?
{
"size" : 0,
"aggs": {
"show": {
"date_histogram": {
"field": "show",
"interval": "month",
"format": "yyyy-MM-dd"
}
}
}
}
buckets 中没有文档也返回,需要设置两个参数来实现效果:
{
"size" : 0,
"aggs": {
"show": {
"date_histogram": {
"field": "show",
"interval": "month",
"format": "yyyy-MM-dd",
"min_doc_count" : 0,
"extended_bounds" : {
"min" : "2019-01-01",
"max" : "2019-12-31"
}
}
}
}
}
min_doc_count
这个参数强制返回空 buckets。extended_bounds
这个参数强制返回整年。
范围限定的聚合编辑
id = 259的设计师素材展示&消耗
{
"query" : {
"match" : { "designer_id" : "259" }
},
"size":0,
"aggs" : {
"avg_show": { "avg": { "field": "show" } },
"avg_cost": { "avg": { "field": "cost" } }
}
}
id = 259的设计师素材展示&消耗 与 全部素材做对比
{
"query" : {
"match" : {
"designer_id" : "259"
}
},
"size":0,
"aggs" : {
"avg_show": {
"avg": { "field": "show" }
},
"avg_cost": {
"avg": { "field": "cost" }
},
"all": {
"global" : {},
"aggs" : {
"all_avg_show": {
"avg": { "field": "show" }
},
"all_avg_cost": {
"avg": { "field": "cost" }
}
}
}
}
}
聚合过滤
消耗大于 1000 的素材 平均消耗
{
"size" : 0,
"query" : {
"constant_score": {
"filter": {
"range": {
"cost": { "gte": 1000 }
}
}
}
},
"aggs" : {
"single_avg_cost": { "avg" : { "field" : "cost" } },
"per_designer_sum": {
"terms": { "field": "designer_id" },
"aggs":{
"single_avg_cost": { "avg" : { "field" : "cost" } },
"single_avg_show": { "avg" : { "field" : "show" } }
}
}
}
}
聚合计算
{
"size": 0,
"aggs": {
"tag_aggs": {
"terms": {
"field": "tag_id"
},
"aggs": {
"sum_cost": {
"sum": {
"field": "cost"
}
},
"sum_show": {
"sum": {
"field": "show"
}
},
"cpm": {
"bucket_script": {
"buckets_path": {
"total_cost": "sum_cost",
"total_show": "sum_show"
},
"script": "( params.total_cost / params.total_show ) * 1000"
}
}
}
}
}
}