Percentile Ranks Aggregation
Percentile Ranks Aggregation
一个multi-value指标聚合,它通过从聚合文档中提取数值来计算一个或多个百分比。这些值可以从特定数值字段中提取,也可以由提供的脚本生成。
注意:请参考百分比(通常)近视值(percentiles are (usually approximate))和压缩(Compression)以获得关于近视值的建议和内存使用的百分比排位聚合。
百分比排位展示那些在某一值之下的观测值的百分比。例如,假如某一直大于等于被观测值的95%,则称其为第95百分位数。
假设你的数据由网页加载时间组成。你可能有一个服务协议,95%页面需要在15ms加载完全,99%页面在30ms加载完全。
让我们看一下代表加载时间的百分位数:
{ "aggs" : { "load_time_outlier" : { "percentile_ranks" : { "field" : "load_time", 【1】 "values" : [15, 30] } } } }
【1】load_time必须是一个数值字段
应答看起来像这个样子:
{ ... "aggregations": { "load_time_outlier": { "values" : { "15": 92, "30": 100 } } } }
从这些信息你可以确定,你已经达到了99%的加载时间目标,但没有达到95%的加载时间目标。
Script
百分位数度量支持脚本。例如,假如加载时间是在毫秒级,当我们想指定值在秒级,我们可以使用脚本来实时转化它们:
{ "aggs" : { "load_time_outlier" : { "percentile_ranks" : { "values" : [3, 5], "script" : { "lang": "painless", "inline": "doc['load_time'].value / params.timeUnit", 【1】 "params" : { "timeUnit" : 1000 【2】 } } } } } }
【1】field参数被一个script参数替代,使用脚本生成计算百分位数的值。
【2】脚本支持参数化输入,就像其它任何脚本一样
通过painless脚本语言和无脚本参数将script参数翻译为一个inline脚本。要使用文件脚本,使用以下语法:
{ "aggs" : { "load_time_outlier" : { "percentile_ranks" : { "values" : [3, 5], "script" : { "file": "my_script", "params" : { "timeUnit" : 1000 } } } } } }
TIP:索引脚本通过id参数替代file参数
HDR Histogram
警告:该功能是实验性的,并且在将来的版本中可能被修改或者完全移除。Elastic采用最大努力来解决任何问题,但是试验功能不受SLA官方GA功能的支持。
HDR Histogram(高动态范围柱状图)是一种替代实现,在计算延迟测量的百分比数量级时可能很有用,因为它比t-digest实现更快,同时占用更大的内存空间。该实现维持固定的较差的百分比错误(指定为有效数字的数量)。这意味着如果在柱状图中设置3位有效数字的数据被记录在1微妙至1小时(3600,000,000微妙)之间,它将保持从1微妙值增加到为最大跟踪值(1小时)保留1毫秒和3.6分钟(或更好)分辨率。
HDR Histogram可以通过在request中指定method参数来使用:
{ "aggs" : { "load_time_outlier" : { "percentile_ranks" : { "field" : "load_time", "values" : [15, 30], "hdr": { 【1】 "number_of_significant_value_digits" : 3 【2】 } } } } }
【1】hdr对象表示应该使用HRD Histogram来计算百分位数,并且可以在对象内部指定该算法的具体设置。
【2】number_of_significant_value_digits表示以有效数字值表示柱状图的分辨率。
HDR Histogram仅仅支持绝对值,假如传递的是一个相对值则将错误。假如值范围不知道,使用HDR Histogram也不是一个好的主意,因为它将导致高内存使用。
Missing value
missing参数定义该如何处理缺省值的文档。默认情况下,他们将被忽略,但是假如他们已经有一个值了,它也可能被处理。
{ "aggs" : { "grade_ranks" : { "percentile_ranks" : { "field" : "grade", "missing": 10 【1】 } } } }
【1】在grade字段中没有值的文档将和有值10的文档放入相同的bucket中。