Search code examples
elasticsearchkibanaelastic-stack

keep getting this error "dynamic method [java.util.HashMap, add/1] not found" in kibana console


I am new to elasticsearch stack ... Whenever i try to execute below query in Kibana Dev Tool Console keep getting below mentioned error

  • Query Executed in Kibana Console
POST employees-details/_update_by_query
{
  "query": {
    "match": {
      "EmpName": "Arvind"
    }
  },
  "script": {
    "source": "ctx._source.Address.add(params.tag)",
    "lang": "painless",
    "params": {
      "tag":{
        "AddressID":144,
        "AddressNumber":458
      }
    }
  }
}

keep Getting this error\/ while executing above query ^^

"caused_by" : {
      "type" : "illegal_argument_exception",
      "reason" : "dynamic method [java.util.HashMap, add/1] not found"
    }
  • Sample Data
[
      {
        "_index" : "employees-details",
        "_type" : "_doc",
        "_id" : "101",
        "_score" : 1.0,
        "_source" : {
          "EmpUserID" : 101,
          "Gender" : "Male",
          "EmpName" : "John",
          "Age" : 35
        }
      },
      {
        "_index" : "employees-details",
        "_type" : "_doc",
        "_id" : "106",
        "_score" : 1.0,
        "_source" : {
          "EmpUserID" : 106,
          "Address" : {
            "AddressNumber" : 201,
            "AddressID" : 200
          },
          "Gender" : "Male",
          "EmpName" : "Arvind",
          "Age" : 30
        }
      }
]

  • Versions Used

kibana : 7.9.3 elasticsearch : 7.9.3

Thanks in Advance :)


Solution

  • Since Address is a hash, you cannot use the add() method (meant for collections like array, list, etc). Instead you need to transform Address to a list first and then call add():

    POST employees-details/_update_by_query
    {
      "query": {
        "match": {
          "EmpName": "Arvind"
        }
      },
      "script": {
        "source": "if (!(ctx._source.Address instanceof Collection)) {ctx._source.Address = [ctx._source.Address];} ctx._source.Address.add(params.tag)",
        "lang": "painless",
        "params": {
          "tag":{
            "AddressID":144,
            "AddressNumber":458
          }
        }
      }
    }