Мне потребовалось удалить объект из массива, который удовлетворяет условию, я могу обновить объект массива на основе следующего условия:
PUT twitter/twit/1
{"list":
[
{
"tweet_id": "1",
"a": "b"
},
{
"tweet_id": "123",
"a": "f"
}
]
}
POST /twitter/twit/1/_update
{"script":"foreach (item :ctx._source.list) {
if item['tweet_id'] == tweet_id) {
item['new_field'] = 'ghi';
}
}",
"params": {tweet_id": 123"}
}
это работает
для удаления я делаю это
POST /twitter/twit/1/_update
{ "script": "foreach (item : ctx._source.list) {
if item['tweet_id'] == tweet_id) {
ctx._source.list.remove(item);
}
}",
"params": { tweet_id": "123" }
}
но это не работает и дает эту ошибку,
ElasticsearchIllegalArgumentException [не удалось выполнить скрипт]; вложенные: ConcurrentModificationException; Ошибка: ElasticsearchIllegalArgumentException [не удалось выполнить скрипт]; вложенный: ConcurrentModificationException
Я могу удалить весь массив или все поле, используя
"script": "ctx._source.remove('list')"
Я также могу удалить объект из массива, указав все ключи объекта, используя
"script":"ctx._source.list.remove(tag)",
"params" : {
"tag" : {"tweet_id": "123","a": "f"}
моя версия эластичного поиска модуля узла - 2.4.2, эластичный поисковый сервер - 1.3.2