百分位排名聚合编辑

一个 multi-value 度量聚合,它计算从聚合文档中提取的数值的一个或多个百分位排名。这些值可以从文档中的特定数值或 直方图字段 中提取。

请参阅 百分位数通常是近似的压缩执行提示,以获取有关百分位排名聚合的近似值、性能和内存使用的建议。

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

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

让我们看一下代表加载时间的百分位数范围

response = client.search(
  index: 'latency',
  body: {
    size: 0,
    aggregations: {
      load_time_ranks: {
        percentile_ranks: {
          field: 'load_time',
          values: [
            500,
            600
          ]
        }
      }
    }
  }
)
puts response
GET latency/_search
{
  "size": 0,
  "aggs": {
    "load_time_ranks": {
      "percentile_ranks": {
        "field": "load_time",   
        "values": [ 500, 600 ]
      }
    }
  }
}

字段 load_time 必须是数值字段

响应将如下所示

{
  ...

 "aggregations": {
    "load_time_ranks": {
      "values": {
        "500.0": 55.0,
        "600.0": 64.0
      }
    }
  }
}

从这些信息中,您可以确定您正在达到 99% 的加载时间目标,但尚未达到 95% 的加载时间目标。

带键的响应编辑

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

response = client.search(
  index: 'latency',
  body: {
    size: 0,
    aggregations: {
      load_time_ranks: {
        percentile_ranks: {
          field: 'load_time',
          values: [
            500,
            600
          ],
          keyed: false
        }
      }
    }
  }
)
puts response
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": 55.0
        },
        {
          "key": 600.0,
          "value": 64.0
        }
      ]
    }
  }
}

脚本编辑

如果您需要对未索引的值运行聚合,请使用 运行时字段。例如,如果我们的加载时间以毫秒为单位,但我们希望以秒为单位计算百分位数

response = client.search(
  index: 'latency',
  body: {
    size: 0,
    runtime_mappings: {
      'load_time.seconds' => {
        type: 'long',
        script: {
          source: "emit(doc['load_time'].value / params.timeUnit)",
          params: {
            "timeUnit": 1000
          }
        }
      }
    },
    aggregations: {
      load_time_ranks: {
        percentile_ranks: {
          values: [
            500,
            600
          ],
          field: 'load_time.seconds'
        }
      }
    }
  }
)
puts response
GET latency/_search
{
  "size": 0,
  "runtime_mappings": {
    "load_time.seconds": {
      "type": "long",
      "script": {
        "source": "emit(doc['load_time'].value / params.timeUnit)",
        "params": {
          "timeUnit": 1000
        }
      }
    }
  },
  "aggs": {
    "load_time_ranks": {
      "percentile_ranks": {
        "values": [ 500, 600 ],
        "field": "load_time.seconds"
      }
    }
  }
}

HDR 直方图编辑

HDR 直方图(高动态范围直方图)是一种替代实现,在计算延迟测量的百分位排名时非常有用,因为它比 t-digest 实现更快,但内存占用更大。此实现维护一个固定的最坏情况百分比误差(指定为有效数字的数量)。这意味着,如果在直方图中记录了从 1 微秒到 1 小时(3,600,000,000 微秒)的值,并将直方图设置为 3 位有效数字,它将为高达 1 毫秒的值维护 1 微秒的值分辨率,并为最大跟踪值(1 小时)维护 3.6 秒(或更好)的值分辨率。

可以通过在请求中指定 hdr 对象来使用 HDR 直方图

response = client.search(
  index: 'latency',
  body: {
    size: 0,
    aggregations: {
      load_time_ranks: {
        percentile_ranks: {
          field: 'load_time',
          values: [
            500,
            600
          ],
          hdr: {
            number_of_significant_value_digits: 3
          }
        }
      }
    }
  }
)
puts response
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 参数定义了如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值。

response = client.search(
  index: 'latency',
  body: {
    size: 0,
    aggregations: {
      load_time_ranks: {
        percentile_ranks: {
          field: 'load_time',
          values: [
            500,
            600
          ],
          missing: 10
        }
      }
    }
  }
)
puts response
GET latency/_search
{
  "size": 0,
  "aggs": {
    "load_time_ranks": {
      "percentile_ranks": {
        "field": "load_time",
        "values": [ 500, 600 ],
        "missing": 10           
      }
    }
  }
}

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