管道聚合

edit

管道聚合作用于其他聚合产生的输出,而不是文档集,为输出树添加信息。有许多不同类型的管道聚合,每种聚合从其他聚合中计算不同的信息,但这些类型可以分为两个家族:

Parent
一组管道聚合,它接收其父聚合的输出,并能够计算新的桶或向现有桶添加新的聚合。
Sibling
提供的Pipeline聚合能够处理同级聚合的输出,并能够计算出一个新的聚合,该聚合将与同级聚合处于同一级别。

管道聚合可以通过使用buckets_path参数来引用它们所需的聚合,以指示所需指标的路径。定义这些路径的语法可以在下面的buckets_path语法部分找到。

管道聚合不能有子聚合,但根据类型,它可以在buckets_path中引用另一个管道,从而允许管道聚合被链接。例如,您可以将两个导数链接在一起以计算二阶导数(即导数的导数)。

因为管道聚合仅添加到输出中,当链接管道聚合时,每个管道聚合的输出都将包含在最终输出中。

buckets_path 语法

edit

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

例如,路径 "my_bucket>my_stats.avg" 将指向 "my_stats" 指标中的 avg 值,该指标包含在 "my_bucket" 桶聚合中。

以下是一些更多示例:

  • multi_bucket["foo"]>single_bucket>multi_metric.avg 将进入 "multi_metric" 聚合下的 avg 指标,该聚合位于多桶聚合 "multi_bucket""foo" 桶中的单桶 "single_bucket" 下。
  • agg1["foo"]._count 将获取多桶聚合 "multi_bucket""foo" 桶的 _count 指标。

路径是相对于管道聚合的位置的;它们不是绝对路径,路径不能“向上”返回聚合树。例如,这个导数嵌套在一个date_histogram中,并引用了一个“兄弟”度量"the_sum"

POST /_search
{
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "lemmings" }              
        },
        "the_deriv": {
          "derivative": { "buckets_path": "the_sum" } 
        }
      }
    }
  }
}

该指标被称为"the_sum"

The buckets_path 通过相对路径 "the_sum" 引用指标

buckets_path 也用于兄弟管道聚合,其中聚合是“下一个”到一系列桶,而不是嵌入“内部”它们。例如,max_bucket 聚合使用 buckets_path 来指定嵌入在兄弟聚合中的指标:

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

buckets_path 指示这个 max_bucket 聚合,我们想要 sales_per_month 日期直方图中 sales 聚合的最大值。

如果一个兄弟管道聚合引用了一个多桶聚合,例如一个terms聚合,它也有选择多桶中特定键的选项。例如,一个bucket_script可以选择两个特定的桶(通过它们的桶键)来执行计算:

POST /_search
{
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sale_type": {
          "terms": {
            "field": "type"
          },
          "aggs": {
            "sales": {
              "sum": {
                "field": "price"
              }
            }
          }
        },
        "hat_vs_bag_ratio": {
          "bucket_script": {
            "buckets_path": {
              "hats": "sale_type['hat']>sales",   
              "bags": "sale_type['bag']>sales"    
            },
            "script": "params.hats / params.bags"
          }
        }
      }
    }
  }
}

buckets_path 选择帽子和包的桶(通过 ['hat']/['bag']`)在脚本中特别使用, 而不是从 sale_type 聚合中获取所有桶

特殊路径

edit

除了指向一个指标,buckets_path 还可以使用特殊的 "_count" 路径。这指示管道聚合使用文档计数作为其输入。例如,可以计算每个桶中文档计数的导数,而不是特定指标:

POST /_search
{
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "the_deriv": {
          "derivative": { "buckets_path": "_count" } 
        }
      }
    }
  }
}

通过使用 _count 而不是指标名称,我们可以计算直方图中文档计数的导数

The buckets_path 也可以使用 "_bucket_count" 和路径到多桶聚合,以在该管道聚合中使用该聚合返回的桶数,而不是指标。例如,可以在此处使用 bucket_selector 来过滤掉内部术语聚合没有桶的桶:

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

通过使用 _bucket_count 而不是指标名称,我们可以过滤掉 histo 桶,其中它们不包含 categories 聚合的桶

处理agg名称中的点

edit

支持另一种语法来处理名称中包含点的聚合或指标,例如 99.9 百分位数。此指标可以称为:

"buckets_path": "my_percentile[99.9]"

处理数据中的间隙

edit

现实世界中的数据通常是嘈杂的,有时包含缺失——即数据根本不存在的地方。这可能由多种原因引起,最常见的原因是:

  • 落入桶中的文档不包含所需的字段
  • 一个或多个桶中没有与查询匹配的文档
  • 正在计算的指标无法生成值,可能是因为另一个依赖的桶缺少值。 一些管道聚合有特定的要求必须满足(例如,导数无法计算第一个值,因为没有前一个值,HoltWinters移动平均需要“预热”数据才能开始计算等)

Gap policies 是一种机制,用于告知管道聚合在遇到“间隙”或缺失数据时的期望行为。所有管道聚合都接受 gap_policy 参数。目前有两种间隙策略可供选择:

skip
此选项将缺失数据视为桶不存在。它将跳过该桶并继续使用下一个可用值进行计算。
insert_zeros
此选项将用零 (0) 替换缺失值,并且管道聚合计算将正常进行。
keep_values
此选项类似于skip,但如果指标提供了一个非空、非NaN的值,则使用此值,否则跳过空桶。

平均桶聚合

edit

一个兄弟管道聚合,用于计算兄弟聚合中指定度量的平均值。指定的度量必须是数值类型,且兄弟聚合必须是一个多桶聚合。

语法

edit
"avg_bucket": {
  "buckets_path": "sales_per_month>sales",
  "gap_policy": "skip",
  "format": "#,##0.00;(#,##0.00)"
}

参数

edit
buckets_path
(必需,字符串) 要平均的桶的路径。有关语法,请参阅buckets_path 语法
gap_policy
(可选,字符串) 当数据中存在间隙时要应用的策略。有关有效值,请参阅 处理数据中的间隙。默认为 skip
format
(可选,字符串) DecimalFormat 模式用于输出值。如果指定,格式化后的值将返回在聚合的 value_as_string 属性中。

响应体

edit
value
(浮点数) 指定在 buckets_path 中的指标的平均值。
value_as_string
(字符串) 聚合的格式化输出值。仅当请求中指定了format时,才会提供此属性。

示例

edit

以下 avg_monthly_sales 聚合使用 avg_bucket 来计算每月的平均销售额:

POST _search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    },
    "avg_monthly_sales": {
// tag::avg-bucket-agg-syntax[]               
      "avg_bucket": {
        "buckets_path": "sales_per_month>sales",
        "gap_policy": "skip",
        "format": "#,##0.00;(#,##0.00)"
      }
// end::avg-bucket-agg-syntax[]               
    }
  }
}

开始配置 avg_bucket。注释不是示例的一部分。

结束 avg_bucket 配置。注释不是示例的一部分。

请求返回以下响应:

{
  "took": 11,
  "timed_out": false,
  "_shards": ...,
  "hits": ...,
  "aggregations": {
    "sales_per_month": {
      "buckets": [
        {
          "key_as_string": "2015/01/01 00:00:00",
          "key": 1420070400000,
          "doc_count": 3,
          "sales": {
            "value": 550.0
          }
        },
        {
          "key_as_string": "2015/02/01 00:00:00",
          "key": 1422748800000,
          "doc_count": 2,
          "sales": {
            "value": 60.0
          }
        },
        {
          "key_as_string": "2015/03/01 00:00:00",
          "key": 1425168000000,
          "doc_count": 2,
          "sales": {
            "value": 375.0
          }
        }
      ]
    },
    "avg_monthly_sales": {
      "value": 328.33333333333333,
      "value_as_string": "328.33"
    }
  }
}

桶脚本聚合

edit

一个父管道聚合,它执行一个脚本,该脚本可以在父多桶聚合中对指定的度量进行每个桶的计算。指定的度量必须是数值类型,并且脚本必须返回一个数值。

语法

edit

一个 bucket_script 聚合单独看起来是这样的:

{
  "bucket_script": {
    "buckets_path": {
      "my_var1": "the_sum",                     
      "my_var2": "the_value_count"
    },
    "script": "params.my_var1 / params.my_var2"
  }
}

在这里,my_var1 是脚本中用于此桶路径的变量名称,the_sum 是用于该变量的指标路径。

表55. bucket_script 参数

Parameter Name Description Required Default Value

脚本

用于此聚合的脚本。脚本可以是内联的、文件或索引的。(更多详情请参见脚本

必需

buckets_path

脚本变量及其关联路径的映射,我们希望使用这些路径来获取变量的桶(有关详细信息,请参阅buckets_path 语法

必需

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

以下代码片段计算了每月T恤销售额与总销售额的比率百分比:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "price"
          }
        },
        "t-shirts": {
          "filter": {
            "term": {
              "type": "t-shirt"
            }
          },
          "aggs": {
            "sales": {
              "sum": {
                "field": "price"
              }
            }
          }
        },
        "t-shirt-percentage": {
          "bucket_script": {
            "buckets_path": {
              "tShirtSales": "t-shirts>sales",
              "totalSales": "total_sales"
            },
            "script": "params.tShirtSales / params.totalSales * 100"
          }
        }
      }
    }
  }
}

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "total_sales": {
                   "value": 550.0
               },
               "t-shirts": {
                   "doc_count": 1,
                   "sales": {
                       "value": 200.0
                   }
               },
               "t-shirt-percentage": {
                   "value": 36.36363636363637
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "total_sales": {
                   "value": 60.0
               },
               "t-shirts": {
                   "doc_count": 1,
                   "sales": {
                       "value": 10.0
                   }
               },
               "t-shirt-percentage": {
                   "value": 16.666666666666664
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "total_sales": {
                   "value": 375.0
               },
               "t-shirts": {
                   "doc_count": 1,
                   "sales": {
                       "value": 175.0
                   }
               },
               "t-shirt-percentage": {
                   "value": 46.666666666666664
               }
            }
         ]
      }
   }
}

桶计数 K-S 检验相关性聚合

edit

一个兄弟管道聚合,它对提供的分布和配置的兄弟聚合中的文档计数所隐含的分布执行两样本Kolmogorov–Smirnov检验(从现在起称为“K-S检验”)。具体来说,对于某些指标,假设该指标的百分位区间是已知的或已通过聚合计算,那么可以使用范围聚合作为兄弟聚合来计算该指标与该指标在文档子集上的限制之间的分布差异的p值。一个自然的用例是,如果兄弟聚合范围聚合嵌套在术语聚合中,在这种情况下,将比较指标的总体分布与其在每个术语上的限制。

参数

edit
buckets_path
(必需,字符串) 包含一组要进行相关性计算的值的桶的路径。必须是 _count 路径。 有关语法,请参阅 buckets_path 语法
alternative
(可选, 列表) 一个字符串值列表,指示要计算的K-S检验的替代假设。 有效值为:"greater", "less", "two_sided"。此参数是确定计算K-S检验时使用的K-S统计量的关键。默认值是所有可能的替代假设。
fractions
(可选,列表) 一个双精度列表,表示用于与buckets_path结果进行比较的样本分布。在典型用法中,这是每个桶中总体文档的比例,与来自兄弟聚合计数的每个桶中的实际文档比例进行比较。默认情况下,假设总体文档在这些桶中均匀分布,如果使用度量的等百分位数来定义桶的端点,它们就会是这种情况。
sampling_method
(可选,字符串) 指示在计算K-S检验时的采样方法。注意,这是对返回值的采样。这决定了用于比较两个样本的累积分布函数(CDF)点。默认是upper_tail,它强调CDF点的上端。有效选项是:upper_tailuniformlower_tail

语法

edit

一个 bucket_count_ks_test 聚合单独看起来是这样的:

{
  "bucket_count_ks_test": {
    "buckets_path": "range_values>_count", 
    "alternative": ["less", "greater", "two_sided"], 
    "sampling_method": "upper_tail" 
  }
}

包含要测试的值的桶。

要计算的替代方案。

K-S统计量的抽样方法。

示例

edit

以下代码片段对字段 version 中的各个项运行 bucket_count_ks_test,将其与均匀分布进行比较。 均匀分布反映了 latency 百分位数桶。未显示的是 latency 指标值的预计算, 这是通过使用 百分位数 聚合完成的。

此示例仅使用延迟的十分位数。

POST correlate_latency/_search?size=0&filter_path=aggregations
{
  "aggs": {
    "buckets": {
      "terms": { 
        "field": "version",
        "size": 2
      },
      "aggs": {
        "latency_ranges": {
          "range": { 
            "field": "latency",
            "ranges": [
              { "to": 0 },
              { "from": 0, "to": 105 },
              { "from": 105, "to": 225 },
              { "from": 225, "to": 445 },
              { "from": 445, "to": 665 },
              { "from": 665, "to": 885 },
              { "from": 885, "to": 1115 },
              { "from": 1115, "to": 1335 },
              { "from": 1335, "to": 1555 },
              { "from": 1555, "to": 1775 },
              { "from": 1775 }
            ]
          }
        },
        "ks_test": { 
          "bucket_count_ks_test": {
            "buckets_path": "latency_ranges>_count",
            "alternative": ["less", "greater", "two_sided"]
          }
        }
      }
    }
  }
}

包含范围聚合和桶相关聚合的术语桶。两者都用于计算术语值与延迟的相关性。

对延迟字段的范围聚合。这些范围是根据延迟字段的百分位数创建的。

桶计数 K-S 检验聚合,用于检验桶计数是否来自与 fractions 相同的分布;其中 fractions 是均匀分布。

以下可能是响应:

{
  "aggregations" : {
    "buckets" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "1.0",
          "doc_count" : 100,
          "latency_ranges" : {
            "buckets" : [
              {
                "key" : "*-0.0",
                "to" : 0.0,
                "doc_count" : 0
              },
              {
                "key" : "0.0-105.0",
                "from" : 0.0,
                "to" : 105.0,
                "doc_count" : 1
              },
              {
                "key" : "105.0-225.0",
                "from" : 105.0,
                "to" : 225.0,
                "doc_count" : 9
              },
              {
                "key" : "225.0-445.0",
                "from" : 225.0,
                "to" : 445.0,
                "doc_count" : 0
              },
              {
                "key" : "445.0-665.0",
                "from" : 445.0,
                "to" : 665.0,
                "doc_count" : 0
              },
              {
                "key" : "665.0-885.0",
                "from" : 665.0,
                "to" : 885.0,
                "doc_count" : 0
              },
              {
                "key" : "885.0-1115.0",
                "from" : 885.0,
                "to" : 1115.0,
                "doc_count" : 10
              },
              {
                "key" : "1115.0-1335.0",
                "from" : 1115.0,
                "to" : 1335.0,
                "doc_count" : 20
              },
              {
                "key" : "1335.0-1555.0",
                "from" : 1335.0,
                "to" : 1555.0,
                "doc_count" : 20
              },
              {
                "key" : "1555.0-1775.0",
                "from" : 1555.0,
                "to" : 1775.0,
                "doc_count" : 20
              },
              {
                "key" : "1775.0-*",
                "from" : 1775.0,
                "doc_count" : 20
              }
            ]
          },
          "ks_test" : {
            "less" : 2.248673241788478E-4,
            "greater" : 1.0,
            "two_sided" : 5.791639181800257E-4
          }
        },
        {
          "key" : "2.0",
          "doc_count" : 100,
          "latency_ranges" : {
            "buckets" : [
              {
                "key" : "*-0.0",
                "to" : 0.0,
                "doc_count" : 0
              },
              {
                "key" : "0.0-105.0",
                "from" : 0.0,
                "to" : 105.0,
                "doc_count" : 19
              },
              {
                "key" : "105.0-225.0",
                "from" : 105.0,
                "to" : 225.0,
                "doc_count" : 11
              },
              {
                "key" : "225.0-445.0",
                "from" : 225.0,
                "to" : 445.0,
                "doc_count" : 20
              },
              {
                "key" : "445.0-665.0",
                "from" : 445.0,
                "to" : 665.0,
                "doc_count" : 20
              },
              {
                "key" : "665.0-885.0",
                "from" : 665.0,
                "to" : 885.0,
                "doc_count" : 20
              },
              {
                "key" : "885.0-1115.0",
                "from" : 885.0,
                "to" : 1115.0,
                "doc_count" : 10
              },
              {
                "key" : "1115.0-1335.0",
                "from" : 1115.0,
                "to" : 1335.0,
                "doc_count" : 0
              },
              {
                "key" : "1335.0-1555.0",
                "from" : 1335.0,
                "to" : 1555.0,
                "doc_count" : 0
              },
              {
                "key" : "1555.0-1775.0",
                "from" : 1555.0,
                "to" : 1775.0,
                "doc_count" : 0
              },
              {
                "key" : "1775.0-*",
                "from" : 1775.0,
                "doc_count" : 0
              }
            ]
          },
          "ks_test" : {
            "less" : 0.9642895789647244,
            "greater" : 4.58718174664754E-9,
            "two_sided" : 5.916656831139733E-9
          }
        }
      ]
    }
  }
}

桶相关性聚合

edit

一个兄弟管道聚合,它在配置的兄弟多桶聚合上执行相关函数。

参数

edit
buckets_path
(必需,字符串) 包含一组要进行相关性分析的值的桶的路径。 有关语法,请参见buckets_path 语法
function

(必需, 对象) 要执行的相关性函数。

Properties of function
count_correlation

(必填*, 对象) 用于计算计数相关性的配置。此函数旨在确定术语值与给定度量之间的相关性。因此,它需要满足以下要求。

  • The buckets_path must point to a _count metric.
  • The total count of all the bucket_path count values must be less than or equal to indicator.doc_count.
  • When utilizing this function, an initial calculation to gather the required indicator values is required.
Properties of count_correlation
indicator

(必需, 对象) 用于与配置的 bucket_path 值进行关联的指标。

Properties of indicator
doc_count
(必需, 整数) 最初创建 expectations 的文档总数。它必须大于或等于 buckets_path 中所有值的总和,因为这是术语值相关联的原始数据的超集。
expectations
(必需, 数组) 用于与配置的 bucket_path 值进行关联的数字数组。此值的长度必须始终等于 bucket_path 返回的桶的数量。
fractions
(可选, 数组) 用于平均和计算方差时的分数数组。如果预计算数据和 buckets_path 存在已知间隙,则应使用此选项。如果提供了 fractions,其长度必须等于 expectations

语法

edit

一个 bucket_correlation 聚合单独看起来是这样的:

{
  "bucket_correlation": {
    "buckets_path": "range_values>_count", 
    "function": {
      "count_correlation": { 
        "indicator": {
          "expectations": [...],
          "doc_count": 10000
        }
      }
    }
  }
}

包含要与之关联的值的桶。

相关函数定义。

示例

edit

以下代码片段将字段 version 中的各个术语与 latency 指标相关联。未显示的是 latency 指标值的预计算,这是通过使用 百分位数 聚合完成的。

此示例仅使用10秒百分位数。

POST correlate_latency/_search?size=0&filter_path=aggregations
{
  "aggs": {
    "buckets": {
      "terms": { 
        "field": "version",
        "size": 2
      },
      "aggs": {
        "latency_ranges": {
          "range": { 
            "field": "latency",
            "ranges": [
              { "to": 0.0 },
              { "from": 0, "to": 105 },
              { "from": 105, "to": 225 },
              { "from": 225, "to": 445 },
              { "from": 445, "to": 665 },
              { "from": 665, "to": 885 },
              { "from": 885, "to": 1115 },
              { "from": 1115, "to": 1335 },
              { "from": 1335, "to": 1555 },
              { "from": 1555, "to": 1775 },
              { "from": 1775 }
            ]
          }
        },
        "bucket_correlation": { 
          "bucket_correlation": {
            "buckets_path": "latency_ranges>_count",
            "function": {
              "count_correlation": {
                "indicator": {
                   "expectations": [0, 52.5, 165, 335, 555, 775, 1000, 1225, 1445, 1665, 1775],
                   "doc_count": 200
                }
              }
            }
          }
        }
      }
    }
  }
}

包含范围聚合和桶相关聚合的术语桶。两者都用于计算术语值与延迟的相关性。

对延迟字段的范围聚合。这些范围是根据延迟字段的百分位数创建的。

计算每个范围内术语值数量与先前计算的指标值之间相关性的桶相关聚合。

以下可能是响应:

{
  "aggregations" : {
    "buckets" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "1.0",
          "doc_count" : 100,
          "latency_ranges" : {
            "buckets" : [
              {
                "key" : "*-0.0",
                "to" : 0.0,
                "doc_count" : 0
              },
              {
                "key" : "0.0-105.0",
                "from" : 0.0,
                "to" : 105.0,
                "doc_count" : 1
              },
              {
                "key" : "105.0-225.0",
                "from" : 105.0,
                "to" : 225.0,
                "doc_count" : 9
              },
              {
                "key" : "225.0-445.0",
                "from" : 225.0,
                "to" : 445.0,
                "doc_count" : 0
              },
              {
                "key" : "445.0-665.0",
                "from" : 445.0,
                "to" : 665.0,
                "doc_count" : 0
              },
              {
                "key" : "665.0-885.0",
                "from" : 665.0,
                "to" : 885.0,
                "doc_count" : 0
              },
              {
                "key" : "885.0-1115.0",
                "from" : 885.0,
                "to" : 1115.0,
                "doc_count" : 10
              },
              {
                "key" : "1115.0-1335.0",
                "from" : 1115.0,
                "to" : 1335.0,
                "doc_count" : 20
              },
              {
                "key" : "1335.0-1555.0",
                "from" : 1335.0,
                "to" : 1555.0,
                "doc_count" : 20
              },
              {
                "key" : "1555.0-1775.0",
                "from" : 1555.0,
                "to" : 1775.0,
                "doc_count" : 20
              },
              {
                "key" : "1775.0-*",
                "from" : 1775.0,
                "doc_count" : 20
              }
            ]
          },
          "bucket_correlation" : {
            "value" : 0.8402398981360937
          }
        },
        {
          "key" : "2.0",
          "doc_count" : 100,
          "latency_ranges" : {
            "buckets" : [
              {
                "key" : "*-0.0",
                "to" : 0.0,
                "doc_count" : 0
              },
              {
                "key" : "0.0-105.0",
                "from" : 0.0,
                "to" : 105.0,
                "doc_count" : 19
              },
              {
                "key" : "105.0-225.0",
                "from" : 105.0,
                "to" : 225.0,
                "doc_count" : 11
              },
              {
                "key" : "225.0-445.0",
                "from" : 225.0,
                "to" : 445.0,
                "doc_count" : 20
              },
              {
                "key" : "445.0-665.0",
                "from" : 445.0,
                "to" : 665.0,
                "doc_count" : 20
              },
              {
                "key" : "665.0-885.0",
                "from" : 665.0,
                "to" : 885.0,
                "doc_count" : 20
              },
              {
                "key" : "885.0-1115.0",
                "from" : 885.0,
                "to" : 1115.0,
                "doc_count" : 10
              },
              {
                "key" : "1115.0-1335.0",
                "from" : 1115.0,
                "to" : 1335.0,
                "doc_count" : 0
              },
              {
                "key" : "1335.0-1555.0",
                "from" : 1335.0,
                "to" : 1555.0,
                "doc_count" : 0
              },
              {
                "key" : "1555.0-1775.0",
                "from" : 1555.0,
                "to" : 1775.0,
                "doc_count" : 0
              },
              {
                "key" : "1775.0-*",
                "from" : 1775.0,
                "doc_count" : 0
              }
            ]
          },
          "bucket_correlation" : {
            "value" : -0.5759855613334943
          }
        }
      ]
    }
  }
}

桶选择器聚合

edit

一个父管道聚合,执行一个脚本来确定当前桶是否会在父多桶聚合中被保留。指定的指标必须是数值型的,并且脚本必须返回一个布尔值。如果脚本语言是expression,则允许返回数值。在这种情况下,0.0将被评估为false,所有其他值将被评估为true。

bucket_selector 聚合,像所有管道聚合一样,在所有其他同级聚合之后执行。这意味着使用 bucket_selector 聚合来过滤响应中返回的桶并不会节省执行聚合的运行时间。

语法

edit

一个 bucket_selector 聚合单独看起来是这样的:

{
  "bucket_selector": {
    "buckets_path": {
      "my_var1": "the_sum",                     
      "my_var2": "the_value_count"
    },
    "script": "params.my_var1 > params.my_var2"
  }
}

在这里,my_var1 是脚本中用于此桶路径的变量名称,the_sum 是用于该变量的指标路径。

表56. bucket_selector 参数

Parameter Name Description Required Default Value

脚本

用于此聚合的脚本。脚本可以是内联的、文件或索引的。(更多详情请参见脚本

必需

buckets_path

脚本变量及其关联路径的映射,我们希望使用这些路径来获取变量的桶(有关详细信息,请参阅buckets_path 语法

必需

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

以下代码片段仅保留当月总销售额超过200的桶:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "price"
          }
        },
        "sales_bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "totalSales": "total_sales"
            },
            "script": "params.totalSales > 200"
          }
        }
      }
    }
  }
}

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "total_sales": {
                   "value": 550.0
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "total_sales": {
                   "value": 375.0
               }
            }
         ]
      }
   }
}

存储桶 2015/02/01 00:00:00 已被移除,因为其总销售额低于200

桶排序聚合

edit

一个父管道聚合,用于对其父多桶聚合的桶进行排序。 可以指定零个或多个排序字段以及相应的排序顺序。 每个桶可以根据其 _key_count 或其子聚合进行排序。 此外,可以设置参数 fromsize 以截断结果桶。

与所有管道聚合一样,bucket_sort 聚合是在所有其他非管道聚合之后执行的。 这意味着排序仅适用于从父聚合返回的任何桶。例如, 如果父聚合是 terms 并且其 size 设置为 10,则 bucket_sort 将仅对这 10 个返回的项桶进行排序。

语法

edit

一个 bucket_sort 聚合单独看起来是这样的:

{
  "bucket_sort": {
    "sort": [
      { "sort_field_1": { "order": "asc" } },   
      { "sort_field_2": { "order": "desc" } },
      "sort_field_3"
    ],
    "from": 1,
    "size": 3
  }
}

这里,sort_field_1 是用于主要排序的变量的桶路径,其顺序为升序。

表57. bucket_sort 参数

Parameter Name Description Required Default Value

排序

要排序的字段列表。有关更多详细信息,请参阅sort

可选

设置值之前的桶将被截断。

可选

0

大小

要返回的存储桶数量。默认为父聚合的所有存储桶。

可选

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

以下代码片段返回按总销售额降序排列的3个月份对应的桶:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "price"
          }
        },
        "sales_bucket_sort": {
          "bucket_sort": {
            "sort": [
              { "total_sales": { "order": "desc" } } 
            ],
            "size": 3                                
          }
        }
      }
    }
  }
}

sort 设置为按降序使用 total_sales 的值

size 设置为 3,表示仅返回 total_sales 中前 3 个月的记录

以下可能是响应:

{
   "took": 82,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "total_sales": {
                   "value": 550.0
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "total_sales": {
                   "value": 375.0
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "total_sales": {
                   "value": 60.0
               }
            }
         ]
      }
   }
}

不排序截断

edit

也可以使用这种聚合来截断结果桶,而不进行任何排序。为此,只需使用 from 和/或 size 参数,而不指定 sort

以下示例简单地截断结果,以便仅返回第二个桶:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "bucket_truncate": {
          "bucket_sort": {
            "from": 1,
            "size": 1
          }
        }
      }
    }
  }
}

响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2
            }
         ]
      }
   }
}

变化点聚合

edit

此功能处于技术预览阶段,可能会在未来的版本中进行更改或移除。Elastic 将努力修复任何问题,但技术预览版中的功能不受官方 GA 功能支持 SLA 的约束。

一个检测指标中的峰值、低谷和变化点的同级管道。 给定由同级多桶聚合提供的值分布, 此聚合指示任何峰值或低谷的桶,以及/或 值分布中最大变化的桶,如果它们在统计上是显著的。

建议使用变化点聚合来检测基于时间的数据变化,不过,您可以使用任何指标来创建桶。

参数

edit
buckets_path
(必需,字符串) 包含一组值的路径,用于在其中检测变化点。必须至少有22个分桶值。建议少于1,000个。 有关语法,请参见buckets_path 语法

语法

edit

一个 change_point 聚合单独看起来是这样的:

{
  "change_point": {
    "buckets_path": "date_histogram>_count" 
  }
}

包含要测试的值的桶。

响应体

edit
bucket

(可选, 对象) 表示发现的变化点的桶的值。如果没有找到变化点,则不会返回。桶中的所有聚合也会一并返回。

桶的属性
key
(值) 匹配的桶的键。可以是字符串或数字。
doc_count
(数字) 桶的文档计数。
type

(对象) 找到的变更点类型及其相关值。可能的类型:

  • dip: 在此变更点发生显著下降
  • distribution_change: 值的总体分布发生了显著变化
  • non_stationary: 没有变更点,但值不是来自平稳分布
  • spike: 在此点发生显著峰值
  • stationary: 未找到变更点
  • step_change: 变更表明值分布在统计上显著的上升或下降
  • trend_change: 在此点发生总体趋势变化

示例

edit

以下示例使用了Kibana样本数据日志数据集。

GET kibana_sample_data_logs/_search
{
  "aggs": {
    "date":{ 
      "date_histogram": {
        "field": "@timestamp",
        "fixed_interval": "1d"
      },
      "aggs": {
        "avg": { 
          "avg": {
            "field": "bytes"
          }
        }
      }
    },
    "change_points_avg": { 
      "change_point": {
        "buckets_path": "date>avg" 
      }
    }
  }
}

一个日期直方图聚合,创建以一天为间隔的桶。

一个与date聚合同级的聚合,用于计算每个桶中bytes字段的平均值。

变化点检测聚合配置对象。

用于检测变化点的聚合值的路径。在这种情况下,变化点聚合的输入是avg的值,它是date的同级聚合。

请求返回的响应类似于以下内容:

    "change_points_avg" : {
      "bucket" : {
        "key" : "2023-04-29T00:00:00.000Z", 
        "doc_count" : 329, 
        "avg" : { 
          "value" : 4737.209726443769
        }
      },
      "type" : { 
        "dip" : {
          "p_value" : 3.8999455212466465e-10, 
          "change_point" : 41 
        }
      }
    }

存储桶键,即变化点。

该桶中的文档数量。

桶中的聚合值。

找到的更改类型。

The p_value 表示变化的极端程度;较低的值表示更大的变化。

发生更改的特定桶(索引从0开始)。

累积基数聚合

edit

一个父管道聚合,用于在父直方图(或日期直方图)聚合中计算累积基数。指定的指标必须是基数聚合,并且包含的直方图必须将 min_doc_count 设置为 0histogram 聚合的默认值)。

The cumulative_cardinality agg 对于查找“总数新项”非常有用,例如每天访问您网站的新访客数量。常规的基数聚合会告诉您每天有多少唯一访客,但不会区分“新”访客或“重复”访客。累积基数聚合可以用来确定每天的唯一访客中有多少是“新”访客。

语法

edit

一个 cumulative_cardinality 聚合单独看起来是这样的:

{
  "cumulative_cardinality": {
    "buckets_path": "my_cardinality_agg"
  }
}

表58. cumulative_cardinality 参数

Parameter Name Description Required Default Value

buckets_path

我们希望找到其累积基数的基数聚合的路径(更多详情请参见buckets_path 语法

必需

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

以下代码片段计算了每日总用户的累积基数:

GET /user_hits/_search
{
  "size": 0,
  "aggs": {
    "users_per_day": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "distinct_users": {
          "cardinality": {
            "field": "user_id"
          }
        },
        "total_new_users": {
          "cumulative_cardinality": {
            "buckets_path": "distinct_users" 
          }
        }
      }
    }
  }
}

buckets_path 指示此聚合使用 distinct_users 聚合的输出来进行累积基数计算

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "users_per_day": {
         "buckets": [
            {
               "key_as_string": "2019-01-01T00:00:00.000Z",
               "key": 1546300800000,
               "doc_count": 2,
               "distinct_users": {
                  "value": 2
               },
               "total_new_users": {
                  "value": 2
               }
            },
            {
               "key_as_string": "2019-01-02T00:00:00.000Z",
               "key": 1546387200000,
               "doc_count": 2,
               "distinct_users": {
                  "value": 2
               },
               "total_new_users": {
                  "value": 3
               }
            },
            {
               "key_as_string": "2019-01-03T00:00:00.000Z",
               "key": 1546473600000,
               "doc_count": 3,
               "distinct_users": {
                  "value": 3
               },
               "total_new_users": {
                  "value": 4
               }
            }
         ]
      }
   }
}

注意第二天,2019-01-02,有两个不同的用户,但由累积管道聚合生成的total_new_users指标仅增加到三个。这意味着那天只有两个用户中的一个是新用户,另一个已经在之前的一天出现过。这种情况在第三天再次发生,其中三个用户中只有一个完全是新用户。

增量累积基数

edit

The cumulative_cardinality agg 将显示自查询时间段开始以来的总数,不同计数。然而,有时查看“增量”计数是有用的。意思是,每天新增多少用户,而不是总数累计计数。

这可以通过在我们的查询中添加一个导数聚合来实现:

GET /user_hits/_search
{
  "size": 0,
  "aggs": {
    "users_per_day": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "distinct_users": {
          "cardinality": {
            "field": "user_id"
          }
        },
        "total_new_users": {
          "cumulative_cardinality": {
            "buckets_path": "distinct_users"
          }
        },
        "incremental_new_users": {
          "derivative": {
            "buckets_path": "total_new_users"
          }
        }
      }
    }
  }
}

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "users_per_day": {
         "buckets": [
            {
               "key_as_string": "2019-01-01T00:00:00.000Z",
               "key": 1546300800000,
               "doc_count": 2,
               "distinct_users": {
                  "value": 2
               },
               "total_new_users": {
                  "value": 2
               }
            },
            {
               "key_as_string": "2019-01-02T00:00:00.000Z",
               "key": 1546387200000,
               "doc_count": 2,
               "distinct_users": {
                  "value": 2
               },
               "total_new_users": {
                  "value": 3
               },
               "incremental_new_users": {
                  "value": 1.0
               }
            },
            {
               "key_as_string": "2019-01-03T00:00:00.000Z",
               "key": 1546473600000,
               "doc_count": 3,
               "distinct_users": {
                  "value": 3
               },
               "total_new_users": {
                  "value": 4
               },
               "incremental_new_users": {
                  "value": 1.0
               }
            }
         ]
      }
   }
}

累积和聚合

edit

一个父管道聚合,用于计算父直方图(或日期直方图)聚合中指定度量的累积和。指定的度量必须是数值型的,并且包含的直方图必须将 min_doc_count 设置为 0(这是 histogram 聚合的默认值)。

语法

edit

一个 cumulative_sum 聚合单独看起来是这样的:

{
  "cumulative_sum": {
    "buckets_path": "the_sum"
  }
}

表59. cumulative_sum 参数

Parameter Name Description Required Default Value

buckets_path

我们希望找到累积和的桶的路径(参见buckets_path 语法了解更多详情)

必需

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

以下代码片段计算了每月总销售额的累计和:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        },
        "cumulative_sales": {
          "cumulative_sum": {
            "buckets_path": "sales" 
          }
        }
      }
    }
  }
}

buckets_path 指示此累积和聚合使用 sales 聚合的输出来进行累积和计算

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               },
               "cumulative_sales": {
                  "value": 550.0
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               },
               "cumulative_sales": {
                  "value": 610.0
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               },
               "cumulative_sales": {
                  "value": 985.0
               }
            }
         ]
      }
   }
}

导数聚合

edit

一个父管道聚合,用于计算父直方图(或日期直方图)聚合中指定度量的导数。指定的度量必须是数值型的,并且包含的直方图必须将 min_doc_count 设置为 0histogram 聚合的默认值)。

语法

edit

一个 derivative 聚合单独看起来是这样的:

"derivative": {
  "buckets_path": "the_sum"
}

表60. derivative 参数

Parameter Name Description Required Default Value

buckets_path

我们希望找到导数的桶的路径(参见buckets_path 语法了解更多详情)

必需

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

一阶导数

edit

以下代码片段计算了每月总销售额的导数:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        },
        "sales_deriv": {
          "derivative": {
            "buckets_path": "sales" 
          }
        }
      }
    }
  }
}

buckets_path 指示此导数聚合使用 sales 聚合的输出来进行导数计算

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               } 
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               },
               "sales_deriv": {
                  "value": -490.0 
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2, 
               "sales": {
                  "value": 375.0
               },
               "sales_deriv": {
                  "value": 315.0
               }
            }
         ]
      }
   }
}

第一个桶没有导数,因为我们需要至少2个数据点来计算导数

衍生值的单位由sales聚合和父直方图隐式定义,因此在这种情况下的单位将是$/月,假设price字段的单位是$。

桶中的文档数量由doc_count表示

二阶导数

edit

二阶导数可以通过将导数管道聚合链接到另一个导数管道聚合的结果上来计算,如下例所示,该示例将计算总月销售额的一阶和二阶导数:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        },
        "sales_deriv": {
          "derivative": {
            "buckets_path": "sales"
          }
        },
        "sales_2nd_deriv": {
          "derivative": {
            "buckets_path": "sales_deriv" 
          }
        }
      }
    }
  }
}

buckets_path 用于二阶导数的指向一阶导数的名称

以下可能是响应:

{
   "took": 50,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               } 
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               },
               "sales_deriv": {
                  "value": -490.0
               } 
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               },
               "sales_deriv": {
                  "value": 315.0
               },
               "sales_2nd_deriv": {
                  "value": 805.0
               }
            }
         ]
      }
   }
}

前两个桶没有二阶导数,因为我们需要至少2个一阶导数的数据点来计算二阶导数

单位

edit

导数聚合允许指定导数值的单位。这会在响应中返回一个额外的字段normalized_value,该字段以所需的x轴单位报告导数值。在下面的示例中,我们计算每月的总销售额的导数,但要求以每天的销售额单位来表示销售额的导数:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        },
        "sales_deriv": {
          "derivative": {
            "buckets_path": "sales",
            "unit": "day" 
          }
        }
      }
    }
  }
}

unit 指定用于导数计算的x轴的单位

以下可能是响应:

{
   "took": 50,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               } 
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               },
               "sales_deriv": {
                  "value": -490.0, 
                  "normalized_value": -15.806451612903226 
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               },
               "sales_deriv": {
                  "value": 315.0,
                  "normalized_value": 11.25
               }
            }
         ]
      }
   }
}

value 以原始单位 每月 报告

normalized_value 以所需的 每天 单位报告

扩展统计桶聚合

edit

一个兄弟管道聚合,用于计算兄弟聚合中指定指标的所有桶的各种统计数据。指定的指标必须是数值类型,且兄弟聚合必须是一个多桶聚合。

stats_bucket聚合相比,此聚合提供了更多统计信息(平方和、标准差等)。

语法

edit

一个 extended_stats_bucket 聚合单独看起来是这样的:

{
  "extended_stats_bucket": {
    "buckets_path": "the_sum"
  }
}

表61. extended_stats_bucket 参数

Parameter Name Description Required Default Value

buckets_path

我们希望为其计算统计信息的存储桶的路径(有关更多详细信息,请参阅buckets_path 语法

必需

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

sigma

显示高于/低于平均值的标准差数量

可选

2

以下代码片段计算了每月销售额桶的扩展统计数据:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    },
    "stats_monthly_sales": {
      "extended_stats_bucket": {
        "buckets_path": "sales_per_month>sales" 
      }
    }
  }
}

bucket_paths 指示此 extended_stats_bucket 聚合,我们希望为 sales 聚合计算统计数据,该聚合位于 sales_per_month 日期直方图中。

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               }
            }
         ]
      },
      "stats_monthly_sales": {
         "count": 3,
         "min": 60.0,
         "max": 550.0,
         "avg": 328.3333333333333,
         "sum": 985.0,
         "sum_of_squares": 446725.0,
         "variance": 41105.55555555556,
         "variance_population": 41105.55555555556,
         "variance_sampling": 61658.33333333334,
         "std_deviation": 202.74505063146563,
         "std_deviation_population": 202.74505063146563,
         "std_deviation_sampling": 248.3109609609156,
         "std_deviation_bounds": {
           "upper": 733.8234345962646,
           "lower": -77.15676792959795,
           "upper_population" : 733.8234345962646,
           "lower_population" : -77.15676792959795,
           "upper_sampling" : 824.9552552551645,
           "lower_sampling" : -168.28858858849787
         }
      }
   }
}

推理桶聚合

edit

一个父管道聚合,它加载一个预训练模型并在父桶聚合的整理结果字段上执行推理。

要使用推理桶聚合,您需要具备与使用获取训练模型API相同的安全权限。

语法

edit

一个 inference 聚合单独看起来是这样的:

{
  "inference": {
    "model_id": "a_model_for_inference", 
    "inference_config": { 
      "regression_config": {
        "num_top_feature_importance_values": 2
      }
    },
    "buckets_path": {
      "avg_cost": "avg_agg", 
      "max_cost": "max_agg"
    }
  }
}

训练模型的唯一标识符或别名。

可选的推理配置,用于覆盖模型的默认设置

avg_agg 的值映射到模型的输入字段 avg_cost

表62. inference 参数

Parameter Name Description Required Default Value

model_id

训练模型的ID或别名。

必需

-

inference_config

包含推理类型及其选项。有两种类型:回归分类

可选

-

buckets_path

定义输入聚合的路径,并将聚合名称映射到模型期望的字段名称。 参见buckets_path 语法了解更多详情

必需

-

推理模型的配置选项

edit

设置inference_config是可选的,通常不需要,因为预训练模型自带合理的默认值。在聚合的上下文中,可以为两种类型的模型中的每一种覆盖一些选项。

回归模型的配置选项
edit
num_top_feature_importance_values
(可选,整数) 指定每个文档的 特征重要性值的最大数量。 默认情况下,它为零,不进行特征重要性计算。
分类模型的配置选项
edit
num_top_classes
(可选, 整数) 指定要返回的顶级类别预测的数量。默认为 0。
num_top_feature_importance_values
(可选,整数) 指定每个文档的 特征重要性值的最大数量。默认为0,表示不进行特征重要性计算。
prediction_field_type
(可选, 字符串) 指定要写入的预测字段类型。 有效值为: string, number, boolean。当提供boolean1.0 转换为 true0.0 转换为 false

示例

edit

以下代码片段按 client_ip 聚合网络日志,并通过指标和桶子聚合提取多个特征,作为推理聚合的输入,该聚合配置了用于识别可疑客户端IP的训练模型:

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "client_ip": { 
      "composite": {
        "sources": [
          {
            "client_ip": {
              "terms": {
                "field": "clientip"
              }
            }
          }
        ]
      },
      "aggs": { 
        "url_dc": {
          "cardinality": {
            "field": "url.keyword"
          }
        },
        "bytes_sum": {
          "sum": {
            "field": "bytes"
          }
        },
        "geo_src_dc": {
          "cardinality": {
            "field": "geo.src"
          }
        },
        "geo_dest_dc": {
          "cardinality": {
            "field": "geo.dest"
          }
        },
        "responses_total": {
          "value_count": {
            "field": "timestamp"
          }
        },
        "success": {
          "filter": {
            "term": {
              "response": "200"
            }
          }
        },
        "error404": {
          "filter": {
            "term": {
              "response": "404"
            }
          }
        },
        "error503": {
          "filter": {
            "term": {
              "response": "503"
            }
          }
        },
        "malicious_client_ip": { 
          "inference": {
            "model_id": "malicious_clients_model",
            "buckets_path": {
              "response_count": "responses_total",
              "url_dc": "url_dc",
              "bytes_sum": "bytes_sum",
              "geo_src_dc": "geo_src_dc",
              "geo_dest_dc": "geo_dest_dc",
              "success": "success._count",
              "error404": "error404._count",
              "error503": "error503._count"
            }
          }
        }
      }
    }
  }
}

一个复合桶聚合,通过client_ip对数据进行聚合。

一系列的指标和桶子聚合。

推理桶聚合,指定训练好的模型并将聚合名称映射到模型的输入字段。

最大桶聚合

edit

一个兄弟管道聚合,用于识别在兄弟聚合中具有指定指标最大值的桶,并输出这些桶的值和键。指定的指标必须是数值类型,且兄弟聚合必须是多桶聚合。

语法

edit

一个 max_bucket 聚合单独看起来是这样的:

{
  "max_bucket": {
    "buckets_path": "the_sum"
  }
}

表63. max_bucket 参数

Parameter Name Description Required Default Value

buckets_path

我们希望找到最大值的桶的路径(更多详情请参见buckets_path 语法

必需

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

以下代码片段计算了每月总销售额的最大值:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    },
    "max_monthly_sales": {
      "max_bucket": {
        "buckets_path": "sales_per_month>sales" 
      }
    }
  }
}

buckets_path 指示这个 max_bucket 聚合,我们想要 sales_per_month 日期直方图中 sales 聚合的最大值。

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               }
            }
         ]
      },
      "max_monthly_sales": {
          "keys": ["2015/01/01 00:00:00"], 
          "value": 550.0
      }
   }
}

keys 是一个字符串数组,因为最大值可能出现在多个桶中

最小桶聚合

edit

一个兄弟管道聚合,用于识别在兄弟聚合中具有指定指标最小值的桶,并输出这些桶的值和键。指定的指标必须是数值类型,且兄弟聚合必须是多桶聚合。

语法

edit

一个 min_bucket 聚合单独看起来是这样的:

{
  "min_bucket": {
    "buckets_path": "the_sum"
  }
}

表64. min_bucket 参数

Parameter Name Description Required Default Value

buckets_path

我们希望找到最小值的桶的路径(更多详情请参见buckets_path 语法

必需

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

以下代码片段计算了每月总销售额的最小值:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    },
    "min_monthly_sales": {
      "min_bucket": {
        "buckets_path": "sales_per_month>sales" 
      }
    }
  }
}

buckets_path 指示此 min_bucket 聚合,我们希望获得 sales 聚合在 sales_per_month 日期直方图中的最小值。

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               }
            }
         ]
      },
      "min_monthly_sales": {
          "keys": ["2015/02/01 00:00:00"], 
          "value": 60.0
      }
   }
}

keys 是一个字符串数组,因为最小值可能出现在多个桶中

移动函数聚合

edit

给定一个有序的数据序列,移动函数聚合将在数据上滑动一个窗口,并允许用户指定一个自定义脚本,该脚本在每个数据窗口上执行。为了方便起见,预定义了许多常用函数,如最小值/最大值、移动平均值等。

语法

edit

一个 moving_fn 聚合单独看起来是这样的:

{
  "moving_fn": {
    "buckets_path": "the_sum",
    "window": 10,
    "script": "MovingFunctions.min(values)"
  }
}

表65. moving_fn 参数

Parameter Name Description Required Default Value

buckets_path

感兴趣指标的路径(更多详情请参见buckets_path 语法

必需

窗口

窗口的大小,用于在直方图上“滑动”。

必需

脚本

应在每个数据窗口上执行的脚本

必需

gap_policy

在数据中发现间隙时要应用的策略。请参阅处理数据中的间隙

可选

跳过

shift

窗口位置的偏移量

可选

0

moving_fn 聚合必须嵌套在 histogramdate_histogram 聚合中。它们可以像其他指标聚合一样嵌套:

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {                  
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }   
        },
        "the_movfn": {
          "moving_fn": {
            "buckets_path": "the_sum",  
            "window": 10,
            "script": "MovingFunctions.unweightedAvg(values)"
          }
        }
      }
    }
  }
}

一个名为“my_date_histo”的date_histogram在“timestamp”字段上构建,时间间隔为一个月

一个sum指标用于计算一个字段的总和。这可以是任何数值指标(sum、min、max等)

最后,我们指定了一个 moving_fn 聚合,它使用 "the_sum" 指标作为其输入。

移动平均值是通过首先指定一个字段上的直方图日期直方图来构建的。然后,您可以选择在其中添加数值度量,例如总和。最后,将moving_fn嵌入到直方图中。然后使用buckets_path参数来“指向”直方图中的一个同级度量(有关buckets_path语法的描述,请参见buckets_path语法)。

上述聚合的一个示例响应可能如下所示:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "my_date_histo": {
         "buckets": [
             {
                 "key_as_string": "2015/01/01 00:00:00",
                 "key": 1420070400000,
                 "doc_count": 3,
                 "the_sum": {
                    "value": 550.0
                 },
                 "the_movfn": {
                    "value": null
                 }
             },
             {
                 "key_as_string": "2015/02/01 00:00:00",
                 "key": 1422748800000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 60.0
                 },
                 "the_movfn": {
                    "value": 550.0
                 }
             },
             {
                 "key_as_string": "2015/03/01 00:00:00",
                 "key": 1425168000000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 375.0
                 },
                 "the_movfn": {
                    "value": 305.0
                 }
             }
         ]
      }
   }
}

自定义用户脚本

edit

移动函数聚合允许用户指定任意脚本来定义自定义逻辑。每次收集到新的数据窗口时,都会调用该脚本。这些值在values变量中提供给脚本。然后,脚本应执行某种计算并输出一个double类型的结果。不允许输出null,但允许输出NaN和+/-Inf

例如,这个脚本将简单地返回窗口中的第一个值,或者如果没有可用值,则返回NaN

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "return values.length > 0 ? values[0] : Double.NaN"
          }
        }
      }
    }
  }
}

移位参数

edit

默认情况下(使用 shift = 0),用于计算的窗口是排除当前桶的最后 n 个值。 将 shift 增加 1 会将起始窗口位置向右移动 1

  • 要包含当前桶到窗口中,使用shift = 1
  • 对于居中对齐(n / 2个值在当前桶之前和之后),使用shift = window / 2
  • 对于右对齐(n个值在当前桶之后),使用shift = window

如果窗口的任一边缘移动到数据系列的边界之外,窗口将缩小以仅包含可用值。

预构建函数

edit

为了方便起见,已经预先构建了许多函数,并可以在 moving_fn 脚本上下文中使用:

  • max()
  • min()
  • sum()
  • stdDev()
  • unweightedAvg()
  • linearWeightedAvg()
  • ewma()
  • holt()
  • holtWinters()

这些函数可以从 MovingFunctions 命名空间中获得。例如 MovingFunctions.max()

最大值函数

edit

此函数接受一组双精度数,并返回该窗口中的最大值。nullNaN 值将被忽略;最大值仅在实际值上计算。如果窗口为空,或者所有值都是 null/NaN,则返回 NaN 作为结果。

表66. max(double[] values) 参数

Parameter Name Description

查找最大值的值窗口

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_moving_max": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.max(values)"
          }
        }
      }
    }
  }
}

最小值函数

edit

此函数接受一组双精度数,并返回该窗口中的最小值。nullNaN 值将被忽略;最小值仅在实际值上计算。如果窗口为空,或者所有值都是 null/NaN,则返回 NaN 作为结果。

表67. min(double[] values) 参数

Parameter Name Description

查找最小值的值窗口

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_moving_min": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.min(values)"
          }
        }
      }
    }
  }
}

求和函数

edit

此函数接受一组双精度数,并返回该窗口中值的总和。nullNaN 值将被忽略;总和仅在实际值上计算。如果窗口为空,或者所有值都是 null/NaN,则返回 0.0 作为结果。

表68. sum(double[] values) 参数

Parameter Name Description

要计算总和的数值窗口

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_moving_sum": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.sum(values)"
          }
        }
      }
    }
  }
}

标准差函数

edit

此函数接受一组双精度数和平均值,然后返回该窗口中值的标准差。 nullNaN 值将被忽略;总和仅在实际值上计算。如果窗口为空,或者所有值都是 null/NaN,则返回 0.0 作为结果。

表69. stdDev(double[] values) 参数

Parameter Name Description

要计算标准差的数值窗口

平均值

窗口的平均值

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_moving_sum": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.stdDev(values, MovingFunctions.unweightedAvg(values))"
          }
        }
      }
    }
  }
}

必须向标准差函数提供avg参数,因为可以在窗口上计算不同风格的平均值(简单、线性加权等)。下面详细介绍的各种移动平均值可以用于计算标准差函数的平均值。

未加权平均函数

edit

函数 unweightedAvg 计算窗口中所有值的总和,然后除以窗口的大小。它实际上是窗口的简单算术平均值。简单移动平均不执行任何与时间相关的加权,这意味着来自 simple 移动平均的值往往“滞后”于实际数据。

nullNaN 值将被忽略;平均值仅基于实际值计算。如果窗口为空,或者所有值都是 null/NaN,则返回 NaN 作为结果。这意味着用于平均值计算的计数是 nullNaN 以外的值的数量。

表70. unweightedAvg(double[] values) 参数

Parameter Name Description

要计算总和的数值窗口

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.unweightedAvg(values)"
          }
        }
      }
    }
  }
}

线性加权平均函数

edit

函数 linearWeightedAvg 为序列中的点分配线性权重,使得“较旧”的数据点(例如窗口开始处的那些点)对总平均值的贡献线性减少。线性加权有助于减少数据均值后的“滞后”,因为较旧的点影响较小。

如果窗口为空,或者所有值都是 null/NaN,则返回 NaN 作为结果。

表71. linearWeightedAvg(double[] values) 参数

Parameter Name Description

要计算总和的数值窗口

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.linearWeightedAvg(values)"
          }
        }
      }
    }
  }
}

ewma 函数

edit

函数 ewma(即“单指数”)类似于函数 linearMovAvg,不同之处在于较旧的数据点呈指数级降低重要性,而不是线性降低重要性。重要性衰减的速度可以通过 alpha 设置来控制。较小的值使权重缓慢衰减,从而提供更大的平滑度并考虑更大的窗口部分。较大的值使权重快速衰减,从而减少较旧值对移动平均值的影响。这往往使移动平均值更紧密地跟踪数据,但平滑度较低。

nullNaN 值将被忽略;平均值仅基于实际值计算。如果窗口为空,或者所有值都是 null/NaN,则返回 NaN 作为结果。这意味着用于平均值计算的计数是 nullNaN 以外的值的数量。

表72. ewma(double[] values, double alpha) 参数

Parameter Name Description

要计算总和的数值窗口

alpha

指数衰减

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.ewma(values, 0.3)"
          }
        }
      }
    }
  }
}

holt 函数

edit

The holt 函数(又名“双指数”)包含第二个指数项,用于跟踪数据的趋势。当数据具有潜在的线性趋势时,单指数表现不佳。双指数模型在内部计算两个值:“水平”和“趋势”。

级别计算类似于ewma,是对数据的一种指数加权视图。不同的是,它使用之前平滑后的值而不是原始值,这使得它能够更接近原始序列。趋势计算则关注当前值与上一个值之间的差异(例如,平滑数据的趋势或斜率)。趋势值也是指数加权的。

值是通过将水平和趋势分量相乘得到的。

nullNaN 值将被忽略;平均值仅基于实际值计算。如果窗口为空,或者所有值都是 null/NaN,则返回 NaN 作为结果。这意味着用于平均值计算的计数是 nullNaN 以外的值的数量。

表73. holt(double[] values, double alpha) 参数

Parameter Name Description

要计算总和的数值窗口

alpha

级别衰减值

beta

趋势衰减值

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "MovingFunctions.holt(values, 0.3, 0.1)"
          }
        }
      }
    }
  }
}

在实践中,alpha 值在 holtMovAvg 中的表现与在 ewmaMovAvg 中非常相似:较小的值会产生更多的平滑和更多的滞后,而较大的值会产生更接近的跟踪和更少的滞后。beta 的值通常很难看出。较小的值强调长期趋势(例如整个系列中的恒定线性趋势),而较大的值强调短期趋势。

holtWinters 函数

edit

The holtWinters 函数(又名“三重指数”)包含第三个指数项,用于跟踪数据的季节性方面。因此,此聚合基于三个组件进行平滑处理:“水平”、“趋势”和“季节性”。

水平和趋势的计算与holt相同。季节性计算则考虑当前点与一个周期前的点之间的差异。

Holt-Winters 比其他移动平均线需要更多的手动调整。你需要指定数据的“周期性”:例如,如果你的数据每7天有一个循环趋势,你应该设置 period = 7。同样,如果有一个每月的趋势,你应该设置为 30。目前没有周期性检测功能,尽管这计划在未来增强中实现。

nullNaN 值将被忽略;平均值仅基于实际值计算。如果窗口为空,或者所有值都是 null/NaN,则返回 NaN 作为结果。这意味着用于平均值计算的计数是 nullNaN 以外的值的数量。

表74. holtWinters(double[] values, double alpha) 参数

Parameter Name Description

要计算总和的数值窗口

alpha

级别衰减值

beta

趋势衰减值

gamma

季节性衰减值

period

数据的周期性

乘法

如果希望使用乘法Holt-Winters,则为True;如果希望使用加法Holt-Winters,则为False

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_sum": {
          "sum": { "field": "price" }
        },
        "the_movavg": {
          "moving_fn": {
            "buckets_path": "the_sum",
            "window": 10,
            "script": "if (values.length > 5*2) {MovingFunctions.holtWinters(values, 0.3, 0.1, 0.1, 5, false)}"
          }
        }
      }
    }
  }
}

乘法Holt-Winters通过将每个数据点除以季节性值来工作。如果您的数据中有任何零值,或者数据中存在间隙(因为这会导致除以零),这将是有问题的。为了应对这种情况,mult Holt-Winters将所有值填充一个非常小的量(1*10-10),以使所有值都为非零。这会影响结果,但只是微乎其微。如果您的数据是非零的,或者您希望在遇到零时看到NaN,您可以通过pad: false禁用此行为。

"冷启动"

edit

不幸的是,由于Holt-Winters的性质,它需要两个周期的数据来“引导”算法。这意味着您的窗口必须始终至少是您周期大小的两倍。如果不是,将会抛出一个异常。这也意味着Holt-Winters在最初的2 * 周期个桶中不会发出值;当前的算法不进行回溯。

你会注意到在上面的例子中,我们有一个if ()语句检查值的大小。这是为了确保我们在调用holt-winters函数之前有足够的数据(5 * 2,其中5是在holtWintersMovAvg函数中指定的周期)。

移动百分位数聚合

edit

给定一个有序的百分位数序列,移动百分位数聚合将滑动一个窗口在这些百分位数上,并允许用户计算累积百分位数。

这从概念上非常类似于移动函数管道聚合, 只不过它作用于百分位数草图而不是实际的桶值。

语法

edit

一个 moving_percentiles 聚合单独看起来是这样的:

{
  "moving_percentiles": {
    "buckets_path": "the_percentile",
    "window": 10
  }
}

表75. moving_percentiles 参数

Parameter Name Description Required Default Value

buckets_path

感兴趣的百分位路径(参见buckets_path 语法了解更多详情

必需

窗口

窗口的大小,用于在直方图上“滑动”。

必需

shift

窗口位置的偏移量

可选

0

moving_percentiles 聚合必须嵌套在 histogramdate_histogram 聚合中。它们可以像其他指标聚合一样嵌套:

POST /_search
{
  "size": 0,
  "aggs": {
    "my_date_histo": {                          
        "date_histogram": {
        "field": "date",
        "calendar_interval": "1M"
      },
      "aggs": {
        "the_percentile": {                     
            "percentiles": {
            "field": "price",
            "percents": [ 1.0, 99.0 ]
          }
        },
        "the_movperc": {
          "moving_percentiles": {
            "buckets_path": "the_percentile",   
            "window": 10
          }
        }
      }
    }
  }
}

一个名为“my_date_histo”的date_histogram在“timestamp”字段上构建,时间间隔为一天

一个 百分位数 指标用于计算字段的百分位数。

最后,我们指定了一个moving_percentiles聚合,它使用“the_percentile”草图为其输入。

移动百分位数是通过首先指定一个字段上的 histogramdate_histogram 来构建的。然后在该直方图中添加一个百分位数指标。最后,将 moving_percentiles 嵌入到该直方图中。buckets_path 参数用于“指向”直方图内的百分位数聚合(有关 buckets_path 语法的描述,请参见 buckets_path 语法)。

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "my_date_histo": {
         "buckets": [
             {
                 "key_as_string": "2015/01/01 00:00:00",
                 "key": 1420070400000,
                 "doc_count": 3,
                 "the_percentile": {
                     "values": {
                       "1.0": 151.0,
                       "99.0": 200.0
                     }
                 }
             },
             {
                 "key_as_string": "2015/02/01 00:00:00",
                 "key": 1422748800000,
                 "doc_count": 2,
                 "the_percentile": {
                     "values": {
                       "1.0": 10.4,
                       "99.0": 49.6
                     }
                 },
                 "the_movperc": {
                   "values": {
                     "1.0": 151.0,
                     "99.0": 200.0
                   }
                 }
             },
             {
                 "key_as_string": "2015/03/01 00:00:00",
                 "key": 1425168000000,
                 "doc_count": 2,
                 "the_percentile": {
                    "values": {
                      "1.0": 175.25,
                      "99.0": 199.75
                    }
                 },
                 "the_movperc": {
                    "values": {
                      "1.0": 11.6,
                      "99.0": 200.0
                    }
                 }
             }
         ]
      }
   }
}

聚合的输出格式继承自引用的percentiles聚合的格式。

移动百分位数管道聚合始终以跳过间隙策略运行。

移动百分位数偏移参数

edit

默认情况下(使用 shift = 0),用于计算的窗口是排除当前桶的最后 n 个值。 将 shift 增加 1 会将起始窗口位置向右移动 1

  • 要包含当前桶到窗口中,使用 shift = 1
  • 对于居中对齐(n / 2 个值在当前桶之前和之后),使用 shift = window / 2
  • 对于右对齐(n 个值在当前桶之后),使用 shift = window

如果窗口的任一边缘移动到数据系列的边界之外,窗口将缩小以仅包含可用值。

标准化聚合

edit

一个父管道聚合,用于计算特定桶值的特定归一化/重缩放值。 无法归一化的值将使用跳过间隙策略跳过。

语法

edit

一个 normalize 聚合单独看起来是这样的:

{
  "normalize": {
    "buckets_path": "normalized",
    "method": "percent_of_sum"
  }
}

表76. normalize_pipeline 参数

Parameter Name Description Required Default Value

buckets_path

我们希望进行归一化的桶的路径(更多详情请参见buckets_path 语法

必需

方法

要应用的特定方法

必需

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

方法

edit

归一化聚合支持多种方法来转换桶值。每个方法定义将使用以下原始桶值集作为示例:[5, 5, 10, 50, 10, 20]

rescale_0_1

此方法重新调整数据,使得最小值为零,最大值为1,其余值在此之间线性归一化。

x' = (x - min_x) / (max_x - min_x)
[0, 0, .1111, 1, .1111, .3333]
rescale_0_100

此方法重新调整数据,使得最小值为零,最大值为100,其余值在此之间线性归一化。

x' = 100 * (x - min_x) / (max_x - min_x)
[0, 0, 11.11, 100, 11.11, 33.33]
percent_of_sum

此方法将每个值标准化,使其表示其贡献的总和的百分比。

x' = x / sum_x
[5%, 5%, 10%, 50%, 10%, 20%]
mean

此方法将每个值标准化,使其与平均值的差异进行归一化。

x' = (x - mean_x) / (max_x - min_x)
[4.63, 4.63, 9.63, 49.63, 9.63, 9.63, 19.63]
z-score

此方法标准化,使得每个值表示它相对于标准差离均值的距离

x' = (x - mean_x) / stdev_x
[-0.68, -0.68, -0.39, 1.94, -0.39, 0.19]
softmax

此方法将每个值进行指数化,并相对于原始值的指数和进行归一化。

x' = e^x / sum_e_x
[2.862E-20, 2.862E-20, 4.248E-18, 0.999, 9.357E-14, 4.248E-18]

示例

edit

以下代码片段计算每个月的总销售额百分比:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        },
        "percent_of_total_sales": {
          "normalize": {
            "buckets_path": "sales",          
            "method": "percent_of_sum",       
            "format": "00.00%"                
          }
        }
      }
    }
  }
}

buckets_path 指示此归一化聚合使用 sales 聚合的输出来进行重新缩放

method 设置应用哪种重新缩放。在这种情况下,percent_of_sum 将计算销售值为父桶中所有销售的比例

format 影响如何使用 Java 的 DecimalFormat 模式将指标格式化为字符串。在这种情况下,乘以 100 并添加一个 %

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               },
               "percent_of_total_sales": {
                  "value": 0.5583756345177665,
                  "value_as_string": "55.84%"
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               },
               "percent_of_total_sales": {
                  "value": 0.06091370558375635,
                  "value_as_string": "06.09%"
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               },
               "percent_of_total_sales": {
                  "value": 0.38071065989847713,
                  "value_as_string": "38.07%"
               }
            }
         ]
      }
   }
}

百分比桶聚合

edit

一个兄弟管道聚合,用于计算兄弟聚合中指定指标的所有桶的百分位数。指定的指标必须是数值类型,且兄弟聚合必须是一个多桶聚合。

语法

edit

一个 percentiles_bucket 聚合单独看起来像这样:

{
  "percentiles_bucket": {
    "buckets_path": "the_sum"
  }
}

表77. percentiles_bucket 参数

Parameter Name Description Required Default Value

buckets_path

我们希望找到百分位数的路径(参见buckets_path 语法了解更多详情)

必需

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

百分比

要计算的百分位数列表

可选

[ 1, 5, 25, 50, 75, 95, 99 ]

keyed

标志,返回范围作为哈希而不是键值对的数组

可选

以下代码片段计算了每月总销售额的百分位数:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    },
    "percentiles_monthly_sales": {
      "percentiles_bucket": {
        "buckets_path": "sales_per_month>sales", 
        "percents": [ 25.0, 50.0, 75.0 ]         
      }
    }
  }
}

buckets_path 指示此百分位数桶聚合,我们希望计算 sales 聚合在 sales_per_month 日期直方图中的百分位数。

percents 指定了我们希望计算的百分位数,在这种情况下,是第25、50和75百分位数。

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               }
            }
         ]
      },
      "percentiles_monthly_sales": {
        "values" : {
            "25.0": 375.0,
            "50.0": 375.0,
            "75.0": 550.0
         }
      }
   }
}

百分位数桶实现

edit

百分位数桶返回最接近的输入数据点,该数据点不大于请求的百分位数;它不会在数据点之间进行插值。

百分位数是精确计算的,而不是近似值(与百分位数指标不同)。这意味着实现会维护一个内存中的、排序的数据列表来计算百分位数,然后再丢弃数据。如果你尝试在一个percentiles_bucket中计算数百万个数据点的百分位数,可能会遇到内存压力问题。

序列差分聚合

edit

序列差分是一种技术,其中时间序列中的值在不同的时间滞后或周期内从自身中减去。例如,数据点 f(x) = f(xt) - f(xt-n),其中 n 是所使用的周期。

周期为1相当于没有时间归一化的导数:它仅仅是相邻两点之间的变化。单周期对于去除常数、线性趋势非常有用。

单个周期也用于将数据转换为平稳序列。在这个例子中,道琼斯指数在约250天内绘制。原始数据不是平稳的,这会使其在某些技术中使用变得困难。

通过计算一阶差分,我们对数据进行了去趋势处理(例如,去除常数或线性趋势)。我们可以看到,数据变成了一个平稳序列(例如,一阶差分围绕零随机分布,并且似乎不表现出任何模式/行为)。这种转换揭示了数据集遵循随机游走;当前值是前一个值加减一个随机量。这一见解有助于选择进一步分析的工具。

dow
Figure 11. Dow Jones plotted and made stationary with first-differencing

较大的周期可以用来消除季节性/周期性行为。在这个例子中,旅鼠的种群是使用正弦波 + 恒定的线性趋势 + 随机噪声合成的。正弦波的周期为30天。

一阶差分去除了常数趋势,仅留下一个正弦波。然后对一阶差分应用第30阶差分,以去除周期性行为,留下一个平稳序列,便于进行其他分析。

lemmings
Figure 12. Lemmings data plotted made stationary with 1st and 30th difference

语法

edit

一个 serial_diff 聚合单独看起来像这样:

{
  "serial_diff": {
    "buckets_path": "the_sum",
    "lag": 7
  }
}

表78. serial_diff 参数

Parameter Name Description Required Default Value

buckets_path

感兴趣指标的路径(更多详情请参见buckets_path 语法

必需

lag

要从当前值中减去的历史桶。例如,滞后为7将从7个桶之前的值中减去当前值。必须是正的非零整数

可选

1

gap_policy

确定在遇到数据间隙时应采取的操作。

可选

insert_zeros

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

serial_diff 聚合必须嵌套在 histogramdate_histogram 聚合中:

POST /_search
{
   "size": 0,
   "aggs": {
      "my_date_histo": {                  
         "date_histogram": {
            "field": "timestamp",
            "calendar_interval": "day"
         },
         "aggs": {
            "the_sum": {
               "sum": {
                  "field": "lemmings"     
               }
            },
            "thirtieth_difference": {
               "serial_diff": {                
                  "buckets_path": "the_sum",
                  "lag" : 30
               }
            }
         }
      }
   }
}

一个名为“my_date_histo”的date_histogram在“timestamp”字段上构建,时间间隔为一天

一个 sum 指标用于计算一个字段的总和。这可以是任何指标(sum、min、max 等)

最后,我们指定了一个serial_diff聚合,它使用“the_sum”指标作为其输入。

序列差异是通过首先指定一个字段上的 histogramdate_histogram 来构建的。然后,您可以选择性地添加普通的指标,例如 sum,在该直方图内部。最后,将 serial_diff 嵌入到直方图中。buckets_path 参数用于“指向”直方图内部的一个同级指标(有关 buckets_path 语法的描述,请参见 buckets_path 语法)。

统计桶聚合

edit

一个兄弟管道聚合,用于计算兄弟聚合中指定指标的所有桶的各种统计数据。指定的指标必须是数值类型,且兄弟聚合必须是一个多桶聚合。

语法

edit

一个 stats_bucket 聚合单独看起来是这样的:

{
  "stats_bucket": {
    "buckets_path": "the_sum"
  }
}

表79. stats_bucket 参数

Parameter Name Description Required Default Value

buckets_path

我们希望为其计算统计信息的存储桶的路径(有关更多详细信息,请参阅buckets_path 语法

必需

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

format

DecimalFormat 模式用于输出值。如果指定,格式化的值将返回在聚合的value_as_string属性中

可选

空值

以下代码片段计算了每月的销售额的统计数据:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    },
    "stats_monthly_sales": {
      "stats_bucket": {
        "buckets_path": "sales_per_month>sales" 
      }
    }
  }
}

bucket_paths 指示这个 stats_bucket 聚合,我们想要计算 sales 聚合在 sales_per_month 日期直方图中的统计数据。

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               }
            }
         ]
      },
      "stats_monthly_sales": {
         "count": 3,
         "min": 60.0,
         "max": 550.0,
         "avg": 328.3333333333333,
         "sum": 985.0
      }
   }
}

总和桶聚合

edit

一个兄弟管道聚合,用于计算兄弟聚合中指定指标在所有桶中的总和。指定的指标必须是数值类型,且兄弟聚合必须是一个多桶聚合。

语法

edit

一个 sum_bucket 聚合单独看起来是这样的:

{
  "sum_bucket": {
    "buckets_path": "the_sum"
  }
}

表80. sum_bucket 参数

Parameter Name Description Required Default Value

buckets_path

我们希望找到总和的桶的路径(参见buckets_path 语法了解更多详情)

必需

gap_policy

在数据中发现间隙时要应用的策略(更多详情请参见处理数据中的间隙

可选

跳过

format

DecimalFormat 模式用于输出值。如果指定,格式化后的值将返回在聚合的value_as_string属性中。

可选

空值

以下代码片段计算所有月度销售额桶的总和:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    },
    "sum_monthly_sales": {
      "sum_bucket": {
        "buckets_path": "sales_per_month>sales" 
      }
    }
  }
}

buckets_path 指示这个 sum_bucket 聚合,我们想要的是 sales_per_month 日期直方图中 sales 聚合的总和。

以下可能是响应:

{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "sales_per_month": {
         "buckets": [
            {
               "key_as_string": "2015/01/01 00:00:00",
               "key": 1420070400000,
               "doc_count": 3,
               "sales": {
                  "value": 550.0
               }
            },
            {
               "key_as_string": "2015/02/01 00:00:00",
               "key": 1422748800000,
               "doc_count": 2,
               "sales": {
                  "value": 60.0
               }
            },
            {
               "key_as_string": "2015/03/01 00:00:00",
               "key": 1425168000000,
               "doc_count": 2,
               "sales": {
                  "value": 375.0
               }
            }
         ]
      },
      "sum_monthly_sales": {
          "value": 985.0
      }
   }
}