管道聚合
管道聚合通过将一个聚合的输出作为另一个聚合的输入,将多个聚合串联起来。它们计算复杂的统计和数学度量,如导数、移动平均值和累积和。某些管道聚合复制了指标聚合和桶聚合的功能,但在许多情况下,它们使用起来更直观。
管道聚合在所有其他同级聚合之后执行。这会影响性能。例如,使用 bucket_selector
管道聚合来缩小桶列表并不会减少在被省略的桶上执行的计算量。
管道聚合不能进行子聚合,但可以串联到其他管道聚合。例如,您可以通过串联两个连续的 derivative
聚合来计算二阶导数。请记住,管道聚合会追加到现有输出。例如,通过串联 derivative
聚合来计算二阶导数会同时输出一阶和二阶导数。
管道聚合类型
同级聚合
同级管道聚合获取嵌套聚合的输出,并在与嵌套桶相同的级别生成新桶或新聚合。
同级聚合必须是多桶聚合(对某个字段具有多个分组值),并且指标必须是数值。
父级聚合
父级聚合获取外部聚合的输出,并在与现有桶相同的级别生成新桶或新聚合。与操作所有桶并生成单个输出的同级管道聚合不同,父级管道聚合单独处理每个桶并将结果写回每个桶中。
父级聚合的指定指标必须是数值。
我们强烈建议将父级聚合的 min_doc_count
设置为 0
(histogram
聚合的默认值)。如果 min_doc_count
大于 0
,则聚合会省略桶,这可能导致结果不正确。
支持的管道聚合
OpenSearch 支持以下管道聚合。
名称 | 类型 | 描述 |
---|---|---|
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
:指嵌套在popular_tags
聚合下的my_sum
聚合的sum
指标。
对于多值指标聚合,如 stats
或 percentiles
,您必须在路径中包含指标名称(例如,.min
)。对于单值指标,如 sum
或 avg
,如果 unambiguous,指标名称是可选的。
桶路径示例
以下示例对 OpenSearch Dashboards 日志样本数据进行操作。它创建 bytes
字段值的直方图,对每个直方图桶中的 phpmemory
字段求和,最后使用 sum_bucket
管道聚合对桶求和。buckets_path
遵循从 number_of_bytes
父聚合到 sum_total_memory
子聚合的 number_of_bytes>sum_total_memory
路径
GET opensearch_dashboards_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
桶路径变量。
以下示例计算 OpenSearch Dashboards 日志样本数据中字节数直方图的基本统计信息。它创建 bytes
字段值的直方图,然后计算直方图桶中计数的统计信息。
GET opensearch_dashboards_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
}
}
}
数据间隙
真实世界的数据可能由于多种原因在嵌套聚合中丢失,包括
- 文档中缺少值。
- 聚合链中任何位置的空桶。
- 缺少计算桶值所需的数据(例如,
derivative
等滚动函数需要一个或多个先前值才能开始)。
您可以使用 gap_policy
属性指定处理缺失数据的策略:跳过缺失数据或用零替换缺失数据。
gap_policy
参数对所有管道聚合都有效。
参数 | 必需/可选 | 数据类型 | 描述 |
---|---|---|---|
gap_policy | 可选 | 字符串 | 应用于缺失数据的策略。有效值为 skip 和 insert_zeros 。默认值为 skip 。 |
format | 可选 | 字符串 | DecimalFormat 格式化字符串。在聚合的 value_as_string 属性中返回格式化输出。 |