我嘗試為索引中的每個檔案計算速率函式rate(val,ts)= v2-v1/t2-t1。
我的映射格式為:{"name":keyword","value":"double","timestamp":"integer"}。
例如,如果我的索引中有 2 個檔案:
doc1:{"name":name1,"value":5,"timestamp":2 } doc2: {name":name1,"value":10,"timestamp":3 } ,
我需要得到 result(ts=3) = (10-5)/(3-2)。
有沒有辦法在彈性搜索中做到這一點?
我嘗試以這種形式撰寫自己的指標腳本:
GET test1/_search
{
"size":15,
"aggs":{
"sum_the_hard_way": {
"scripted_metric": {
"init_script": {
"source": "state.values = []; state.timestamps = [];"
},
"map_script": {
"source": "state.values.add(doc['value'].value);state.timestamps.add(doc['timestamp'].value);"
},
"combine_script": {
"source": "def rates = []; for ( int i = 0; i <= state.values.size()-1 ; i ) { rate[i 1] = (state.value[i 1]- state.value[i])/(state.timestamp[i 1]- state.timestamp[i]);} return values"
},
"reduce_script": {
"source": "def vals = []; for (a in states) { vals.add(a) } return vals"
}
}
}
}
}
但它不起作用,我得到了
“原因”:“index_out_of_bounds_exception:索引 0 超出長度范圍
先感謝您!
uj5u.com熱心網友回復:
TLDR;
某些型別滑入您的代碼。我希望我已經修好了。
GET /so_agg_painless/_search
{
"size":15,
"aggs":{
"sum_the_hard_way": {
"scripted_metric": {
"init_script": {
"source": """
state.values = [];
state.timestamps = [];
"""
},
"map_script": {
"source": """
state.values.add(doc['value'].value);
state.timestamps.add(doc['timestamp'].value);
"""
},
"combine_script": {
"source": """
def rates = [];
for ( int i = 0; i <= state.values.size()-2 ; i ) {
def nom = (state.values[i 1]- state.values[i]);
def denom = (state.timestamps[i 1]- state.timestamps[i]);
rates.add(nom/denom);
}
return rates
"""
},
"reduce_script": {
"source": """
def vals = [];
for (a in states) {
vals.add(a)
}
return vals
"""
}
}
}
}
}
嘿伙計,你的代碼中有很多錯別字,這就是它失敗的原因。但我認為邏輯是完美的,所以對你來說是非常好的,所以非常接近。
您需要注意s代碼中的那些。
同樣,正如您在我發布的代碼中看到的那樣。使用""". 因此,您可以縮進代碼,這樣更易??于閱讀和修復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/383827.html
