Мне нужно удалить поле во всех документах, индексированных в Elasticsearch. Как мне это сделать. Будет ли любой из запросов на удаление помочь мне в этом.
Удалить поле из документа Elasticsearch
Ответ 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" }
}
}