Удалить большой объект из списка в документе Elasticsearch на основе значения объекта - PullRequest
0 голосов
/ 10 февраля 2019

В 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)
        }
      }
    """
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...