Удалить только поля из всех документов, которые соответствуют моим критериям - PullRequest
2 голосов
/ 25 марта 2019

Чтобы удалить любое поле со значением из всех документов без удаления всего документа из индекса Elasticsearch, обычно я использую _update_by_query вызов API с script

Например: в my_properties index Я хочу удалить все поля, например (ключ => значение) из всех документов, в которых он существует.Используя приведенный ниже запрос, я могу удалить все поля feed там, где оно есть, но в этом случае поле feed будет text / string type

Индекс : my_properties

Поле : канал

Тип : текст

Пример Значение на канале: feed: ["AB-1234"]

POST my_properties/_update_by_query?refresh&conflicts=proceed
{
    "script" : "ctx._source.remove('feed')",
    "query" : {
        "exists": { "field": "feed" }
    }
}

Моя основная проблема заключается в том, что мой тип поля вложенный вместо text / string

Индекс : my_properties

Поле : feed_v2

Тип : вложенный

Пример значения в feed_v2: feed_v2: [{"feed":12},{"id":["AB-9999"]}]

Подход 1:

POST my_properties/_update_by_query?refresh&conflicts=proceed
{
    "script" : "ctx._source.remove('feed_v2')",
    "query" : {
        "exists": { "field": "feed_v2" }
    }
}

Подход 2:

POST my_properties/_update_by_query?refresh&conflicts=proceed
{
    "script" : "ctx._source.feed_v2.remove('feed')",
    "query" : {
        "exists": { "field": "feed_v2.feed" }
    }
}

Ничегоработает, я что-то упустил?Не уверен, но я предполагаю -

"query" : {"exists": { "field": "feed_v2" }}

запрос существует не работает так же, как с полем вложенного типа , поэтому он не находитчто-нибудь при попытке удалить в nested поле типа

Согласно Ref: https://stackoverflow.com/a/53771354/1138192 Это должно работать для меня, но, увы, это не работает для меня.

1 Ответ

2 голосов
/ 25 марта 2019

Elasticsearch имеет концепцию Nested Datatype , и для этого только Nested Query придет на помощь. В основном ваш существующий запрос будет в следующей форме:

Вложенный запрос для проверки наличия поля:

POST <your_index_name>/_search
{
  "query": {
    "nested": {
      "path": "feed_v2",
      "query": {
        "exists": {
          "field": "feed_v2.feed"
        }
      }
    }
  }
} 

Вы ищете запрос, который помог бы вам удалить вложенное поле из вложенного документа, для которого я создал скрипт ниже.

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

Обновление по сценарию запроса для вложенного документа для удаления поля

Это для сценария, который вы хотите удалить только feed, т.е. field_v2.feed, но вы хотели бы сохранить остальные поля field_v2.

POST resumes/_update_by_query
{
  "query": {
    "match_all": {}
  },
  "script": {
    "lang": "painless",
    "inline": """
      for(int i=0; i<ctx._source.field_v2.size(); i++)
      {
        HashMap myKV = ctx._source.field_v2.get(i);
        if(myKV.get(params.key_ref)!=null){
          myKV.remove(params.key_ref);
        }
      }
    """,
    "params": {
      "key_ref": "feed"
  }}
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...