Получение null_pointer_exception при доступе к элементам _aggs в Scripted Metric Aggregation
У меня есть индекс биржевых тиков за каждую секунду, который выглядит следующим образом, и я пытаюсь объединить их в более крупные тики по 5 минут. Агрегирование высоких и низких значений легко с использованием мин / макс. Однако открывать и закрывать сложнее. Я пытаюсь использовать статистическую агрегацию метрик, но получаю исключение нулевого указателя, которое я не могу объяснить.
{ "time": "2017-12-06 12:02:00", "high": 10, "low": 1, "open": 1, "close": 5}
Мой запрос выглядит следующим образом, хотя я много удалил из comb_script и redu_script, чтобы его было легко читать.
{
"size": 0,
"aggs": {
"ticks": {
"date_histogram": {
"field":"time",
"interval":"5m"
},
"aggs": {
"open": {
"scripted_metric": {
"init_script": "params._agg.opens = []",
"map_script": "params._agg.opens.add(['time': doc.time.value.getMillis(),'open':doc.open.value])",
"combine_script": "return params._agg.opens[0]",
"reduce_script": "return params._aggs[0]"
}
}
}
}
}
}
Если я выполню запрос, вы увидите, что он выводит карту (с ключами time и open) для значения "open", как и следовало ожидать.
{
"aggregations": {
"ticks": {
"buckets": [
{
"key_as_string": "2017-12-06 14:20",
"key": 1512570000000,
"doc_count": 6,
"volume": {
"value": 84.09597664
},
"high": {
"value": 12886
},
"low": {
"value": 12874.99
},
"open": {
"value": {
"time": 1512570420000,
"open": 12874.99
}
}
}
]
}
}
}
Но если я попытаюсь получить доступ к любым свойствам карты (в качестве простого примера просто возвращаю params._aggs[0]['open']
) Я получаю исключение нулевого указателя. Я пытался получить доступ к нему с params._aggs[0].open
и даже установить его на карту, а затем получить доступ к этой карте Map myMap = params._aggs[0]; return myMap['open'];
но я получаю ту же ошибку.
{
"error": {
"root_cause": [],
"type": "search_phase_execution_exception",
"reason": "",
"phase": "fetch",
"grouped": true,
"failed_shards": [],
"caused_by": {
"type": "script_exception",
"reason": "runtime error",
"script_stack": [
"return params._aggs[0]['open']",
" ^---- HERE"
],
"script": "return params._aggs[0]['open']",
"lang": "painless",
"caused_by": {
"type": "null_pointer_exception",
"reason": null
}
}
},
"status": 503
}
Это проблема, потому что мне нужно сделать некоторые дополнительные вещи в redu_script, но я не могу получить доступ к каким-либо свойствам карт в _aggs без получения NPE.
1 ответ
Я смог решить проблему с помощью ?.
оператор. Я предполагаю, потому что у меня было несколько нулевых полей, он взрывался, пытаясь получить доступ к свойствам на нуле. Так что, просто добавив это, я получаю то, что ожидаю. Так что это просто вопрос params._aggs[0]
?. open
{
"size": 0,
"aggs": {
"ticks": {
"date_histogram": {
"field":"time",
"interval":"5m"
},
"aggs": {
"open": {
"scripted_metric": {
"init_script": "params._agg.opens= []",
"map_script": "params._agg.opens.add(['time': doc.time.value.getMillis(),'open':doc.open.value])",
"combine_script": "return params._agg.opens[0]",
"reduce_script": "return params._aggs[0]?.open"
}
}
}
}
}
}
{
"aggregations": {
"ticks": {
"buckets": [
{
"key_as_string": "2017-12-07 12:20",
"key": 1512649200000,
"doc_count": 2,
"open": {
"value": 13
}
}
]
}
}
}