Подтвердить что ты не робот

Удалить поле из документа Elasticsearch

Мне нужно удалить поле во всех документах, индексированных в Elasticsearch. Как мне это сделать. Будет ли любой из запросов на удаление помочь мне в этом.

4b9b3361

Ответ 1

То, что сказал @backtrack, верно, но есть очень удобный способ сделать это в Elasticsearch. Elasticsearch выделит внутреннюю сложность удаления. Вам нужно использовать API обновления для достижения этой цели -

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "ctx._source.remove(\"name_of_field\")"
}'

Вы можете найти больше документации здесь.

Примечание. Начиная с Elastic Search 6, вы должны включить заголовок типа контента:

-H 'Content-Type: application/json'

Ответ 2

update_by_query добавил update_by_query в 2.3. Этот экспериментальный интерфейс позволяет выполнять обновление для всех документов, которые соответствуют запросу.

Внутренне эластичный поиск выполняет сканирование/прокрутку для сбора пакетов документов, а затем обновляет их, как интерфейс массового обновления. Это быстрее, чем делать это вручную с вашим собственным интерфейсом сканирования/прокрутки из-за отсутствия накладных расходов на сеть и сериализацию. Каждая запись должна быть загружена в оперативную память, изменена и затем записана.

Вчера я удалил большое поле из моего кластера ES. Я видел постоянную пропускную способность в 10000 записей в секунду во время update_by_query, ограниченную ЦП, а не IO.

Посмотрите на параметр conflict=proceed если у кластера есть другой трафик обновлений, или все задание остановится, когда оно попадет в ConflictError когда одна из записей будет обновлена под одним из пакетов.

Аналогично, установка wait_for_completion=false приведет к запуску update_by_query через интерфейс задач. В противном случае работа будет прервана, если соединение закрыто.

URL:

http://localhost:9200/INDEX/TYPE/_update_by_query?wait_for_completion=false&conflicts=proceed

POST body:

{
  "script": "ctx._source.remove('name_of_field')",
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "name_of_field"
          }
        }
      ]
    }
  }
}

Начиная с Elasticsearch 1.43, встроенные скрипты Groovy по умолчанию отключены. Вам нужно будет включить его для работы встроенного скрипта, добавив script.inline: true в ваш файл конфигурации.

Или загрузите groovy в качестве скрипта и используйте формат "script": { "file": "scriptname", "lang": "groovy"}.

Ответ 3

По умолчанию это невозможно, потому что сейчас Lucene этого не поддерживает. В основном вы можете только поместить или удалить целые документы Lucene из индексов Lucene.

  • Получить первую версию вашего документа
  • удалите поле
  • нажмите эту новую версию своего документа

Ответ 4

Вы можете использовать _update_by_query

Пример 1

index: my_index

поле: user.email

POST my_index/_update_by_query?conflicts=proceed
{
    "script" : "ctx._source.user.remove('email')",
    "query" : {
        "exists": { "field": "user.email" }
    }
}

Пример 2

index: my_index

поле: total_items

POST my_index/_update_by_query?conflicts=proceed
{
    "script" : "ctx._source.remove('total_items')",
    "query" : {
        "exists": { "field": "total_items" }
    }
}