这是一种多值指标聚合,用于计算聚合文档提取值的1个或多个百分位排名.
其值既可通过文档中的数字字段提取,也可以通过脚本来生成。
注意
请参考百分位是近似估算和压缩来了解百分位排名聚合的相关使用建议。
百分位排名用于计算那些低于特定值的观测值百分比。
例如,如果值大于等于观察值的95%,那么就可以称其95th百分位排名.
假设数据由网页加载时间所组成。
假设服务协议为:95%的页面须在500毫秒内完全加载,99%的页面须在600毫秒内加载完成。
下面让我们看一下加载时间的百分位范围:
GET latency/data/_search
{
"size": 0,
"aggs" : {
"load_time_ranks" : {
"percentile_ranks" : {
"field" : "load_time", #1
"values" : [500, 600]
}
}
}
}
1 load_time必须是数字字段。
其响应类似于:
{
...
"aggregations": {
"load_time_ranks": {
"values" : {
"500.0": 55.00000000000001,
"600.0": 64.0
}
}
}
}
通过这些信息,可确定达到了99%的加载时间目标,但没有完全达到95%的加载时间目标。
Keyed Response
默认keyed为true,这会将不同字符串键与每个bucket相关联,并且响应会以hash(非数组)形式返回。
将keyed标志设置为false可禁用此行为:
GET latency/data/_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": 55.00000000000001
},
{
"key": 600.0,
"value": 64.0
}
]
}
}
}
Script
百分位排名指标支持脚本。例如,之间加载时间是以毫秒为单位,但现在我们要以秒为单位。
要实现这一点,则可通过脚本来动态转换:
GET latency/data/_search
{
"size": 0,
"aggs" : {
"load_time_ranks" : {
"percentile_ranks" : {
"values" : [500, 600],
"script" : {
"lang": "painless",
"source": "doc['load_time'].value / params.timeUnit", #1
"params" : {
"timeUnit" : 1000 #2
}
}
}
}
}
}
1 字段参数会被脚本参数所替换,它会使用脚本来生成百分位排名的计算值
2 像其它脚本一样,脚本支持参数化输入
这会使用painless脚本语言来将script参数解析为内联脚本(不带脚本参数)。
可通过如下语法来使用存储脚本:
GET latency/data/_search
{
"size": 0,
"aggs" : {
"load_time_ranks" : {
"percentile_ranks" : {
"values" : [500, 600],
"script" : {
"id": "my_script",
"params": {
"field": "load_time"
}
}
}
}
}
}
HDR Histogram
注意
这里虽然公开了HDR Histogram的内部实现,但其语法可能会在将来发生改变。
HDR Histogram (High Dynamic Range Histogram) 是计算百分位排名的替代实现。
它在计算延迟测量的百分位排名时非常有用,因为它的实现比t-digest更快(以内存消耗为代价)。
此实现能稳定最坏情况下的百分比错误(指定为有效位数)。也就是说,如果在直方图中以1微秒到1小时(3600000000微秒)间的数据进行记录,且设为3个有效数字,则对于高达1毫秒的值,其值分辨率将保持为1微秒;而对于最大跟踪值(1小时),其值分辨率将保持为3.6秒(或更好)。
可在请求中指定method参数来使用HDR Histogram:
GET latency/data/_search
{
"size": 0,
"aggs" : {
"load_time_ranks" : {
"percentile_ranks" : {
"field" : "load_time",
"values" : [500, 600],
"hdr": { #1
"number_of_significant_value_digits" : 3 #2
}
}
}
}
}
1 hdr对象表示使用HDR Histogram来计算百分位排名,并且还可在该对象内指定该算法的特定设置。
2 number_of_significant_value_digits可用来指定直方图的有效位个数。
HDR Histogram只支持正值,如果传递负值,则会出错。
如果值的范围未知,则最好不要使用HDR Histogram,因为这可能会导致非常高的内存消耗。
Missing value
missing 参数用于定义如何处理文档中的缺失值。
默认,它会忽略缺失值,但也可以将其视为有值字段。
GET latency/data/_search
{
"size": 0,
"aggs" : {
"load_time_ranks" : {
"percentile_ranks" : {
"field" : "load_time",
"values" : [500, 600],
"missing": 10 #1
}
}
}
}
1 对于包含缺失值的load_time字段,其所属文档会与值为10的文档放在同一个桶内。
全部指标聚合,请参考
单值指标聚合
多值指标聚合
地理位置相关聚合
可执行Map-Reduce计算的聚合