percentile_ranks 聚合

一个 multi-value(多值) 度量聚合,计算从聚合文档中提取的数值的一个或多个百分位数排名。 这些值可以由给定的脚本生成,也可以从文档中的特定数值或 histogram 字段 中提取。

要了解有关百分位等级聚合(percentile ranks aggregation)的近似值和内存使用的建议,请参阅百分位(通常)是近似值压缩

百分位数等级显示低于特定值的观察值的百分比。 例如,如果一个值大于或等于所有观察值中的95%,则称其处于第95百分位。

假设数据由网站加载时间组成。 可能有一个服务协议,内容是95%的页面加载在500毫秒内完成,99%的页面加载在600毫秒内完成。

让我们看看代表加载时间(load_time)的百分比范围:

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_ranks" : {
            "percentile_ranks" : {
                "field" : "load_time", 
                "values" : [500, 600]
            }
        }
    }
}

字段 load_time 必须是 numeric 类型的

响应将如下所示:

{
    ...

   "aggregations": {
      "load_time_ranks": {
         "values" : {
            "500.0": 90.01,
            "600.0": 100.0
         }
      }
   }
}

根据这些信息,可以确定达到了99%的加载时间目标,但没有完全达到95%的加载时间目标(在500毫秒内加载完成的只达到了90.01%)

keyed 响应

默认情况下,keyed 标志设置为 true,它将唯一的字符串键与每个桶相关联,并将范围作为哈希而不是数组返回。 将 keyed 标志设置为 false 将禁用此行为:

GET latency/_search
{
    "size": 0,
    "aggs": {
        "load_time_ranks": {
            "percentile_ranks": {
                "field": "load_time",
                "values": [500, 600],
                "keyed": false
            }
        }
    }
}

响应:

{
    ...

    "aggregations": {
        "load_time_ranks": {
            "values": [
                {
                    "key": 500.0,
                    "value": 90.01
                },
                {
                    "key": 600.0,
                    "value": 100.0
                }
            ]
        }
    }
}

脚本

百分位数等级度量支持脚本。 例如,如果加载时间是以毫秒为单位的,但我们希望以秒为单位提供值,我们可以使用一个脚本来进行动态转换:

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_ranks" : {
            "percentile_ranks" : {
                "values" : [500, 600],
                "script" : {
                    "lang": "painless",
                    "source": "doc['load_time'].value / params.timeUnit", 
                    "params" : {
                        "timeUnit" : 1000   
                    }
                }
            }
        }
    }
}

参数 field 被替换为 script,它使用脚本来生成计算百分位等级的值

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

这将使用 painless(无痛) 脚本语言,没有脚本参数。 要使用存储的脚本,请使用以下语法:

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_ranks" : {
            "percentile_ranks" : {
                "values" : [500, 600],
                "script" : {
                    "id": "my_script",
                    "params": {
                        "field": "load_time"
                    }
                }
            }
        }
    }
}

HDR 直方图(Histogram)

此设置公开了 HDR 直方图的内部实现,语法将来可能会改变。

HDR直方图 (High Dynamic Range Histogram, 高动态范围直方图)是一种替代实现,在计算延迟测量的百分位等级时非常有用,因为它比 t-digest 实现更快,但需要更大的内存。 这种实现保持固定的最坏情况百分比误差(指定为有效数字的数量)。 这意味着,如果在设置为 3 个有效数字的直方图中记录的数据值从 1 微秒到 1 小时(3,600,000,000微秒),则对于 1 毫秒和 3.6 秒(或更好)的最大跟踪值(1小时),它将保持 1 微秒的值分辨率。

通过在请求中指定参数 method,可以使用 HDR 直方图:

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_ranks" : {
            "percentile_ranks" : {
                "field" : "load_time",
                "values" : [500, 600],
                "hdr": { 
                  "number_of_significant_value_digits" : 3 
                }
            }
        }
    }
}

hdr 对象表示应该使用HDR直方图来计算百分位数,并且可以在对象内部指定该算法的特定设置

number_of_significant_value_digits 指定直方图数值的分辨率,以有效位数表示

HDR 直方图仅支持正值,如果向其传递负值,将会出错。 如果值的范围未知,使用HDR 直方图也不是一个好主意,因为这可能会导致很高的内存使用率。

缺失的值

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

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_ranks" : {
            "percentile_ranks" : {
                "field" : "load_time",
                "values" : [500, 600],
                "missing": 10 
            }
        }
    }
}

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