管道聚合处理来自其他聚合而不是文档集的输出,将信息添加到输出树中。
注:关于脚本聚合目前在本文中暂时不会涉及。
主要有如下两种管道聚合方式:
parent
sibling
下面一一介绍ES定义的管道聚合。
Avg Bucket 聚合
同级管道聚合,它计算同级聚合中指定度量的平均值。同级聚合必须是多桶聚合,针对的是度量聚合(metric Aggregation)。
示例如下:
1{
2 "avg_bucket": {
3 "buckets_path": "the_sum" // @1
4 }
5}
buckets_path:指定聚合的名称,支持多级嵌套聚合。
其他参数:
gap_policy
当管道聚合遇到不存在的值,有点类似于term等聚合的(missing)时所采取的策略,可选择值为:skip、insert_zeros。
skip:此选项将丢失的数据视为bucket不存在。它将跳过桶并使用下一个可用值继续计算。
insert_zeros:默认使用0代替。
format
用于格式化聚合桶的输出(key)。
示例如下:
1POST /_search
2{
3 "size": 0,
4 "aggs": {
5 "sales_per_month": { // @1
6 "date_histogram": {
7 "field": "date",
8 "interval": "month"
9 },
10 "aggs": { // @2
11 "sales": {
12 "sum": {
13 "field": "price"
14 }
15 }
16 }
17 },
18 "avg_monthly_sales": { // @3
19 "avg_bucket": {
20 "buckets_path": "sales_per_month>sales"
21 }
22 }
23 }
24}
代码@1:首先定义第一级聚合(按月)直方图聚合。
代码@2:定义第二级聚合,在按月聚合的基础上,对每个月的文档求sum。
代码@3:对上面的聚合求平均值。
其返回结果如下:
1{
2 ... // 省略
3 "aggregations": {
4 "sales_per_month": {
5 "buckets": [
6 {
7 "key_as_string": "2015/01/01 00:00:00",
8 "key": 1420070400000,
9 "doc_count": 3,
10 "sales": {
11 "value": 550.0
12 }
13 },
14 {
15 "key_as_string": "2015/02/01 00:00:00",
16 "key": 1422748800000,
17 "doc_count": 2,
18 "sales": {
19 "value": 60.0
20 }
21 }
22 ]
23 },
24 "avg_monthly_sales": { // 这是对二级聚合的结果再进行一次求平均值聚合。
25 "value": 328.33333333333333
26 }
27 }
28}
对应的JAVA示例如下:
1public static void test_pipeline_avg_buncket_aggregation() {
2 RestHighLevelClient client = EsClient.getClient();
3 try {
4 SearchRequest searchRequest = new SearchRequest();
5 searchRequest.indices("aggregations_index02");
6 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
7 AggregationBuilder aggregationBuild = AggregationBuilders.terms("seller_agg")
8 .field("sellerId")
9 .subAggregation(AggregationBuilders.sum("seller_num_agg")
10 .field("num")
11 )
12 ;
13 sourceBuilder.aggregation(aggregationBuild);
14
15