基于前一次聚合的结果,进行二次聚合统计。
从结构上可以分为兄弟级(Sibling)管道聚合和父级(Parent)管道聚合两种方式。
GET kibana_sample_data_logs/_search
{
"size": 0,
"aggs": {
"count_per_day": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "day"
}
},
"total_bytes_of_download": {
"sum": {
"field": "bytes"
}
}
}
}
GET kibana_sample_data_logs/_search
{
"size": 0,
"aggs": {
"count_per_day": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "day"
},
"aggs": {
"total_bytes_per_day": {
"sum": {
"field": "bytes"
}
}
}
}
}
}
使用兄弟级管道聚合的方式,从多个分桶中获取指定数值指标的聚合结果(最大值 / 最小值 / 平均值 / 和)。
1、统计每个出发地国家的最大的航班飞行时间,并且获取航班飞行时间最长的国家以及对应的飞行时间。
GET kibana_sample_data_flights/_search
{
"track_total_hits": true,
"size": 0,
"aggs": {
"OriginCountry_terms": {
"terms": {
"field": "OriginCountry",
"size": 20
},
"aggs": {
"FlightTimeMin_max": {
"max": {
"field": "FlightTimeMin"
}
}
}
},
"pipeline-max-bucket": {
"max_bucket": {
"buckets_path": "OriginCountry_terms>FlightTimeMin_max"
}
}
}
}
截取部分的聚合结果如下:
"my-pipeline" : {
"value" : 1902.9019775390625,
"keys" : [
"AR"
]
}
2、获取出发地国家中每个出发地城市的航班飞行时间的相关指标,然后统计出发地城市中航班飞行最长的飞行时长以及对应的出发地城市名称。
GET kibana_sample_data_flights/_search
{
"track_total_hits": true,
"size": 0,
"aggs": {
"OriginCountry_terms": {
"terms": {
"field": "OriginCountry",
"size": 20
},
"aggs": {
"OriginCityName_terms": {
"terms": {
"field": "OriginCityName",
"size": 20
},
"aggs": {
"FlgihtTimeMin_stats": {
"stats": {
"field": "FlightTimeMin"
}
}
}
},
"OriginCityName_FlightTimeMin_max": {
"max_bucket": {
"buckets_path": "OriginCityName_terms>FlgihtTimeMin_stats.max"
}
}
}
}
}
}
截取以出发地国家维度的第一个分桶中的管道聚合的结果。
"OriginCityName_FlightTimeMin_max" : {
"value" : 1559.6236572265625,
"keys" : [
"Rome"
]
}
3、在 2 的基础上获取出发地国家中航班飞行最长的飞行时长以及对应的出发地国家名称。
GET kibana_sample_data_flights/_search
{
"track_total_hits": true,
"size": 0,
"aggs": {
"OriginCountry_terms": {
"terms": {
"field": "OriginCountry",
"size": 20
},
"aggs": {
"OriginCityName_terms": {
"terms": {
"field": "OriginCityName",
"size": 20
},
"aggs": {
"FlgihtTimeMin_stats": {
"stats": {
"field": "FlightTimeMin"
}
}
}
},
"OriginCityName_FlightTimeMin_max": {
"max_bucket": {
"buckets_path": "OriginCityName_terms>FlgihtTimeMin_stats.max"
}
}
}
},
"OriginCountry_FlightTimeMin_max": {
"max_bucket": {
"buckets_path": "OriginCountry_terms>OriginCityName_FlightTimeMin_max"
}
}
}
}
在 2 的基础上额外输出出发地国家维度的管道聚合的结果。
"OriginCountry_FlightTimeMin_max" : {
"value" : 1902.9019775390625,
"keys" : [
"AR"
]
}
使用兄弟级管道聚合的方式,从多个分桶中获取指定数值指标的统计聚合结果。
1、统计出发地国家中每个出发地城市的航班飞行时间的平均时长,然后统计这些平均时长在出发地城市维度下的各项指标。
GET kibana_sample_data_flights/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"OriginCountry_terms": {
"terms": {
"field": "OriginCountry",
"size": 20
},
"aggs": {
"OriginCityName_terms": {
"terms": {
"field": "OriginCityName",
"size": 20
},
"aggs": {
"FlightTimeMin_avg": {
"avg": {
"field": "FlightTimeMin"
}
}
}
},
"pipeline_stats_bucket": {
"stats_bucket": {
"buckets_path": "OriginCityName_terms>FlightTimeMin_avg"
}
}
}
}
}
}
截取部分的管道聚合结果。
"OriginCityName_FlightTimeMin_stats" : {
"count" : 15,
"min" : 226.4979310909907,
"max" : 472.0975369329038,
"avg" : 378.1233526619374,
"sum" : 5671.850289929062
}
使用兄弟级管道聚合的方式,从多个分桶中获取指定数值指标的拓展统计聚合结果。
1、统计出发地国家中每个出发地城市的航班飞行时间的平均时长,然后统计这些平均时长在出发地城市维度下的各项指标。
GET kibana_sample_data_flights/_search
{
"track_total_hits": true,
"size": 0,
"aggs": {
"OriginCountry_terms": {
"terms": {
"field": "OriginCountry",
"size": 20
},
"aggs": {
"OriginCityName_terms": {
"terms": {
"field": "OriginCityName",
"size": 20
},
"aggs": {
"FlgihtTimeMin_avg": {
"avg": {
"field": "FlightTimeMin"
}
}
}
},
"OriginCityName_FlightTimeMin_extended_stats": {
"extended_stats_bucket": {
"buckets_path": "OriginCityName_terms>FlgihtTimeMin_avg"
}
}
}
}
}
}
截取部分的管道聚合结果。
"OriginCityName_FlightTimeMin_extended_stats" : {
"count" : 15,
"min" : 226.4979310909907,
"max" : 472.0975369329038,
"avg" : 378.1233526619374,
"sum" : 5671.850289929062,
"sum_of_squares" : 2264926.8781446246,
"variance" : 8017.855381337739,
"variance_population" : 8017.855381337739,
"variance_sampling" : 8590.559337147579,
"std_deviation" : 89.54247808352045,
"std_deviation_population" : 89.54247808352045,
"std_deviation_sampling" : 92.68527033540755,
"std_deviation_bounds" : {
"upper" : 557.2083088289783,
"lower" : 199.03839649489652,
"upper_population" : 557.2083088289783,
"lower_population" : 199.03839649489652,
"upper_sampling" : 563.4938933327526,
"lower_sampling" : 192.75281199112231
}
}
[ˈkjuːmjəleɪtɪv],累计的;累积的
从直方图聚合、日期直方图聚合中对相关数值指标使用父级管道聚合的方式进行累积聚合统计。
外层的直方图聚合、日期直方图聚合的 min_doc_count 必须设置为 0。
1、统计每个用户每天的消费总额,同时统计每个用户每天增长的累计消费金额。
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"order_date_histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"taxful_total_price_sum": {
"sum": {
"field": "taxful_total_price"
}
},
"pipeline_cumulative_sum": {
"cumulative_sum": {
"buckets_path": "taxful_total_price_sum"
}
}
}
}
}
}
截取部分的管道聚合结果。
"pipeline_cumulative_sum" : {
"value" : 41455.5390625
}
[kɑːdɪ’nælɪtɪ],基数
从直方图聚合、日期直方图聚合中对相关数值指标使用父级管道聚合的方式进行累积基数聚合统计。
外层的直方图聚合、日期直方图聚合的 min_doc_count 必须设置为 0。
1、统计每天下单的用户数以及累计的用户数。
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"order_date_histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"customer_id_cardinality": {
"cardinality": {
"field": "customer_id"
}
},
"pipeline_cumulative_cardinality": {
"cumulative_cardinality": {
"buckets_path": "customer_id_cardinality"
}
}
}
}
}
}
截取部分的管道聚合结果。
{
"key_as_string" : "2022-07-16",
"key" : 1657929600000,
"doc_count" : 143,
"customer_id_cardinality" : {
"value" : 45
},
"pipeline_cumulative_cardinality" : {
"value" : 46
}
},
{
"key_as_string" : "2022-07-17",
"key" : 1658016000000,
"doc_count" : 140,
"customer_id_cardinality" : {
"value" : 42
},
"pipeline_cumulative_cardinality" : {
"value" : 46
}
}
移动平均值聚合。在指定的数据序列中滑动一个窗口,通过父级管道聚合的方式计算出窗口内部的平均值。
buckets_path:(必须)字段路径指向。
window:滑动窗口的大小。默认 5。
gap_policy:分桶数据出现空值或者缺失值的处理策略,默认 skip。gap_policy 详细说明
model:指定移动平均值聚合的模型,默认 simple。每个模型对于窗口内部的值的加权方式不同。
settings:指定模型的相关参数。
predict:指定预测的数量(会添加到序列的末尾)。每个移动平均值模型都支持预测模式,基于当前平滑的移动平均值推测未来数据。根据模型和参数的不同,预测结果的准确性也会有所不同。比如:predict: 10。
minimize:指定模型是否开启最小化。最小化是一个调整参数的过程,直到模型生成的预测与输出数据紧密匹配。对于 ewma、holt 模型,该参数默认 false,并且用处不大;对于 holt_winters 模型,该参数默认 true,有助于提高预测的准确性。比如:minimize: true。
对 simple 模型采用窗口大小为 3,进行举例说明。
分桶序号 分桶值 移动平均值
1 10
2 20 10
3 30 (10 + 20) / 2
4 40 (10 + 20 + 30) / 3
5 50 (20 + 30 + 40) / 3
1、统计用户每天的消费金额,并且统计连续五天的平均消费金额。
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"order_date_histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"taxful_total_price_sum": {
"sum": {
"field": "taxful_total_price"
}
},
"pipeline_moving_avg": {
"moving_avg": {
"buckets_path": "taxful_total_price_sum",
"window": 5,
"model": "simple"
}
}
}
}
}
}
截取部分的聚合结果。
{
"key_as_string" : "2022-07-14",
"key" : 1657756800000,
"doc_count" : 146,
"taxful_total_price_sum" : {
"value" : 10578.53125
}
},
{
"key_as_string" : "2022-07-15",
"key" : 1657843200000,
"doc_count" : 153,
"taxful_total_price_sum" : {
"value" : 10448.0
},
"pipeline_moving_avg" : {
"value" : 10578.53125
}
},
{
"key_as_string" : "2022-07-16",
"key" : 1657929600000,
"doc_count" : 143,
"taxful_total_price_sum" : {
"value" : 10283.484375
},
"pipeline_moving_avg" : {
"value" : 10513.265625
}
}
换成 ewma 模型看下效果。
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"order_date_histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"taxful_total_price_sum": {
"sum": {
"field": "taxful_total_price"
}
},
"pipeline_moving_avg": {
"moving_avg": {
"buckets_path": "taxful_total_price_sum",
"window": 5,
"model": "ewma",
"settings": {
"alpha": 0.5
}
}
}
}
}
}
}
移动函数聚合。在指定的数据序列中滑动一个窗口,通过父级管道聚合的方式以及使用自定义的脚本计算出窗口内部的值。移动函数聚合内置了一些常见的函数。
移动函数聚合内置了一些常见函数,如下:
MovingFunctions.max(values):获取最大值(忽略 null、NaN 值,如果窗口为空或者窗口内部的值都是 null、NaN,则返回 NaN )
MovingFunctions.min(values):获取最小值(忽略 null、NaN 值,如果窗口为空或者窗口内部的值都是 null、NaN,则返回 NaN )
MovingFunctions.sum(values):获取总和(忽略 null、NaN 值,如果窗口为空或者窗口内部的值都是 null、NaN,则返回 0.0 )
MovingFunctions.stdDev(values, 平均值):获取标准差(忽略 null、NaN 值,如果窗口为空或者窗口内部的值都是 null、NaN,则返回 0.0 )
MovingFunctions.unweightedAvg(values):使用 simple 模型获取平均值。
MovingFunctions.linearWeightedAvg(values):使用 linear 模型获取平均值。
MovingFunctions.ewma(values, alpha):使用 ewma 模型获取平均值。
MovingFunctions.holt(values, alpha, beta):使用 holt 模型获取平均值。
MovingFunctions.holtWinters(values, alpha, beta, gamma, period, multiplicative):使用 holt_winters 模型获取平均值。multiplicative:布尔值,true 表示使用乘法计算;false 表示使用加法计算
1、统计每天的订单消费金额,并且统计连续五天的消费金额总和。
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"order_date_histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"taxful_total_price_sum": {
"sum": {
"field": "taxful_total_price"
}
},
"pipeline-moving-fn": {
"moving_fn": {
"buckets_path": "taxful_total_price_sum",
"window": 5,
"script": "MovingFunctions.sum(values)",
"shift": 1
}
}
}
}
}
}
截取部分的聚合结果。
{
"key_as_string" : "2022-07-14",
"key" : 1657756800000,
"doc_count" : 146,
"taxful_total_price_sum" : {
"value" : 10578.53125
},
"pipeline-moving-fn" : {
"value" : 10578.53125
}
},
{
"key_as_string" : "2022-07-15",
"key" : 1657843200000,
"doc_count" : 153,
"taxful_total_price_sum" : {
"value" : 10448.0
},
"pipeline-moving-fn" : {
"value" : 21026.53125
}
}
分桶脚本聚合。基于父子管道聚合的方式,对多个分桶聚合的数值类型的指标使用脚本方式进行聚合统计。
1、统计每天的订单消费总额以及商品的消费数量,然后统计每件商品的消费金额。
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"order_date_histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"taxful_total_price_stats": {
"stats": {
"field": "taxful_total_price"
}
},
"total_quantity_stats": {
"stats": {
"field": "total_quantity"
}
},
"pipeline-script": {
"bucket_script": {
"buckets_path": {
"total_price": "taxful_total_price_stats.sum",
"total_quantity": "total_quantity_stats.sum"
},
"script": """
params.total_price/params.total_quantity;
"""
}
}
}
}
}
}
截取部分的聚合结果。
{
"key_as_string" : "2022-07-14",
"key" : 1657756800000,
"doc_count" : 146,
"taxful_total_price_stats" : {
"count" : 146,
"min" : 18.984375,
"max" : 230.0,
"avg" : 72.45569349315069,
"sum" : 10578.53125
},
"total_quantity_stats" : {
"count" : 146,
"min" : 2.0,
"max" : 4.0,
"avg" : 2.1780821917808217,
"sum" : 318.0
},
"pipeline-script" : {
"value" : 33.2658215408805
}
}
分桶过滤器聚合。基于父子管道聚合的方式,使用脚本过滤出符合条件的数值类型的分桶数据参与聚合统计。脚本需要返回布尔值。如果脚本语言是 expression,则脚本可以返回数值,0 被视为 false,其它值被视为 true。
1、统计每天的订单消费金额的相关指标,并筛选出总金额大于13000的日期。
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"order_date_histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"taxful_total_price_stats": {
"stats": {
"field": "taxful_total_price"
}
},
"pipeline-bucket-selector": {
"bucket_selector": {
"buckets_path": {
"sum": "taxful_total_price_stats.sum"
},
"script": """
params.sum > 13000;
"""
}
}
}
}
}
}
截取部分的聚合结果。
{
"key_as_string" : "2022-07-22",
"key" : 1658448000000,
"doc_count" : 163,
"taxful_total_price_stats" : {
"count" : 163,
"min" : 18.984375,
"max" : 393.0,
"avg" : 83.1910467791411,
"sum" : 13560.140625
}
},
{
"key_as_string" : "2022-08-07",
"key" : 1659830400000,
"doc_count" : 165,
"taxful_total_price_stats" : {
"count" : 165,
"min" : 18.984375,
"max" : 225.0,
"avg" : 79.36732954545455,
"sum" : 13095.609375
}
}
分桶排序聚合。使用父子管道聚合的方式,对多个分桶进行排序。可以不指定字段或者指定多个字段用于排序。每个分桶可以根据 _key
、_count
或者子聚合进行排序。
sort:指定用于排序的字段列表。
from:指定从第几个桶开始截断。默认 0。
size:指定返回多少个桶。默认返回所有桶。
gap_policy:分桶数据出现空值或者缺失值的处理策略,默认 skip。gap_policy 详细说明
1、统计每天消费总额中最高的两天的消费金额的相关指标。
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"order_date_histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"taxful_total_price_stats": {
"stats": {
"field": "taxful_total_price"
}
},
"pipeline-sort": {
"bucket_sort": {
"sort": [
{
"taxful_total_price_stats.sum": {
"order": "desc"
}
}
],
"size": 2
}
}
}
}
}
}
截取部分的聚合结果。
"aggregations" : {
"order_date_histogram" : {
"buckets" : [
{
"key_as_string" : "2022-07-22",
"key" : 1658448000000,
"doc_count" : 163,
"taxful_total_price_stats" : {
"count" : 163,
"min" : 18.984375,
"max" : 393.0,
"avg" : 83.1910467791411,
"sum" : 13560.140625
}
},
{
"key_as_string" : "2022-08-07",
"key" : 1659830400000,
"doc_count" : 165,
"taxful_total_price_stats" : {
"count" : 165,
"min" : 18.984375,
"max" : 225.0,
"avg" : 79.36732954545455,
"sum" : 13095.609375
}
}
]
}
}
2、统计前三天的消费金额的相关指标。
GET kibana_sample_data_ecommerce/_search
{
"size": 0,
"track_total_hits": true,
"aggs": {
"order_date_histogram": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"taxful_total_price_stats": {
"stats": {
"field": "taxful_total_price"
}
},
"pipeline-sort": {
"bucket_sort": {
"from": 0,
"size": 3
}
}
}
}
}
}
截取部分的聚合结果。
"aggregations" : {
"order_date_histogram" : {
"buckets" : [
{
"key_as_string" : "2022-07-14",
"key" : 1657756800000,
"doc_count" : 146,
"taxful_total_price_stats" : {
"count" : 146,
"min" : 18.984375,
"max" : 230.0,
"avg" : 72.45569349315069,
"sum" : 10578.53125
}
},
{
"key_as_string" : "2022-07-15",
"key" : 1657843200000,
"doc_count" : 153,
"taxful_total_price_stats" : {
"count" : 153,
"min" : 22.984375,
"max" : 220.0,
"avg" : 68.2875816993464,
"sum" : 10448.0
}
},
{
"key_as_string" : "2022-07-16",
"key" : 1657929600000,
"doc_count" : 143,
"taxful_total_price_stats" : {
"count" : 143,
"min" : 18.984375,
"max" : 250.0,
"avg" : 71.91247814685315,
"sum" : 10283.484375
}
}
]
}
}