如何使用_update_by_query将json对象添加到Elastic索引中的多个文档?

时间:2017-10-25 08:46:05

标签: json elasticsearch elasticsearch-5

我需要更新我的Elasticsearch索引中的多个文档,并使用_update_by_query插件尝试了以下内容。

我需要做的是为符合特定条件的几个现有文档添加新字段。新字段是嵌套的JSON。所以在添加之后,文档源应该看起来像

_source: {
    ...existing fields,
    "new_field" : {
        "attrName1" : "value",
        "attrName2" : "value",
    }
}  

我尝试使用_update_by_query API来完成这项工作。但到目前为止,我只能添加String字段和数组。当尝试使用以下查询添加JSON时,它会给我一个错误。

查询

curl -XPOST "http://xxx.xxx.xxx.xxx:pppp/my_index_name/_update_by_query" -d'
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "team.keyword": "search_phrase"
          }
        }
      ]
    }
  },
  "script" : {
    "inline":"ctx._source.field_name = {\"a\":\"b\"}"
  }
}'

错误

{
  "error": {
    "root_cause": [
      {
        "type": "script_exception",
        "reason": "compile error",
        "script_stack": [
          "ctx._source.field_name = {\"a\":\"b\"}",
          "                         ^---- HERE"
        ],
        "script": "ctx._source.field_name = {\"a\":\"b\"}",
        "lang": "painless"
      }
    ],
    "type": "script_exception",
    "reason": "compile error",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "invalid sequence of tokens near ['{'].",
      "caused_by": {
        "type": "no_viable_alt_exception",
        "reason": null
      }
    },
    "script_stack": [
      "ctx._source.field_name = {\"a\":\"b\"}",
      "                         ^---- HERE"
    ],
    "script": "ctx._source.field_name = {\"a\":\"b\"}",
    "lang": "painless"
  },
  "status": 500
}

到目前为止,我只能将字符串添加为新字段。实现这一目标的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

不使用直接赋值,而是使用params来实现相同的目标。

decltype(v[10])