赞
踩
前面已经介绍了指标聚合和桶聚合的使用,本文继续介绍管道聚合。
管道聚合 Pipeline aggregations
管道聚合主要用来处理来自其他聚合的产出结果,而不是来自文档集的产出,并将信息添加到最终的输出结果中。
管道聚合可以引用它们执行计算所需的聚合,方法是使用 bucket_path 参数来指示到所需指标的路径。
定义这些路径的语法可以在下面的 bucket _ path Syntax 部分中找到。
大多数管道聚合都需要另一个聚合作为其输入。输入聚合是通过 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 聚合中。
说明:获取所有桶中的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" } } } }
兄弟级管道聚合,用兄弟级聚合中指定指标的最小值标识 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" } } } }
父管道聚合,对其父多桶聚合的桶进行排序
。可以将零个或多个排序字段与相应的排序顺序一起指定。每个 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 } ] } } }
同级管道聚合,计算同级聚合中指定指标的所有桶之间的和。指定的度量必须是数值的,同级聚合必须是多桶聚合。
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" } } } }
通过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中的管道聚合进行了介绍。最后做一个总结:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。