管道聚合 #
管道聚合通过将一个聚合的输出用作另一个聚合的输入,将多个聚合链接在一起。它们计算复杂的统计和数学指标,例如导数、移动平均值和累计和。一些管道聚合重复了指标聚合和分组聚合的功能,但在许多情况下,它们使用起来更直观。
管道聚合在所有其他同级聚合之后执行。这会影响性能。例如,使用
bucket_selector
管道聚合来缩小 bucket 列表并不会减少在省略的 bucket 上执行的计算次数。
管道聚合不能进行子聚合,但可以与其他管道聚合链接。例如,您可以通过链接两个连续的 derivative
聚合来计算二阶导数。请记住,管道聚合会附加到现有输出。例如,通过链接 derivative
聚合来计算二阶导数会同时输出一阶导数和二阶导数。
管道聚合类型 #
管道聚合有两种类型: 同级聚合和父聚合 。
同级聚合 #
同级管道聚合采用嵌套聚合的输出,并在与嵌套存储分组相同的级别生成新的存储分组或新的聚合。
同级聚合必须是多分组聚合(对于某个字段有多个分组值),并且度量必须是数值。
父聚合 #
父聚合接受外部聚合的输出,并生成新的 bucket 或与现有 bucket 同级的新聚合。与跨所有 bucket 操作并生成单个输出的同级管道聚合不同,父管道聚合会单独处理每个 bucket,并将结果写回到每个 bucket 中。
父聚合的指定指标必须是数值。
强烈建议将父聚合的
min_doc_count
设置为 0 (histogram
聚合的默认值)。如果min_doc_count
大于 0 ,则聚合会忽略存储分组,这可能会导致不正确的结果。
支持的管道聚合 #
支持以下管道聚合。
聚合名称 | 类型 | 描述 |
---|---|---|
avg_bucket | 同级聚合 | 计算先前聚合中每个分组中指标的平均值。 |
bucket_script | 父级聚合 | 执行脚本来执行跨多个分组的按分组数值计算。 |
bucket_selector | 父级聚合 | 评估脚本以确定是否应将 histogram (或 date_histogram )聚合返回的分组包含在最终结果中。 |
bucket_sort | 父级聚合 | 对父级多分组聚合产生的分组进行排序或截断。 |
cumulative_sum | 父级聚合 | 计算先前聚合的分组的累积和。 |
derivative | 父级聚合 | 计算聚合中每个分组的一阶和二阶导数。 |
extended_stats | 同级聚合 | stats_bucket 聚合的更全面版本,提供额外的指标。 |
max_bucket | 同级聚合 | 计算先前聚合中每个分组中指标的最大值。 |
min_bucket | 同级聚合 | 计算先前聚合中每个分组中指标的最小值。 |
moving_avg | 父级聚合 | 计算有序数据集中窗口(相邻子集)内指标的一系列平均值。 |
moving_fn | 父级聚合 | 在滑动窗口上执行脚本。 |
percentiles_bucket | 同级聚合 | 计算分位数在分组指标中的位置。 |
serial_diff | 父级聚合 | 计算当前分组中指标值与上一个分组中指标值的差异,并将结果存储在当前分组中。 |
stats_bucket | 同级聚合 | 返回先前聚合的分组的各种统计信息( count , min , max , avg 和 sum )。 |
sum_bucket | 同级聚合 | 计算先前聚合每个分组中指标的总和。 |
分组路径 #
管道聚合使用 buckets_path
参数引用其他聚合的输出。 buckets_path
参数具有以下语法:
buckets_path = <agg_name>[ > <agg_name> ... ][ .<metric_name> ]
此语法使用以下元素。
元素 | 描述 |
---|---|
<agg_name> | 要引用的聚合的名称。 |
> | 用于从一层聚合(父级)导航到嵌套的另一层聚合(子级)的子选择器。 |
.<metric_name> | 指定从多值聚合中检索的指标。只有当目标聚合产生多个指标时才需要。 |
要可视化分组路径,假设您有以下聚合结构:
"aggs": {
"parent_agg": {
"terms": {
"field": "category"
},
"aggs": {
"child_agg": {
"stats": {
"field": "price"
}
}
}
}
}
要引用嵌在 parent_agg
中的 child_agg 的平均价格,请使用
parent_agg>child_agg.avg` 。
参考样例:
my_sum.sum
: 引用my_sum
聚合中的总和指标。popular_tags>my_sum.sum
: 引用my_sum
聚合中嵌在popular_tags
聚合下的sum
指标。
对于多值指标聚合,如 stats 或 percentiles ,必须在路径中包含指标名称(例如, .min )。对于单值指标,如 sum 或 avg ,如果无歧义,可以省略指标名称。
分组路径示例 #
以下示例基于日志样本数据。它在 bytes
字段的值上创建直方图,在每个直方图分组中求和 phpmemory
字段值,并最终使用 sum_bucket
管道聚合求和这些分组。 buckets_path
遵循 number_of_bytes>sum_total_memory
路径从 number_of_bytes
父聚合到 sum_total_memory
子聚合:
GET sample_data_logs/_search
{
"size": 0,
"aggs": {
"number_of_bytes": {
"histogram": {
"field": "bytes",
"interval": 10000
},
"aggs": {
"sum_total_memory": {
"sum": {
"field": "phpmemory"
}
}
}
},
"sum_copies": {
"sum_bucket": {
"buckets_path": "number_of_bytes>sum_total_memory"
}
}
}
}
请注意, buckets_path
包含组件聚合的名称。路径是定向的,意味着它们单向传递,从父聚合到子聚合。
管道聚合返回所有分组汇总的总内存:
{
...
"aggregations": {
"number_of_bytes": {
"buckets": [
{
"key": 0,
"doc_count": 13372,
"sum_total_memory": {
"value": 91266400
}
},
{
"key": 10000,
"doc_count": 702,
"sum_total_memory": {
"value": 0
}
}
]
},
"sum_copies": {
"value": 91266400
}
}
}
统计路径 #
你可以将 buckets_path
指向一个计数而非值作为其输入。为此,请使用 _count
分组路径变量。
以下示例计算来自日志样本数据的字节数的直方图的基本统计信息。它在 bytes
字段的值上创建一个直方图,然后在直方图分组中的计数上计算统计信息。
GET sample_data_logs/_search
{
"size": 0,
"aggs": {
"number_of_bytes": {
"histogram": {
"field": "bytes",
"interval": 10000
}
},
"count_stats": {
"stats_bucket": {
"buckets_path": "number_of_bytes>_count"
}
}
}
}
结果显示每个分组的文档计数统计信息:
{
...
"aggregations": {
"number_of_bytes": {
"buckets": [
{
"key": 0,
"doc_count": 13372
},
{
"key": 10000,
"doc_count": 702
}
]
},
"count_stats": {
"count": 2,
"min": 702,
"max": 13372,
"avg": 7037,
"sum": 14074
}
}
}
数据缺口 #
实际使用中,可以使用嵌套聚合对多个原因进行聚合,原因包括:
- 数值中的缺失值。
- 聚合链中的空分组。
- 计算分组数所需的缺失数值(例如,,某些分组号需要一个或多个前置值才能计算)。
您可以使用 gap_policy
属性指定处理缺失数据的策略:跳过缺失数据或将缺失数据替换为零。
gap_policy
参数适用于所有管道聚合。
参数 | 必选/可选 | 数据类型 | 描述 |
---|---|---|---|
gap_policy | 可选 | string | 缺失数据的应用策略。有效值为 skip 和 insert_zeros 。默认值为 skip 。 |
format | 可选 | string | 一个 DecimalFormat 格式化字符串。返回格式化后的输出到聚合的 value_as_string 属性中。 |