跳到主要内容

百分比排名聚合 percentile_ranks

Percentile Ranks Aggregation

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

百分比排名显示低于某个值的观察值的百分比。例如,如果值大于或等于观察值的95%,则称其处于第95百分位。

假设您的数据包含网站加载时间。您可能有一个服务协议,即95%的页面加载在500ms内完成,99%的页面加载是在600ms内完成。

让我们看一下表示加载时间的百分比范围:

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

返回结果

{
...

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

根据这些信息,您可以确定您达到了99%的load_time目标,但还没有达到95%的load time

Keyed Response

默认情况下,keyed标志设置为true将一个唯一的字符串键与每个bucket相关联,并将范围作为哈希而不是数组返回。将键控标志设置为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
}
]
}
}
}

Script

百分比等级度量支持脚本。例如,如果我们的加载时间以毫秒为单位,但我们希望以秒为单位指定值,那么我们可以使用脚本动态转换它们:

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
}
}
}
}
}
}
  1. field参数替换为脚本参数,该参数使用脚本生成计算百分位等级的值
  2. 与任何其他脚本一样,脚本支持参数化输入

这将把脚本参数解释为具有painless脚本语言且没有脚本参数的inline script。要使用存储的脚本,请使用以下语法:

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

HDR Histogram

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