管道聚合

管道聚合 #

管道聚合通过将一个聚合的输出用作另一个聚合的输入,将多个聚合链接在一起。它们计算复杂的统计和数学指标,例如导数、移动平均值和累计和。一些管道聚合重复了指标聚合和分组聚合的功能,但在许多情况下,它们使用起来更直观。

管道聚合在所有其他同级聚合之后执行。这会影响性能。例如,使用 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 , avgsum )。
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 属性中。