0

我有一个每秒的股票价格指数,如下所示,我试图将它们聚合成更大的 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 中映射的任何属性。

4

1 回答 1

2

我能够通过使用?.运算符来解决问题。我猜是因为我有一些空字段,它通过尝试访问空属性而炸毁。因此,只需添加它,我就得到了我的期望。所以这只是简单的问题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
          }
        }
      ]
    }
  }
}
于 2017-12-07T13:35:19.753 回答