我有一个每秒的股票价格指数,如下所示,我试图将它们聚合成更大的 5 分钟的价格指数。使用 min/max 很容易聚合高低。然而,打开和关闭更难。我正在尝试使用 Scripted Metric Aggregation,但我得到了一个我无法解释的空指针异常。
{ "time": "2017-12-06 12:02:00", "high": 10, "low": 1, "open": 1, "close": 5}
我的查询如下所示,尽管我已经从 combine_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]"
}
}
}
}
}
}
如果我运行查询,您可以看到它为“open”值输出了一个 Map(带有键 time 和 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 中做一些额外的事情,但似乎无法在没有 NPE 的情况下访问 _aggs 中映射的任何属性。