Мне нужно обновить несколько документов в моем индексе 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
}
До сих пор я мог добавить только строки в качестве нового поля. Каков правильный способ добиться этого?