# Pipeline Aggregations

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-aggregations-pipeline.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-aggregations-pipeline.html)

译文链接 : [Pipeline Aggregations](/display/Elasticsearch/Pipeline+Aggregations)

贡献者 : @苏涛，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

警告

此功能是实验性的，可能会在将来的版本中完全更改或删除。Elastic将采取最大的努力来解决此问题，但实验功能不受SLA官方功能的支持。

管道聚合工作于其他聚合产生的输出结果而不是文档集，用于向输出树添加信息。有不同类型的管道聚合，每一种从其他聚合中计算不同的信息，但这些类型可以分为以下两个类型：

**_Parent（父类）_**

 在父聚合输出结果的基础上进行管道聚合，可以在现有桶的基础上计算新的桶或者聚合。

**_Sibling（同级）_**

    在同级聚合输出结果的基础上进行管道聚合，并且能够计算与同级聚合相同等级的新聚合。

管道聚合可以通过使用buckets_path参数来指示所需度量的路径来引用他们执行计算所需的聚合。定义这些路径的语法可以在下面的buckets_path语法部分找到。

管道聚合不能具有子聚合，但根据类型，可以引用buckets_path中的另一个管道，使管道聚合链接起来。例如，您可以将两个衍生物连接在一起以计算二阶导数（即衍生词的衍生）。

注意

因为管道聚合仅在输出结果中添加信息，当链接管道聚合的时候，每个管道聚合的输出结果都会被包含在最终结果里。

### buckets_path语法

大多数管道聚合需要另一个聚合作为它的输入。输入聚合通过buckets_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)> ;
PATH                =  <AGG_NAME> [ <AGG_SEPARATOR>, <AGG_NAME> ]* [ <METRIC_SEPARATOR>, <METRIC> ] ;
```

例如，路径"my_bucket&gt;my_stats.avg" 会将"my_stats"中的平均值指作为"my_bucket"桶聚合的输入。

路径跟管道聚合的位置是相对的；并不是绝对路径。而且路径不能沿着聚合树“向上”返回。例如，在date_histogram（日期直方图聚合）中嵌入移动平均值聚合，并引用一个“同级聚合”度量“the_sum”：

```
POST /_search
{
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"timestamp",
                "interval":"day"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "lemmings" } #1
                },
                "the_movavg":{
                    "moving_avg":{ "buckets_path": "the_sum" } #2
                }
            }
        }
    }
}

```

| 1 | 该度量称为“the_sum” |
| 2 | buckets_path通过相对路径“the_sum”引用度量 |

buckets_path也用于Sibling管道聚合，管道聚合是“靠近”一系列桶聚合而不是嵌入它们“里面”。例如，max_bucket聚合使用buckets_path指定嵌入在同级聚合中的度量：

```
POST /_search
{
    "aggs" : {
        "sales_per_month" : {
            "date_histogram" : {
                "field" : "date",
                "interval" : "month"
            },
            "aggs": {
                "sales": {
                    "sum": {
                        "field": "price"
                    }
                }
            }
        },
        "max_monthly_sales": {
            "max_bucket": {
                "buckets_path": "sales_per_month>sales" #1
            }
        }
    }
}
```

| 1 | `buckets_path` 指示max_bucket 聚合是想要得到`sales_per_month` 日期直方图聚合中最大的月份值 |

### 特殊路径

与指标路径不同，`buckets_path` 可以使用特殊的"_count"路径，让管道聚合使用文档计数作为输入参数。例如，移动平均值聚合可以计算每个桶的文档计数而不是给出具体的度量：

```
POST /_search
{
    "aggs": {
        "my_date_histo": {
            "date_histogram": {
                "field":"timestamp",
                "interval":"day"
            },
            "aggs": {
                "the_movavg": {
                    "moving_avg": { "buckets_path": "_count" } #1
                }
            }
        }
    }
}
```

| 1 | 通过使用_count而不是度量名，我们可以计算直方图中文档计数的移动平均值 |

buckets_path还可以使用“_bucket_count”和多桶聚合的路径，以使该聚合在管道聚合中返回的是桶数而不是度量。例如，可以在此处使用bucket_selector过滤掉不包含terms聚合的桶：

```
POST /sales/_search
{
  "size": 0,
  "aggs": {
    "histo": {
      "date_histogram": {
        "field": "date",
        "interval": "day"
      },
      "aggs": {
        "categories": {
          "terms": {
            "field": "category"
          }
        },
        "min_bucket_selector": {
          "bucket_selector": {
            "buckets_path": {
              "count": "categories._bucket_count" #1
            },
            "script": {
              "inline": "params.count != 0"
            }
          }
        }
      }
    }
  }
}

```

| 1 | 通过使用_bucket_count而不是度量名称，我们可以过滤掉它们不包含categories聚合的桶 |

### 处理聚合名称中的点

支持替代语法来处理在名称中具有点的聚合或度量，例如第99.9[百分位数](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-aggregations-metrics-percentile-aggregation.html)。该度量可以参考如下格式：

```
"buckets_path": "my_percentile[99.9]"
```

### 处理数据中的空值

现实世界中的数据通常是嘈杂的，有时候还会存在空数据——数据根本不存在。这可能有各种各样的原因，最常见的原因是：

•落入桶中的文档不包含必填字段

•一个或多个桶没有匹配到文档

•正在计算的度量不能生成值，可能是因为另一个相关的存储区缺少一个值。一些管道聚合具有必须满足的特定要求（例如，导数不能计算第一个值的度量，因为没有先前的值，HoltWinters移动平均需要“预热”数据开始计算等）

Gap policies（缺口策略）是一个用来通知管道聚合当遭遇到数据缺口时应该执行哪种行为的机制。所有的管道聚合都支持`gap_policy` 参数指定Gap policies（缺口策略）。目前有两种Gap policies（缺口策略）可以选择：

**_skip（跳过）_**

此选择将缺失数据的桶视为不存在，会跳过这个桶并使用下一个可用值继续计算。

**_insert_zeros（插入零值）_**

此选项会用零替代缺失值，而且管道聚合会照常进行计算。