Link Search Menu Expand Document Documentation Menu

管道聚合

管道聚合通过将一个聚合的输出作为另一个聚合的输入,将多个聚合串联起来。它们计算复杂的统计和数学度量,如导数、移动平均值和累积和。某些管道聚合复制了指标聚合和桶聚合的功能,但在许多情况下,它们使用起来更直观。

管道聚合在所有其他同级聚合之后执行。这会影响性能。例如,使用 bucket_selector 管道聚合来缩小桶列表并不会减少在被省略的桶上执行的计算量。

管道聚合不能进行子聚合,但可以串联到其他管道聚合。例如,您可以通过串联两个连续的 derivative 聚合来计算二阶导数。请记住,管道聚合会追加到现有输出。例如,通过串联 derivative 聚合来计算二阶导数会同时输出一阶和二阶导数。

管道聚合类型

管道聚合分为两种类型:同级聚合父级聚合

同级聚合

同级管道聚合获取嵌套聚合的输出,并在与嵌套桶相同的级别生成新桶或新聚合。

同级聚合必须是多桶聚合(对某个字段具有多个分组值),并且指标必须是数值。

父级聚合

父级聚合获取外部聚合的输出,并在与现有桶相同的级别生成新桶或新聚合。与操作所有桶并生成单个输出的同级管道聚合不同,父级管道聚合单独处理每个桶并将结果写回每个桶中。

父级聚合的指定指标必须是数值。

我们强烈建议将父级聚合的 min_doc_count 设置为 0histogram 聚合的默认值)。如果 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 同级 返回前一个聚合桶的各种统计信息(countminmaxavgsum)。
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 指标。

对于多值指标聚合,如 statspercentiles,您必须在路径中包含指标名称(例如,.min)。对于单值指标,如 sumavg,如果 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 可选 字符串 应用于缺失数据的策略。有效值为 skipinsert_zeros。默认值为 skip
format 可选 字符串 DecimalFormat 格式化字符串。在聚合的 value_as_string 属性中返回格式化输出。
剩余 350 字符

有问题?

想要贡献?