本地英文版地址: ../en/search-aggregations-metrics-boxplot-aggregation.html
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"
}
}
}
}
响应看起来会像下面这样:
{
...
"aggregations": {
"load_time_boxplot": {
"min": 0.0,
"max": 990.0,
"q1": 165.0,
"q2": 445.0,
"q3": 725.0
}
}
}
箱线图度量支持脚本。 例如,如果加载时间(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
}
}
}
}
}
}
这将把参数 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 来控制:
GET latency/_search
{
"size": 0,
"aggs" : {
"load_time_boxplot" : {
"boxplot" : {
"field" : "load_time",
"compression" : 200
}
}
}
}
TDigest算法使用多个“节点”来近似百分位数,可用的节点越多,与数据量成比例的精度(和大内存占用)就越高。
参数 compression 将最大节点数限制为 20 * compression。
因此,通过增加 compression 的值,可以以更多内存为代价来提高百分位数的准确性。
较大的 compression 值也会使算法变慢,因为底层树数据结构的大小会增加,从而导致更昂贵的操作。
compression 的默认值为 100。
一个“节点”使用大约 32 字节的内存,因此在最坏的情况下(大量数据被排序并按顺序到达),默认设置将产生大约 64KB 大小的 TDigest。 实际上,数据往往更加随机,TDigest 将使用更少的内存。