前言
前面已经介绍了指标聚合和桶聚合的使用,本文继续介绍管道聚合。
一、简介
管道聚合 Pipeline aggregations
管道聚合主要用来处理来自其他聚合的产出结果,而不是来自文档集的产出,并将信息添加到最终的输出结果中。
管道聚合可以引用它们执行计算所需的聚合,方法是使用 bucket_path 参数来指示到所需指标的路径。
定义这些路径的语法可以在下面的 bucket _ path Syntax 部分中找到。
二、bucket_path定义
大多数管道聚合都需要另一个聚合作为其输入。输入聚合是通过 bucket _ path 参数定义的,它遵循一个特定的格式:
AGG_SEPARATOR = `>` ; METRIC_SEPARATOR = `.` ; AGG_NAME = <the name of the aggregation> ; METRIC = <the name of the metric (in case of multi-value metrics aggregation)> ; MULTIBUCKET_KEY = `[<KEY_NAME>]` PATH = <AGG_NAME><MULTIBUCKET_KEY>? (<AGG_SEPARATOR>, <AGG_NAME> )* ( <METRIC_SEPARATOR>, <METRIC> ) ;
例如,路径“ my_bucket > my_stats”。“ avg”将路径到“ my_stats”度量指标中的 avg 值,该度量包含在“ my_ bucket”的bucket 聚合中。
三、管道聚合的类型
四、典型用法
1、最大值桶 max_bucket
说明:获取所有桶中的sum合计指标的最大值
POST /_search { "aggs": { "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "max_monthly_sales": { "max_bucket": { "buckets_path": "sales_per_month>sales" } } } }
2、最小值桶 min_bucket
兄弟级管道聚合,用兄弟级聚合中指定指标的最小值标识 bucket,并输出 bucket 的值和键。指定的度量必须是数值的,同级聚合必须是多桶聚合。
POST /sales/_search { "size": 0, "aggs": { "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "min_monthly_sales": { "min_bucket": { "buckets_path": "sales_per_month>sales" } } } }
3、桶排序 bucket_sort
父管道聚合,对其父多桶聚合的桶进行排序。可以将零个或多个排序字段与相应的排序顺序一起指定。每个 bucket 可以根据其_key、_count 或其子聚合进行排序。
此外,可以设置from和size的参数,以截断结果存储桶。
{ "bucket_sort": { "sort": [ { "sort_field_1": { "order": "asc" } }, { "sort_field_2": { "order": "desc" } }, "sort_field_3" ], "from": 1, "size": 3 } }
示例:
POST /sales/_search { "size": 0, "aggs": { "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "total_sales": { "sum": { "field": "price" } }, "sales_bucket_sort": { "bucket_sort": { "sort": [ { "total_sales": { "order": "desc" } } ], "size": 3 } } } } } }
参数说明:
size 大小设置为3意味着只有前3个月的销售总额将返回。
返回结果:
{ "took": 82, "timed_out": false, "_shards": ..., "hits": ..., "aggregations": { "sales_per_month": { "buckets": [ { "key_as_string": "2015/01/01 00:00:00", "key": 1420070400000, "doc_count": 3, "total_sales": { "value": 550.0 } }, { "key_as_string": "2015/03/01 00:00:00", "key": 1425168000000, "doc_count": 2, "total_sales": { "value": 375.0 } }, { "key_as_string": "2015/02/01 00:00:00", "key": 1422748800000, "doc_count": 2, "total_sales": { "value": 60.0 } } ] } } }
还可以做桶聚合的分页截取:
下面的示例简单地截断结果,以便只返回第二个 bucket:
POST /sales/_search { "size": 0, "aggs": { "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "bucket_truncate": { "bucket_sort": { "from": 1, "size": 1 } } } } } }
结果:
{ "took": 11, "timed_out": false, "_shards": ..., "hits": ..., "aggregations": { "sales_per_month": { "buckets": [ { "key_as_string": "2015/02/01 00:00:00", "key": 1422748800000, "doc_count": 2 } ] } } }
4、桶合计 sum_bucket
同级管道聚合,计算同级聚合中指定指标的所有桶之间的和。指定的度量必须是数值的,同级聚合必须是多桶聚合。
POST /sales/_search { "size": 0, "aggs": { "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "sum_monthly_sales": { "sum_bucket": { "buckets_path": "sales_per_month>sales" } } } }
5、桶脚本 bucket_script
通过bucket_script可以使用脚本进行更复杂的数据提取和计算。
POST /sales/_search { "size": 0, "aggs": { "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "total_sales": { "sum": { "field": "price" } }, "t-shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "t-shirt-percentage": { "bucket_script": { "buckets_path": { "tShirtSales": "t-shirts>sales", "totalSales": "total_sales" }, "script": "params.tShirtSales / params.totalSales * 100" } } } } } }
总结
本文主要是ES中的管道聚合进行了介绍。最后做一个总结:
指标聚合 :主要是用来做聚合计算
桶聚合 :主要是用来做分组
管道聚合 : 对桶聚合和管道聚合的计算结果进行聚合计算、排序、截取等操作。