《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.21.Aggregations(4) https://developer.aliyun.com/article/1229240
6、速率聚合 rate
速率聚合只能在 date_histogram 中使用,计算每个日期存储桶中的数据在日期粒度上的平均值。参与计算的字段可以为数值类型或者直方图类型。
1)基础用法
以年为区间划分存储桶,计算 price 字段的数量在月上的速率聚合:
首先插入不同年份的数据:
POST _bulk {"index":{"_index":"order","_id":8}} {"sales_name":"Cindy","product_name":"iphone11","brand":"Apple","count":20,"price":"8699.45","order_time":"2020-09-03"} {"index":{"_index":"order","_id":9}} {"sales_name":"Andy","product_name":"mate10","brand":"HUAWEI","count":22,"price":"9759.25","order_time":"2020-08-03"} {"index":{"_index":"order","_id":10}} {"sales_name":"Lily","product_name":"iphone12","brand":"Apple","count":25,"price":"7876.33","order_time":"2020-08-23"}
计算聚合:
GET order/_search?size=0 { "size": 0, "aggs": { "order_date": { "date_histogram": { "field": "order_time", "calendar_interval": "year" }, "aggs": { "price_rate": { "rate": { "field": "price", "unit": "month" , "mode" : "value_count" } } } } } }
l order_date,price_rate 自定义名称,将在结果中返回
l calendar_interval 定义了数据文档划分的桶的时间粒度,此处定义为年粒度
l unit 定义了速率计算的粒度
l mode 定义了速率计算对数值字段处理的方式,默认为 sum 计算字段的和,此处为 value_count 计算字段的数量
返回结果:
{ ... "aggregations" : { "order_date" : { "buckets" : [ { "key_as_string" : "2020-01-01T00:00:00.000Z", "key" : 1577836800000, "doc_count" : 3, "price_rate" : { "value" : 0.25 } }, { "key_as_string" : "2021-01-01T00:00:00.000Z", "key" : 1609459200000, "doc_count" : 7, "price_rate" : { "value" : 0.5 } } ] } } }
value 的计算方法为 rate 字段的和/数量除以 rate 日期单位的值。以上面的第一个 0.25 的结果为例,计算出 2020 年的订单数量为 3 后,再除以一年中的月份数量 12。
2)分桶的时间区间如何与rate中的时间单位配合使用
如果 date_histogram 不是rate histogram 的直接父级,则还有其他限制。此时,rate 时间间隔和 date_histogram 时间间隔必须位于同一组:[second、minute、hour、day、week] 或 [month、quarter、year]。例如,如果 date_histogram 是基于 month 的,则 rate 只支持 month、quarter 或 year。
3)脚本
对产品售卖价格进行修改后,再进行聚合:
GET order/_search?size=0 { "runtime_mappings": { "price.adjusted": { "type": "double", "script": { "source": "emit(doc['price'].value * params.adjustment)", "params": { "adjustment": 0.8 } } } }, "aggs": { "rate_date": { "date_histogram": { "field": "order_time", "calendar_interval": "year" }, "aggs": { "avg_price": { "rate": { "field": "price.adjusted", "unit":"month" } } } } } }
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.21.Aggregations(6) https://developer.aliyun.com/article/1229237