У меня есть индекс биржевых тиков за каждую секунду, который выглядит следующим образом, и я пытаюсь объединить их в более крупные тики по 5 минут. Агрегировать максимум и минимум легко, используя мин/макс. Однако открытие и закрытие сложнее. Я пытаюсь использовать агрегирование метрик по сценарию, но получаю исключение нулевого указателя, которое не могу объяснить.
{ "time": "2017-12-06 12:02:00", "high": 10, "low": 1, "open": 1, "close": 5}
Мой запрос выглядит следующим образом, хотя я многое удалил из comb_script и reduce_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
}
Это проблема, потому что мне нужно сделать некоторые дополнительные вещи в reduce_script, но я не могу получить доступ к каким-либо свойствам карт в _aggs без получения NPE.
_aggs
против_agg
. Вы создаете_agg
, но пытаетесь получить доступ к_aggs
- person Val   schedule 07.12.2017_aggs[0]
. Точно так же они показывают это в своих документах (elastic.co/guide/en/elasticsearch/reference/current/). Я думаю, это потому, что_agg
— это совокупность осколков, а_aggs
— это комбинация всех_agg
. - person dustins   schedule 07.12.2017params._aggs
или полностью исключите reduce_script? - person Val   schedule 07.12.2017