管道聚合
> 文档中心 > 文档中心 > INFINI Easysearch > 功能手册 > 聚合操作 > 管道聚合

管道聚合 #

使用管道聚合,可以通过将一个聚合的结果作为输入管道传输到另一个聚合来链接聚合,以获得更细微的输出。

可以使用管道聚合来计算复杂的统计和数学度量值,如导数、移动平均值、累积总和等。

管道聚合语法 #

管道聚合使用 buckets_path 属性访问其他聚合的结果。 buckets_path 属性具有特定的语法:

buckets_path = <AGG_NAME>[<AGG_SEPARATOR>,<AGG_NAME>]*[<METRIC_SEPARATOR>, <METRIC>];

分别是:

  • AGG_NAME 是聚合的名称。
  • AGG_SEPARATOR 分隔聚合,表示为 >
  • METRIC_SEPARATOR 将聚合与 metrics 分开,表示为 .
  • METRIC 指标名称,如果是多值指标聚合。

例如,my_sum.sum 选择名为 my_sum 的聚合的 sum 指标。popular_tags>my_sum.summy_sum.sum 嵌套到 popular_tags 聚合中。

您还可以指定以下附加参数:

  • gap_policy: 真实世界数据可以包含间隙或空值。您可以使用 gap_policy 属性指定处理此类丢失数据的策略。您可以将 gap_policy 属性设置为 skip ,以跳过丢失的数据并从下一个可用值继续,或将 insert_zeros 设置为零,以将丢失的值替换为零并继续运行。
  • format: 输出值的格式类型。例如,yyyy-MM-dd 表示日期值。

样例 #

要对 sum_total_memory 聚合返回的所有存储桶求和,请执行以下操作:

GET kibana_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"
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "number_of_bytes" : {
    "buckets" : [
      {
        "key" : 0.0,
        "doc_count" : 13372,
        "sum_total_memory" : {
          "value" : 9.12664E7
        }
      },
      {
        "key" : 10000.0,
        "doc_count" : 702,
        "sum_total_memory" : {
          "value" : 0.0
        }
      }
    ]
  },
  "sum_copies" : {
    "value" : 9.12664E7
  }
}
...

管道聚合类型 #

管道聚合有两种类型:

同级聚合 #

同级聚合接受嵌套聚合的输出,并在与嵌套桶相同的级别上生成新桶或新聚合。

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

min_bucket , max_bucket , sum_bucket , and avg_bucket 是常用的同级聚合。

父级聚合 #

父聚合采用外部聚合的输出,并在与现有存储桶相同的级别生成新存储桶或新聚合。

父聚合必须将 min_doc_count 设置为 0 ( histogram 聚合的默认值),并且指定的度量必须是数值。如果 min_doc_count 大于 0 ,则会忽略某些存储桶,这可能会导致错误的结果。

derivativescumulative_sum 是常见的父聚合。

avg_bucket, sum_bucket, min_bucket, max_bucket #

avg_bucketsum_bucketmin_bucketmax_bucket 聚合是同级聚合,用于计算上一个聚合的每个存储桶中指标的平均值、总和、最小值和最大值。

下面的示例创建一个间隔为一个月的日期直方图。 sum 子聚合计算每个月所有字节的总和。最后, avg_bucket 聚合使用此总和来计算每月的平均字节数:

POST kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "visits_per_month": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "month"
      },
      "aggs": {
        "sum_of_bytes": {
          "sum": {
            "field": "bytes"
          }
        }
      }
    },
    "avg_monthly_bytes": {
      "avg_bucket": {
        "buckets_path": "visits_per_month>sum_of_bytes"
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "visits_per_month" : {
    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "sum_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "sum_of_bytes" : {
          "value" : 3.8880434E7
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "sum_of_bytes" : {
          "value" : 3.1445055E7
        }
      }
    ]
  },
  "avg_monthly_bytes" : {
    "value" : 2.6575229666666668E7
  }
}
...

以类似的方式,您可以计算每月字节数的 sum_bucketmin_bucketmax_bucket 值。

stats_bucket, extended_stats_bucket #

聚合是一个同级聚合,它返回前一个聚合的存储桶的各种统计信息(count , min , max , avg , sum )。

以下示例返回嵌套在 visits_per_month 聚合中的 sum_of_bytes 聚合返回的存储桶的基本统计信息:

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "visits_per_month": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "month"
      },
      "aggs": {
        "sum_of_bytes": {
          "sum": {
            "field": "bytes"
          }
        }
      }
    },
    "stats_monthly_bytes": {
      "stats_bucket": {
        "buckets_path": "visits_per_month>sum_of_bytes"
      }
    }
  }
}

返回示例 #

...
"stats_monthly_bytes" : {
  "count" : 3,
  "min" : 9400200.0,
  "max" : 3.8880434E7,
  "avg" : 2.6575229666666668E7,
  "sum" : 7.9725689E7
}
...

extended_stats 聚合是 stats 聚合的扩展版本。除了包括基本统计数据外, extended_stats 还提供 sum_of_squaresvariancestd_deviation 等统计数据。

返回示例 #

...
"stats_monthly_visits" : {
  "count" : 3,
  "min" : 9400200.0,
  "max" : 3.8880434E7,
  "avg" : 2.6575229666666668E7,
  "sum" : 7.9725689E7,
  "sum_of_squares" : 2.588843392021381E15,
  "variance" : 1.5670496550438025E14,
  "variance_population" : 1.5670496550438025E14,
  "variance_sampling" : 2.3505744825657038E14,
  "std_deviation" : 1.251818539183616E7,
  "std_deviation_population" : 1.251818539183616E7,
  "std_deviation_sampling" : 1.5331583357780447E7,
  "std_deviation_bounds" : {
    "upper" : 5.161160045033899E7,
    "lower" : 1538858.8829943463,
    "upper_population" : 5.161160045033899E7,
    "lower_population" : 1538858.8829943463,
    "upper_sampling" : 5.723839638222756E7,
    "lower_sampling" : -4087937.0488942266
   }
}
...

bucket_script, bucket_selector #

bucket_script 聚合是一个父聚合,它通过脚本执行上一个聚合的每个桶的计算。确保指标为数值类型,并且返回的值也是数值。

使用 script 参数添加脚本。脚本可以是内联的、文件中的或索引中的。要启用内联脚本,请将以下行添加到 config 文件夹中的 easysearch.yml 文件中:

script.inline: on

buckets_path 属性由多个条目组成。每个条目都是一个键和一个值。键是可在脚本中使用的值的名称。

基本语法为:

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

以下示例对日期直方图生成的存储桶使用“sum”聚合。根据生成的存储桶值,RAM 的百分比在 zip 扩展的上下文中以 10, 000 字节的间隔计算:

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "histogram": {
        "field": "bytes",
        "interval": "10000"
      },
      "aggs": {
        "total_ram": {
          "sum": {
            "field": "machine.ram"
          }
        },
        "ext-type": {
          "filter": {
            "term": {
              "extension.keyword": "zip"
            }
          },
          "aggs": {
            "total_ram": {
              "sum": {
                "field": "machine.ram"
              }
            }
          }
        },
        "ram-percentage": {
          "bucket_script": {
            "buckets_path": {
              "machineRam": "ext-type>total_ram",
              "totalRam": "total_ram"
            },
            "script": "params.machineRam / params.totalRam"
          }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "sales_per_month" : {
    "buckets" : [
      {
        "key" : 0.0,
        "doc_count" : 13372,
        "os-type" : {
          "doc_count" : 1558,
          "total_ram" : {
            "value" : 2.0090783268864E13
          }
        },
        "total_ram" : {
          "value" : 1.7214228922368E14
        },
        "ram-percentage" : {
          "value" : 0.11671032934131736
        }
      },
      {
        "key" : 10000.0,
        "doc_count" : 702,
        "os-type" : {
          "doc_count" : 116,
          "total_ram" : {
            "value" : 1.622423896064E12
          }
        },
        "total_ram" : {
          "value" : 9.015136354304E12
        },
        "ram-percentage" : {
          "value" : 0.17996665078608862
        }
      }
    ]
  }
}
...

RAM percentage 在每个存储桶的末尾计算并追加。

bucket_selector 聚合是基于脚本的聚合,它选择由 histogram (或 date_histogram )聚合返回的桶。在您不希望根据您提供的条件在输出中使用某些存储桶的情况下使用它。

bucket_selector 聚合执行脚本,以确定 bucket 是否保留在父多存储桶聚合中。

基本语法为:

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

下面的示例计算字节的总和,然后计算此总和是否大于 20,000。如果为 true,则存储桶将保留在存储桶列表中。否则,它将从最终输出中删除。

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "bytes_per_month": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_bytes": {
          "sum": {
            "field": "bytes"
          }
        },
        "bytes_bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "totalBytes": "total_bytes"
            },
            "script": "params.totalBytes > 20000"
          }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "bytes_per_month" : {
    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "total_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "total_bytes" : {
          "value" : 3.8880434E7
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "total_bytes" : {
          "value" : 3.1445055E7
        }
      }
    ]
  }
}
...

bucket_sort #

The bucket_sort 聚合是父聚合,用于对先前聚合的桶进行排序。

您可以指定多个排序字段以及相应的排序顺序。此外,您还可以根据每个存储桶的键、计数或其子聚合对每个存储桶进行排序。您还可以通过设置 fromsize 参数来截断存储桶。

Syntax

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

以下示例根据计算的 total_sum 值对 date_histogram 聚合的桶进行排序。我们按降序对桶进行排序,以便首先返回字节数最多的桶。

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_bytes": {
          "sum": {
            "field": "bytes"
          }
        },
        "bytes_bucket_sort": {
          "bucket_sort": {
            "sort": [
              { "total_bytes": { "order": "desc" } }
            ],
            "size": 3
          }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "sales_per_month" : {
    "buckets" : [
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "total_bytes" : {
          "value" : 3.8880434E7
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "total_bytes" : {
          "value" : 3.1445055E7
        }
      },
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "total_bytes" : {
          "value" : 9400200.0
        }
      }
    ]
  }
}
...

您还可以使用此聚合截断生成的桶而不进行排序。为此,只需使用 from 和 / 或 size 参数而不使用 sort

cumulative_sum #

accumulate_sum 聚合是一个父聚合,它计算上一个聚合的每个桶的累积和。

累积和是给定序列的部分和的序列。例如,序列 {a,b,c,...} 的累积和是 aa+ba+b+c 等等。您可以使用累积总和来可视化字段随时间的变化率。

以下示例计算每月的累积字节数:

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "no-of-bytes": {
          "sum": {
            "field": "bytes"
          }
        },
        "cumulative_bytes": {
          "cumulative_sum": {
            "buckets_path": "no-of-bytes"
          }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "sales_per_month" : {
    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "no-of-bytes" : {
          "value" : 9400200.0
        },
        "cumulative_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "no-of-bytes" : {
          "value" : 3.8880434E7
        },
        "cumulative_bytes" : {
          "value" : 4.8280634E7
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "no-of-bytes" : {
          "value" : 3.1445055E7
        },
        "cumulative_bytes" : {
          "value" : 7.9725689E7
        }
      }
    ]
  }
}
...

derivative #

The derivative 聚合是一个父聚合,计算前一个聚合的每个桶的一阶和二阶衍生。

在数学中,一个函数的导数衡量其对变化的敏感性。换句话说,导数评估的是某个函数相对于某个变量的变化率。要了解更多关于导数的信息,请参阅[维基百科](https://en.wikipedia.org/wiki/Derivative)。

你可以使用导数来计算数字值与它之前的时间段相比的变化率。

一阶导数表示一个指标是在增加还是减少,以及增加或减少的程度。

下面的例子计算了每个月的字节数之和的一阶导数。一阶导数是当前月的字节数与上月的字节数之差。

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "number_of_bytes": {
          "sum": {
            "field": "bytes"
          }
        },
        "bytes_deriv": {
          "derivative": {
            "buckets_path": "number_of_bytes"
          }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "sales_per_month" : {
    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "number_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "number_of_bytes" : {
          "value" : 3.8880434E7
        },
        "bytes_deriv" : {
          "value" : 2.9480234E7
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "number_of_bytes" : {
          "value" : 3.1445055E7
        },
        "bytes_deriv" : {
          "value" : -7435379.0
        }
      }
    ]
  }
}
...

二阶导数是一个双导数或导数的导数。 它表明一个量的变化率本身是如何变化的。它是相邻桶的一阶导数之差。

要计算二阶导数,要把一个导数聚合链到另一个。

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "number_of_bytes": {
          "sum": {
            "field": "bytes"
          }
        },
        "bytes_deriv": {
          "derivative": {
            "buckets_path": "number_of_bytes"
          }
        },
        "bytes_2nd_deriv": {
          "derivative": {
            "buckets_path": "bytes_deriv"
          }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "sales_per_month" : {
    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "number_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "number_of_bytes" : {
          "value" : 3.8880434E7
        },
        "bytes_deriv" : {
          "value" : 2.9480234E7
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "number_of_bytes" : {
          "value" : 3.1445055E7
        },
        "bytes_deriv" : {
          "value" : -7435379.0
        },
        "bytes_2nd_deriv" : {
          "value" : -3.6915613E7
        }
      }
    ]
  }
}
...

第一个桶没有一阶导数,因为导数需要至少两个点进行比较。第一个和第二个桶没有二阶导数,因为二阶导数需要至少两个一阶导数的数据点。

“2020-11-01” 桶的一阶导数是 2.9480234E7,“2020-12-01” 桶是 -7435379。因此,“2020-12-01” 桶的二阶导数是 -3.6915613E7(-7435379-2.9480234E7)。

理论上,你可以继续用链式导数聚合来计算三阶、四阶,甚至更高阶的导数。然而,这对大多数数据集来说,几乎没有任何价值。

moving_avg #

A moving_avg 聚合是一个计算移动平均指标的父聚合。

The moving_avg 聚合找到数据集的不同窗口(子集)的平均数系列。一个窗口的大小代表了每个迭代中窗口所覆盖的数据点的数量(由 window 属性指定,默认设置为 5)。在每次迭代中,算法计算适合窗口的所有数据点的平均值,然后通过排除前一个窗口的第一个成员并包括下一个窗口的第一个成员来向前滑动。

例如,给定数据 [1, 5, 8, 23, 34, 28, 7, 23, 20, 19] ,你可以计算出窗口大小为 5 的简单移动平均线,如下所示。

(1 + 5 + 8 + 23 + 34) / 5 = 14.2
(5 + 8 + 23 + 34+ 28) / 5 = 19.6
(8 + 23 + 34 + 28 + 7) / 5 = 20
so on...

更多信息,见 维基百科

你可以使用 moving_avg 聚合来平滑短期波动,或者突出时间序列数据中的长期趋势或周期。

指定一个紧跟数据的小窗口大小(例如, window :10),以平滑小范围的波动。 或者,指定一个较大的窗口尺寸(例如, window :100),滞后于实际数据很多,以平滑所有高频率的波动或随机噪音,使低频率的趋势更加明显。

下面的例子将一个 moving_avg 聚合嵌套到一个 date_histogram 聚合中。

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "my_date_histogram": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_of_bytes": {
          "sum": { "field": "bytes" }
        },
        "moving_avg_of_sum_of_bytes": {
          "moving_avg": { "buckets_path": "sum_of_bytes" }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "my_date_histogram" : {

    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "sum_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "sum_of_bytes" : {
          "value" : 3.8880434E7
        },
        "moving_avg_of_sum_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "sum_of_bytes" : {
          "value" : 3.1445055E7
        },
        "moving_avg_of_sum_of_bytes" : {
          "value" : 2.4140317E7
        }
      }
    ]
  }
 }
...

你也可以使用 moving_avg 聚合来预测未来的桶。 要预测水桶,添加 predict 属性,并将其设置为你想看到的预测数量。

下面的例子在前面的查询中增加了五个预测值。

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "my_date_histogram": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_of_bytes": {
          "sum": {
            "field": "bytes"
          }
        },
        "moving_avg_of_sum_of_bytes": {
          "moving_avg": {
            "buckets_path": "sum_of_bytes",
            "predict": 5
          }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "my_date_histogram" : {
    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "sum_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "sum_of_bytes" : {
          "value" : 3.8880434E7
        },
        "moving_avg_of_sum_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "sum_of_bytes" : {
          "value" : 3.1445055E7
        },
        "moving_avg_of_sum_of_bytes" : {
          "value" : 2.4140317E7
        }
      },
      {
        "key_as_string" : "2021-01-01T00:00:00.000Z",
        "key" : 1609459200000,
        "doc_count" : 0,
        "moving_avg_of_sum_of_bytes" : {
          "value" : 2.6575229666666668E7
        }
      },
      {
        "key_as_string" : "2021-02-01T00:00:00.000Z",
        "key" : 1612137600000,
        "doc_count" : 0,
        "moving_avg_of_sum_of_bytes" : {
          "value" : 2.6575229666666668E7
        }
      },
      {
        "key_as_string" : "2021-03-01T00:00:00.000Z",
        "key" : 1614556800000,
        "doc_count" : 0,
        "moving_avg_of_sum_of_bytes" : {
          "value" : 2.6575229666666668E7
        }
      },
      {
        "key_as_string" : "2021-04-01T00:00:00.000Z",
        "key" : 1617235200000,
        "doc_count" : 0,
        "moving_avg_of_sum_of_bytes" : {
          "value" : 2.6575229666666668E7
        }
      },
      {
        "key_as_string" : "2021-05-01T00:00:00.000Z",
        "key" : 1619827200000,
        "doc_count" : 0,
        "moving_avg_of_sum_of_bytes" : {
          "value" : 2.6575229666666668E7
        }
      }
    ]
  }
}
...

moving_avg 聚合支持五种模型 - simple , linear , exponentially weighted , holt-linear , 和 holt-winters 。这些模型的不同之处在于如何对窗口的值进行加权。随着数据点变得 “older”(即窗口从它们身上滑过),它们的权重可能不同。你可以通过设置 model 属性来指定你选择的模型。 model 属性持有模型的名称和 settings 对象,你可以用它来提供模型属性。关于这些模型的更多信息,请参阅 Wikipedia

一个 simple 模型首先计算窗口中所有数据点的总和,然后将这个总和除以窗口的大小。换句话说, simple 模型为你的数据集中的每个窗口计算一个简单的算术平均值。

下面的例子使用了一个窗口大小为 30 的简单模型。

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "my_date_histogram": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_of_bytes": {
          "sum": {
            "field": "bytes"
          }
        },
        "moving_avg_of_sum_of_bytes": {
          "moving_avg": {
            "buckets_path": "sum_of_bytes",
            "window": 30,
            "model": "simple"
          }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "my_date_histogram" : {
    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "sum_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "sum_of_bytes" : {
          "value" : 3.8880434E7
        },
        "moving_avg_of_sum_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "sum_of_bytes" : {
          "value" : 3.1445055E7
        },
        "moving_avg_of_sum_of_bytes" : {
          "value" : 2.4140317E7
        }
      }
    ]
  }
}
...

下面的例子使用了一个 holt 模型。你可以通过 alphabeta 的设置来设置重要性衰减的速度。 alpha 的默认值是 0.3 , beta 是 0.1 。你可以指定 0-1(含)之间的任何浮动值。

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "my_date_histogram": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_of_bytes": {
          "sum": {
            "field": "bytes"
          }
        },
        "moving_avg_of_sum_of_bytes": {
          "moving_avg": {
            "buckets_path": "sum_of_bytes",
            "model": "holt",
            "settings": {
              "alpha": 0.6,
              "beta": 0.4
            }
          }
        }
      }
    }
  }
}

返回示例 #

...
"aggregations" : {
  "my_date_histogram" : {
    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "sum_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "sum_of_bytes" : {
          "value" : 3.8880434E7
        },
        "moving_avg_of_sum_of_bytes" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "sum_of_bytes" : {
          "value" : 3.1445055E7
        },
        "moving_avg_of_sum_of_bytes" : {
          "value" : 2.70883404E7
        }
      }
    ]
  }
}
...

serial_diff #

serial_diff 聚合是一个父管道聚合,它计算了一系列来自以前聚合的桶的时间滞后的值差异。

你可以使用 serial_diff 聚合来查找时间段之间的数据变化,而不是查找整个值。

通过 lag 参数(一个正的、非零的整数值),你可以告诉你要从当前的桶中减去哪个前一个桶。如果你不指定 lag 参数, Easysearch 将它设置为 1。

假设一个城市的人口随时间增长。如果你使用以一天为周期的序列差分聚合,你可以看到每天的增长。例如,你可以计算一个总价格的每周平均变化的一系列差值。

GET kibana_sample_data_logs/_search
{
   "size": 0,
   "aggs": {
      "my_date_histogram": {
         "date_histogram": {
            "field": "@timestamp",
            "calendar_interval": "month"
         },
         "aggs": {
            "the_sum": {
               "sum": {
                  "field": "bytes"
               }
            },
            "thirtieth_difference": {
               "serial_diff": {
                  "buckets_path": "the_sum",
                  "lag" : 30
               }
            }
         }
      }
   }
}

返回示例 #

...
"aggregations" : {
  "my_date_histogram" : {
    "buckets" : [
      {
        "key_as_string" : "2020-10-01T00:00:00.000Z",
        "key" : 1601510400000,
        "doc_count" : 1635,
        "the_sum" : {
          "value" : 9400200.0
        }
      },
      {
        "key_as_string" : "2020-11-01T00:00:00.000Z",
        "key" : 1604188800000,
        "doc_count" : 6844,
        "the_sum" : {
          "value" : 3.8880434E7
        }
      },
      {
        "key_as_string" : "2020-12-01T00:00:00.000Z",
        "key" : 1606780800000,
        "doc_count" : 5595,
        "the_sum" : {
          "value" : 3.1445055E7
        }
      }
    ]
  }
}
...