Как добавить объект json в несколько документов в эластичном индексе с помощью _update_by_query?

Мне нужно обновить несколько документов в моем индексе Elasticsearch, и я попробовал следующее, используя плагин _update_by_query.

Что мне нужно сделать, так это добавить новое поле в несколько существующих документов, соответствующих определенному условию. Новое поле представляет собой вложенный JSON. Итак, после добавления его источник документа должен выглядеть так

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

Я попытался использовать API _update_by_query, чтобы сделать это. Но до сих пор я мог добавлять только поля 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
}

До сих пор я мог добавить только строки в качестве нового поля. Каков правильный способ добиться этого?


person Isuru Pathirana    schedule 25.10.2017    source источник


Ответы (1)


Вместо прямого назначения используйте параметры для достижения того же.

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "team.keyword": "search_phrase"
          }
        }
      ]
    }
  },
  "script": {
    "inline": "ctx._source.field_name = params.new_field",
    "params": {
      "new_field": {
        "a": "b"
      }
    }
  }
}
person Praneeth    schedule 25.10.2017