用于非空 ArrayList 的 Elasticsearch null_pointer_exception

Elasticsearch null_pointer_exception for non-null ArrayList

提问人:Anthony T 提问时间:10/25/2023 最后编辑:imotovAnthony T 更新时间:10/26/2023 访问量:21

问:

在Elasticsearch中给定适当的键时,我在访问映射中的值时遇到了问题。

查询如下:

{
  "query": {
    "bool": {
      "filter": [ .... some conditions]
    }
  },
  "script_fields" : {
    "test1" : {
      "script": {
        "source": "ArrayList quotes = params._source.elements[0].somefield.parameters; def out = parameters; return out;",
        "lang": "painless"
      }
    }
  },
  "sort": [{"valueTosort": {"order": "asc"}}]
}

返回

  "hits": [
  {
      "_index": "indexname",
      "_type": "data",
      "_id": "currentid",
      "_score": null,
      "fields": {
        "test1": [
          {
            "size": 10.1,
            "value": 0.0, 
            "additionalField": 1.0
          }
         ]
        },
        "sort": [
              1695827532254
          ]
      },

这是意料之中的。但是,一旦我尝试访问“参数”元素

{
  "query": {
    "bool": {
      "filter": [ .... some conditions]
    }
  },
  "script_fields" : {
    "test1" : {
      "script": {
        "source": "ArrayList quotes = params._source.elements[0].somefield.parameters; def out = parameters[0]; return out;",
        "lang": "painless"
      }
    }
  },
  "sort": [{"valueTosort": {"order": "asc"}}]
}

我明白了null_pointer_exception

                  "reason": {
                    "type": "script_exception",
                    "reason": "runtime error",
                    "script_stack": [
                        "out = parameters[0]; ",
                        "            ^---- HERE"
                    ],
                    "script": "ArrayList quotes = params._source.elements[0].somefield.parameters;  def out = parameters[0]; return out;",
                    "lang": "painless",
                    "position": {
                        "offset": 90,
                        "start": 78,
                        "end": 95
                    },
                    "caused_by": {
                        "type": "null_pointer_exception",
                        "reason": "Cannot invoke \"java.util.List.get(int)\" because \"<local3>\" is null"
                    }
                },

如果使用 .size() 或 .length 检查参数的大小,则会出现相同的异常

我已经检查了该元素是否不为空(将“参数”与 null 进行比较)——它不是 null,并使用 containsKey() 检查了“parameters”键是否存在,并使用“instance of”检查了“parameters”的类型(在将 params._source.elements[0].somefield.parameters 的值分配给 ArrayList 之前)。

请您告知必须做些什么才能访问 “params._source.elements[0].somefield.parameters[0].additionalField”或“params._source.elements[0].somefield.parameters[0].value”(显然不起作用)

数组 Elasticsearch nullPointerException

评论

0赞 imotov 10/26/2023
你能发布真实的输出吗?这不是 JSON 。您能否也稍微格式化您的查询?很难破译那里发生了什么。"test1": ["size": 10.1, "value": 0.0, "additionalField": 1.0}]
0赞 Anthony T 10/26/2023
抱歉,不知何故,我无法格式化代码,也感谢您指出错别字
0赞 imotov 10/26/2023
我为你格式化了它。
0赞 imotov 10/26/2023
这是哪个版本的 elasticsearch?
0赞 imotov 10/26/2023
我尝试在 v8.10.2 上重现此问题,但无法。gist.github.com/imotov/265f02e3cc66603aade2c8dda0b86d8c你能看看我的例子并修改它以适应你的情况吗?

答: 暂无答案