ES无痛脚本中的空指针异常?

ES无痛脚本中的空指针异常?,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我在ES中使用无痛脚本,遇到一个空指针异常,这是我的脚本,为了更好地理解,我添加了响应,我使用ES v7.3 POST test_script/_update/1 { "scripted_upsert": true, "script": { "lang": "painless", "source": "int getBrowsersObjectIndex(def

我在ES中使用无痛脚本,遇到一个空指针异常,这是我的脚本,为了更好地理解,我添加了响应,我使用ES v7.3

POST test_script/_update/1
{
  "scripted_upsert": true,
  "script": {
    "lang": "painless",
    "source": "int getBrowsersObjectIndex(def x, def y){for (int i = 0; i < x.length; i++) {if (x[i].deviceType == y.deviceType) {if (x[i].osName == y.osName) {if(x[i].browserName == y.browserName) {return i}}}}return -1} int getDevicesObjectIndex(def x, def y){for (int i = 0; i < x.length; i++) {if (x[i].deviceId == y.deviceId) {if (x[i].appName == y.appName) {if (x[i].appNameSpace == y.appNameSpace){return i}}}}return -1}if (!ctx._source.containsKey('browsers')) {ctx._source['browsers'] = []}if (!ctx._source.containsKey('devices')) {ctx._source['devices'] = []}for (int index = 0; index < params.iterate.length; index++) {if (params.iterate[index].browserObject) {int browserIndex = getBrowsersObjectIndex(ctx._source.browsers, params.iterate[index].browserObject);if (browserIndex >= 0) {ctx._source.browsers.remove(browserIndex);}ctx._source.browsers.add(params.iterate[index].browserObject);}if (params.iterate[index].deviceObject) {int deviceIndex = getDevicesObjectIndex(ctx._source.devices, params.iterate[index].deviceObject);if (deviceIndex >= 0) {ctx._source.devices.remove(deviceIndex);}ctx._source.devices.add(params.iterate[index].deviceObject);}}",
    "params": {
      "iterate": [
        {
          "deviceObject": {
            "deviceId": "162c04e48832e338",
            "appName": "test_app",
            "appNameSpace": "com.test",
            "appBuild": 55,
            "appVersion": "4.6.3",
            "deviceName": "OP4B80L1",
            "manufacturer": "OPPO",
            "model": "CPH1937",
            "networkCarrier": "Jio",
            "os": "Android",
            "platform": "Android",
            "timezone": "Asia/Kolkata",
            "version": "10"
          }
        },
        {
          "browserObject": {
            "deviceType": "mobile",
            "osName": "Android",
            "browserName": "Chrome",
            "osVersion": 10,
            "browserVersion": "80.0.3987.99"
          }
        }
      ]
    }
  },
  "upsert": {}
}
测试后脚本/\u更新/1
{
“脚本式插入”:正确,
“脚本”:{
“郎”:“无痛”,
“source:“int getBrowsersObjectIndex(def x,def y){for(int i=0;i=0){ctx.\u source.browsers.browsers.remove(browserIndex);}ctx.\u source.browsers.add(params.iterate[index].browserObject);}if(params.iterate[index].deviceObject){int deviceIndex=getDeviceObjectIndex(ctx.\u source.devices,params.iterate)[index].deviceObject);如果(deviceIndex>=0){ctx.\u source.devices.remove(deviceIndex);}ctx.\u source.devices.add(params.iterate[index].deviceObject);},
“参数”:{
“迭代”:[
{
“设备对象”:{
“设备ID”:“162C04E4883238”,
“appName”:“测试应用程序”,
“appNameSpace”:“com.test”,
“appBuild”:55,
“appVersion”:“4.6.3”,
“deviceName”:“OP4B80L1”,
“制造商”:“OPPO”,
“型号”:“CPH1937”,
“网络运营商”:“Jio”,
“操作系统”:“安卓”,
“平台”:“安卓”,
“时区”:“亚洲/加尔各答”,
“版本”:“10”
}
},
{
“browserObject”:{
“设备类型”:“移动设备”,
“osName”:“Android”,
“浏览器名”:“Chrome”,
“osVersion”:10,
“browserVersion”:“80.0.3987.99”
}
}
]
}
},
“向上插入”:{}
}
错误是:

{
  "error": {
    "root_cause": [
      {
        "type": "remote_transport_exception",
        "reason": "[connecto][192.168.36.235:9300][indices:data/write/update[s]]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "failed to execute script",
    "caused_by": {
      "type": "script_exception",
      "reason": "runtime error",
      "script_stack": [
        "if (params.iterate[index].browserObject) {int ",
        "                         ^---- HERE"
      ],
      "script": "int getBrowsersObjectIndex(def x, def y){for (int i = 0; i < x.length; i++) {if (x[i].deviceType == y.deviceType) {if (x[i].osName == y.osName) {if(x[i].browserName == y.browserName) {return i}}}}return -1} int getDevicesObjectIndex(def x, def y){for (int i = 0; i < x.length; i++) {if (x[i].deviceId == y.deviceId) {if (x[i].appName == y.appName) {if (x[i].appNameSpace == y.appNameSpace){return i}}}}return -1}if (!ctx._source.containsKey('browsers')) {ctx._source['browsers'] = []}if (!ctx._source.containsKey('devices')) {ctx._source['devices'] = []}for (int index = 0; index < params.iterate.length; index++) {if (params.iterate[index].browserObject) {int browserIndex = getBrowsersObjectIndex(ctx._source.browsers, params.iterate[index].browserObject);if (browserIndex >= 0) {ctx._source.browsers.remove(browserIndex);}ctx._source.browsers.add(params.iterate[index].browserObject);}if (params.iterate[index].deviceObject) {int deviceIndex = getDevicesObjectIndex(ctx._source.devices, params.iterate[index].deviceObject);if (deviceIndex >= 0) {ctx._source.devices.remove(deviceIndex);}ctx._source.devices.add(params.iterate[index].deviceObject);}}",
      "lang": "painless",
      "caused_by": {
        "type": "null_pointer_exception",
        "reason": null
      }
    }
  },
  "status": 400
}
{
“错误”:{
“根本原因”:[
{
“类型”:“远程传输异常”,
“原因”:“[connecto][192.168.36.235:9300][索引:数据/写入/更新]”
}
],
“类型”:“非法参数\异常”,
“原因”:“无法执行脚本”,
“原因”:{
“类型”:“脚本异常”,
“原因”:“运行时错误”,
“脚本堆栈”:[
“如果(params.iterate[index].browserObject){int”,
“^----这里”
],
“脚本”:“int getBrowsersObjectIndex(def x,def y){for(int i=0;i=0){ctx.\u source.browsers.browsers.remove(browserIndex);}ctx.\u source.browsers.add(params.iterate[index].browserObject);}if(params.iterate[index].deviceObject){int deviceIndex=getDeviceObjectIndex(ctx.\u source.devices,params.iterate)[index].deviceObject);如果(deviceIndex>=0){ctx.\u source.devices.remove(deviceIndex);}ctx.\u source.devices.add(params.iterate[index].deviceObject);},
“郎”:“无痛”,
“原因”:{
“类型”:“空指针异常”,
“原因”:空
}
}
},
“地位”:400
}

错误似乎出现在if语句中,我正在检查对象迭代数组中是否存在browserObject或deviceObject。您需要执行显式空检查,即

if (params.iterate[index].browserObject != null)
此外,在Kibana开发工具中,您可以使用三重引号
“”“
”,以正确格式化代码,使其更易读、更易于阅读/维护:

POST test_script/_update/1
{
  "scripted_upsert": true,
  "script": {
    "lang": "painless",
    "source": """
    int getBrowsersObjectIndex(def x, def y){
      for (int i = 0; i < x.length; i++) {
        if (x[i].deviceType == y.deviceType) {
          if (x[i].osName == y.osName) {
            if(x[i].browserName == y.browserName) {
              return i
            }
          }
        }
      }
      return -1
    }
    int getDevicesObjectIndex(def x, def y){
      for (int i = 0; i < x.length; i++) {
        if (x[i].deviceId == y.deviceId) {
          if (x[i].appName == y.appName) {
            if (x[i].appNameSpace == y.appNameSpace){
              return i
            }
          }
        }
      }
      return -1
    }
    if (!ctx._source.containsKey('browsers')) {
      ctx._source['browsers'] = []
    }
    if (!ctx._source.containsKey('devices')) {
      ctx._source['devices'] = []
    }
    for (int index = 0; index < params.iterate.length; index++) {
      if (params.iterate[index].browserObject != null) {
        int browserIndex = getBrowsersObjectIndex(ctx._source.browsers, params.iterate[index].browserObject);
        if (browserIndex >= 0) {
          ctx._source.browsers.remove(browserIndex);
        }
        ctx._source.browsers.add(params.iterate[index].browserObject);
      }
      if (params.iterate[index].deviceObject != null) {
        int deviceIndex = getDevicesObjectIndex(ctx._source.devices, params.iterate[index].deviceObject);
        if (deviceIndex >= 0) {
          ctx._source.devices.remove(deviceIndex);
        }
        ctx._source.devices.add(params.iterate[index].deviceObject);
      }
    }
    """,
    "params": {
      "iterate": [
        {
          "deviceObject": {
            "deviceId": "162c04e48832e338",
            "appName": "test_app",
            "appNameSpace": "com.test",
            "appBuild": 55,
            "appVersion": "4.6.3",
            "deviceName": "OP4B80L1",
            "manufacturer": "OPPO",
            "model": "CPH1937",
            "networkCarrier": "Jio",
            "os": "Android",
            "platform": "Android",
            "timezone": "Asia/Kolkata",
            "version": "10"
          }
        },
        {
          "browserObject": {
            "deviceType": "mobile",
            "osName": "Android",
            "browserName": "Chrome",
            "osVersion": 10,
            "browserVersion": "80.0.3987.99"
          }
        }
      ]
    }
  },
  "upsert": {}
}
测试后脚本/\u更新/1
{
“脚本式插入”:正确,
“脚本”:{
“郎”:“无痛”,
“来源”:”
int getBrowsersObjectIndex(定义x,定义y){
对于(int i=0;i=0){
ctx.\u source.browsers.remove(browserIndex);
}
ctx._source.browsers.add(params.iterate[index].browservobject);
}
if(params.iterate[index].deviceObject!=null){
int-deviceIndex=GetDeviceObject