箱线图(boxplot)聚合

boxplot 度量聚合,计算从聚合文档中提取的数值的箱线图。 这些值可以由给定的脚本生成,也可以从文档中的特定 numeric 或 histogram 字段中提取。

boxplot 聚合返回制作箱线图(box plot)的基本信息:最小值、最大中值、第一个四分位数(第25个百分位数)和第三个四分位数(第75个百分位数)值。

语法

孤立的 boxplot 聚合如下所示:

{
    "boxplot": {
        "field": "load_time"
    }
}

让我们来看一个表示加载时间(load time)的箱线图:

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_boxplot" : {
            "boxplot" : {
                "field" : "load_time" 
            }
        }
    }
}

字段 load_time 必须是 numeric 类型的。

响应看起来会像下面这样:

{
    ...

   "aggregations": {
      "load_time_boxplot": {
         "min": 0.0,
         "max": 990.0,
         "q1": 165.0,
         "q2": 445.0,
         "q3": 725.0
      }
   }
}

脚本(script)

箱线图度量支持脚本。 例如,如果加载时间(load time)是以毫秒为单位的,但我们希望以秒为单位进行计算,这时我们就可以使用一个脚本来动态转换它们:

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_boxplot" : {
            "boxplot" : {
                "script" : {
                    "lang": "painless",
                    "source": "doc['load_time'].value / params.timeUnit", 
                    "params" : {
                        "timeUnit" : 1000   
                    }
                }
            }
        }
    }
}

参数 field 被替换为 script ,这个 script 参数使用脚本来生成计算百分点的值

脚本支持参数化输入,就像任何其他脚本一样

这将把参数 script 解释为一个内联脚本,使用painless(无痛)脚本语言,没有脚本参数。 要使用一个已存储的脚本,请使用以下语法:

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_boxplot" : {
            "boxplot" : {
                "script" : {
                    "id": "my_script",
                    "params": {
                        "field": "load_time"
                    }
                }
            }
        }
    }
}

箱线图的值(通常)是近似值

boxplot 度量使用的算法称为 TDigest (由 Ted Dunning 在使用T-Digests计算精确分位数中引入)。

箱线图与其他百分位数聚合一样,也是不确定的(non-deterministic)。这意味着您可以使用相同的数据得到稍微不同的结果。 这意味着使用相同的数据会得到稍微不同的结果。

压缩(compression)

近似算法必须平衡内存利用率和估计精度。 这种平衡可以使用参数 compression 来控制:

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_boxplot" : {
            "boxplot" : {
                "field" : "load_time",
                "compression" : 200 
            }
        }
    }
}

compression 控制内存使用和近似误差

TDigest算法使用多个“节点”来近似百分位数,可用的节点越多,与数据量成比例的精度(和大内存占用)就越高。 参数 compression 将最大节点数限制为 20 * compression

因此,通过增加 compression 的值,可以以更多内存为代价来提高百分位数的准确性。 较大的 compression 值也会使算法变慢,因为底层树数据结构的大小会增加,从而导致更昂贵的操作。 compression 的默认值为 100

一个“节点”使用大约 32 字节的内存,因此在最坏的情况下(大量数据被排序并按顺序到达),默认设置将产生大约 64KB 大小的 TDigest。 实际上,数据往往更加随机,TDigest 将使用更少的内存。

缺失的值

参数 missing 定义应该如何处理有缺失值的文档。 默认情况下,它们会被忽略,但也可以将它们视为有一个(默认)值。

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "grade_boxplot" : {
            "boxplot" : {
                "field" : "grade",
                "missing": 10 
            }
        }
    }
}

grade 字段中没有值的文档将与值为 10 的文档落入同一个桶。