用于将对象字段添加到文档中的 elasticsearch 无痛脚本

elasticsearch painless script to add object field into document

我有一个相当基本的要求,我想在更新查询中无痛地向文档添加一个对象。

这是我要添加的对象

"memoire": {
      "codeActe": "C",
      "docType": "M",
      "uuid": "added ",
      "nonFacturable": false,
      "published": false
    }, 

我试过了

    POST /csa_encounters/_update_by_query
{
  "script":
{ "source": """

  ctx._source.memoire.codeActe = "C";
  ctx._source.memoire.docType= "M";
  ctx._source.memoire.uuid = "added ";
  ctx._source.memoire.nonFacturable = false;
  ctx._source.memoire.published =false
""",
"lang": "painless"
},
    "query": {
        "bool" : {
            "must" : [
                { "query_string" : { "query" : "140c7646", "fields" : [ "_id" ] } }
            ]
        }
    }
}    

但是我收到消息空指针异常,因为该字段当然不存在

"type": "script_exception",
    "reason": "runtime error",
    "script_stack": [
      "ctx._source.memoire.codeActe = \"C\";\n  ",
      "                   ^---- HERE"
    ],
 ...
    "lang": "painless",
    "caused_by": {
      "type": "null_pointer_exception",
      "reason": null
    }
  },
  "status": 400

如果对象不存在,我不知道如何将其创建为新字段。

这是因为 memoire 字段在您的文档中不存在。 因此,只需在脚本的开头添加以下行:

if (ctx._source.memoire == null) {
    ctx._source.memoire = [:];
}