百分位排名聚合
编辑百分位排名聚合编辑
一个 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 ] } } } }
响应将如下所示
{ ... "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 直方图,因为这会导致高内存使用率。
缺失值编辑
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