Elasticsearch:Moving average aggregation 介绍

给定一系列有序的数据,移动平均值聚合将在数据上滑动一个窗口,并发出该窗口的平均值。 例如,给定数据 [1、2、3、4、5、6、7、8、9、10],我们可以计算出窗口大小为 5 的简单移动平均值,如下所示:

(1 + 2 + 3 + 4 + 5) / 5 = 3
(2 + 3 + 4 + 5 + 6) / 5 = 4
(3 + 4 + 5 + 6 + 7) / 5 = 5

其它

移动平均值是一种平滑顺序数据的简单方法。 移动平均值通常应用于基于时间的数据,例如股票价格或服务器指标。 平滑可用于消除高频波动或随机噪声,从而使低频趋势更容易可视化,例如季节性。在这里我必须指出的是 Moving average aggregation 它是一个 pipeline aggregation。也就是它必须使用另外一个 aggregation 的结果,并在它的基础之上再进行聚合。如果你对 pipeline aggregation 还不是很熟的话,请参阅我之前的文章 “Elasticsearch:pipeline aggregation 介绍”。

下面我们用一个例子来说明如何使用。另外,我将展示如何在 Kibana 中定制 Moving average aggregation。

 

准备数据

在今天的展示中,我们将使用 Kibana  自带的数据来做演示。打开 Kibana:

点击 Add data 按钮:

这样我们的索引 kibana_sample_data_logs 就被加载到  Elasticsearch 中了。

 

创建一个 Moving average aggregation

打开 Kibana:

 

选择合适的 time picker,然后在 X 轴上选择 Date histogram,并点击 Update。接下来我们来把这个 bar 的显示修改为 line,这样更便于展示。点击 Metrics & Axes:

我们接下来添加另外一个 Moving average aggregation 的聚合。点击 Data,并添加第二 Y 轴:

点击上面的 Update 按钮:

在上面,我们可以看见另外一条曲线显示出来了。它清楚地表明了一个 count 的变化趋势。这个 Moving average aggregation 是基于之前的 count 来计算的,也就是每个 bucket 里的文档的数量,也是另外一个聚合。这天蓝色的线比之前的那个 绿色的线显然更加平滑一些。如果我想知道这个曲线的请求到底是怎么来的。我们可以按照如的步骤来做:

我们首先点击左上角的 Inspect,然后点击 View: data:

点击 Request,我们就可以看到这个请求的具体的命令是什么。我们点击上面的拷贝图标,并把内容粘贴到 Kibana 里的 console 中:

从上面我们可以看出来:针对这个 moving_fn 的聚合,它其实是有配置的参数的: window 及 script。我可以参照文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-movfn-aggregation.html 来进行详细地了解。我们甚至可以对其中的参数 window 来进行配置。从上面我们可以看出来:它的默认 window 大小是 5。假如我们想把它配置为 10 的话,这样的曲线可能根据平滑,当然它也会过滤掉一下细节。假如我们想这么办,那么我们该如何定制这个 Moving average aggregation 呢?

 

定制 Moving average aggregation

我们点击 Advanced:

 

然后,我们配置一个参数叫做 window 为 10 的参数。然后曲线就变成上面的样子。显然这个比之前的那个要平滑很多。

当然我们甚至可以更进一步定制:

{
    "window": 10,
    "script": "MovingFunctions.linearWeightedAvg(values)"
}

关于 linearWeightedAvg 的描述,我们可以参照 Elastic 的官方文档。linearWeightedAvg 函数将线性权重分配给系列中的点,这样“较旧”的数据点(例如,窗口开始处的那些)对总平均值的贡献就较小。 线性加权有助于减少数据均值的“滞后”,因为较早的点影响较小。我们从上面的这个图中可以看出来,它比之前的那个图更体现出来一些细节。

好了,今天的教程就写到这里。希望大家能学到东西!