這是一種多值指標聚合,用於計算聚合文檔提取值的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計算的聚合
閱讀更多 Java源 的文章