В ES 6 я проиндексировал следующий документ:
PUT test/doc/_bulk?refresh
{"index":{"_id":1}}
{"prop1":"foo","prop2":[{"a":"123"},{"a":"456"}]}
Мне нужно удалить элемент из "prop2" со значением "456" для "a"
Методу remove () в Painless необходим индекс, поэтому я могу сделать это:
POST /test/1/_update
{
"script": {
"lang": "painless",
"source": "ctx._source.list.remove(ctx._source.list.indexOf(params.obj))",
"params" : {"obj" : {"a": "456"}}
}}
Проблема в том, что каждый объект в prop2 на самом деле имеет дюжину других ключей с различными значениями - поэтому я не могувыделить элемент с помощью параметра.Требуется какой-то запрос или фильтр, чтобы сказать «удалите любой элемент, имеющий значение« 456 »для« a ».»
В Python, если у меня есть такой список:
l=[{'a': '123', "b": '321'}, {'a': '456','b':'654'}]
Я могу получить нужный мне индекс с помощью этого:
[l.index(x) for x in l if x['a'] == '456'][0]
Но я не могу понять безболезненный подход (не знаю Java, кстати).Пробовал несколько вещей;это приводит к ошибке компиляции скрипта:
POST /test/doc/1/_update
{
"script": {
"lang": "painless",
"source": """
l = ctx._source.list
for (x in l){
if (x['a'] == '456') {
idx = l.indexOf(x)
l.remove(idx)
}
}
"""
}}