API удаления по запросу
Удаляет документы, соответствующие заданному запросу.
POST /my-index-000001/_delete_by_query
{
"query": {
"match": {
"user.id": "elkbee"
}
}
} Запрос
POST /<target>/_delete_by_query
Предварительные условия
-
Если включены функции безопасности Elasticsearch, у вас должны быть следующие разрешения на индексы для целевого потока данных, индекса или псевдонима:
-
read -
deleteилиwrite
-
Описание
Вы можете указать критерии запроса в URI запроса или теле запроса, используя тот же синтаксис, что и в API поиска.
При отправке запроса на удаление по запросу Elasticsearch создает моментальный снимок потока данных или индекса при начале обработки запроса и удаляет соответствующие документы с использованием internal версионирования. Если документ изменяется между моментом создания снимка и выполнением операции удаления, возникает конфликт версий, и операция удаления завершается неудачно.
Документы с версией, равной 0, не могут быть удалены с помощью удаления по запросу, потому что internal версионирование не поддерживает 0 в качестве допустимого номера версии.
Во время обработки запроса на удаление по запросу Elasticsearch последовательно выполняет несколько запросов поиска, чтобы найти все соответствующие документы для удаления. Для каждой партии соответствующих документов выполняется запрос пакетного удаления. Если запрос поиска или пакетного запроса отклоняется, запросы повторно пытаются выполниться до 10 раз с экспоненциальной задержкой. Если максимальное ограничение повторных попыток достигнуто, обработка останавливается, и все неудачные запросы возвращаются в ответе. Все запросы на удаление, которые успешно завершились, остаются в силе, они не отменяются.
Вы можете выбрать подсчет конфликтов версий вместо остановки и возврата, установив conflicts на proceed. Обратите внимание, что если вы выбираете подсчет конфликтов версий, операция может попытаться удалить больше документов из источника, чем max_docs, пока она не удалит успешно max_docs документов или не обработает все документы в запросе источника.
Обновление фрагментов
Указание параметра refresh обновляет все фрагменты, участвующие в запросе удаления по запросу, после завершения запроса. Это отличается от параметра refresh API удаления, который обновляет только фрагмент, получивший запрос удаления. В отличие от API удаления, он не поддерживает wait_for.
Асинхронное выполнение удаления по запросу
Если запрос содержит wait_for_completion=false, Elasticsearch выполняет некоторые предварительные проверки, запускает запрос и возвращает task, который можно использовать для отмены или получения статуса задачи. Elasticsearch создает запись этой задачи как документ в .tasks/task/${taskId}. После завершения задачи необходимо удалить документ задачи, чтобы Elasticsearch мог освободить занимаемое место.
Ожидание активных фрагментов
wait_for_active_shards определяет, сколько копий фрагмента должно быть активными перед продолжением запроса. Подробнее см. Активные фрагменты. timeout определяет, как долго каждый запрос записи ожидает, пока недоступные фрагменты не станут доступными. Оба работают точно так же, как и в Bulk API. Удаление по запросу использует прокручиваемые поиски, поэтому вы также можете указать параметр scroll для управления временем жизни контекста поиска, например ?scroll=10m. По умолчанию это 5 минут.
Управление скоростью запросов на удаление
Чтобы управлять скоростью, с которой запрос удаления по запросу отправляет пакеты операций удаления, можно установить requests_per_second на любое положительное десятичное число. Это добавляет время ожидания к каждому пакету для регулирования скорости. Установите requests_per_second на -1, чтобы отключить управление скоростью.
Управление скоростью использует время ожидания между пакетами, чтобы внутренние запросы прокрутки могли получить таймаут, учитывающий добавление времени в запрос. Время добавления — это разница между размером пакета, деленным на requests_per_second, и временем записи. По умолчанию размер пакета составляет 1000, поэтому если requests_per_second установлено на 500:
target_time = 1000 / 500 per second = 2 seconds wait_time = target_time - write_time = 2 seconds - .5 seconds = 1.5 seconds
Поскольку пакет отправляется как один _bulk запрос, большие размеры пакетов заставляют Elasticsearch создавать множество запросов и ждать перед началом следующей группы. Это "пульсирующее", а не "плавное" поведение.
Нарезка
Удаление по запросу поддерживает нарезку прокрутки для распараллеливания процесса удаления. Это может повысить эффективность и обеспечить удобный способ разбиения запроса на более мелкие части.
Указание slices на auto выбирает разумное число для большинства потоков данных и индексов. Если вы нарезаете вручную или настраиваете автоматическую нарезку, помните, что:
- Производительность запроса наиболее эффективна, когда количество
slicesравно количеству фрагментов в индексе или базовом индексе. Если это число велико (например, 500), выберите меньшее число, поскольку слишком многоslicesухудшает производительность. Установкаslicesвыше количества фрагментов обычно не улучшает эффективность и добавляет накладные расходы. - Производительность удаления масштабируется линейно с доступными ресурсами с увеличением количества срезов.
От того, производительность запроса или удаления доминирует в процессе выполнения, зависит от переиндексируемых документов и ресурсов кластера.
Параметры пути
-
<target> - (Необязательный, строка) Список потоков данных, индексов и псевдонимов для поиска, разделенных запятыми. Поддерживает подстановки (
*). Чтобы найти все потоки данных или индексы, опустите этот параметр или используйте* or `_all.
Параметры запроса
-
allow_no_indices -
(Необязательно, булево) Если
false, запрос вернёт ошибку, если какие-либо выражения с подстановкой, псевдоним индекса или_allзначение указывают только на отсутствующие или закрытые индексы. Это поведение применяется даже если запрос обращается к другим открытым индексам. Например, запрос, направленный наfoo*,bar*, вернёт ошибку, если индекс начинается сfoo, но ни один индекс не начинается сbar.По умолчанию
true. -
analyzer -
(Необязательно, строка) Анализатор для использования с строкой запроса.
Этот параметр может быть использован только при указании параметра строки запроса
q. -
analyze_wildcard -
(Необязательно, булево) Если
true, запросы с подстановкой и префиксом анализируются. По умолчаниюfalse.Этот параметр может быть использован только при указании параметра строки запроса
q. -
conflicts - (Необязательно, строка) Что делать, если удаление по запросу наталкивается на конфликты версий:
abortилиproceed. По умолчаниюabort. -
default_operator -
(Необязательно, строка) Оператор по умолчанию для запроса с использованием строки запроса: ИЛИ или И. По умолчанию
OR.Этот параметр может быть использован только при указании параметра строки запроса
q. -
df -
(Необязательно, строка) Поле, используемое по умолчанию, если в строке запроса не указан префикс поля.
Этот параметр может быть использован только при указании параметра строки запроса
q. -
expand_wildcards -
(Необязательно, строка) Тип индекса, с которым могут совпадать шаблоны с подстановкой. Если запрос может обращаться к потокам данных, этот аргумент определяет, будут ли выражения с подстановкой соответствовать скрытым потокам данных. Поддерживает значения, разделённые запятыми, такие как
open,hidden. Допустимые значения:-
all - Совпадение с любым потоком данных или индексом, включая скрытые.
-
open - Совпадение с открытыми индексами, не являющимися скрытыми. Также соответствует любому нескрытому потоку данных.
-
closed - Совпадение с закрытыми индексами, не являющимися скрытыми. Также соответствует любому нескрытому потоку данных. Потоки данных не могут быть закрыты.
-
hidden - Совпадение со скрытыми потоками данных и скрытыми индексами. Должен быть объединён с
open,closedили с обоими. -
none - Шаблоны с подстановкой не принимаются.
По умолчанию
open. -
-
from - (Необязательно, целое число) Смещение документа начала. По умолчанию
0. -
ignore_unavailable - (Необязательно, булево) Если
false, запрос возвращает ошибку, если он обращается к отсутствующему или закрытому индексу. По умолчаниюfalse. -
lenient -
(Необязательно, булево) Если
true, ошибки запроса, основанные на формате (например, предоставление текста в числовое поле) в строке запроса будут игнорироваться. По умолчаниюfalse.Этот параметр может быть использован только при указании параметра строки запроса
q. -
max_docs - (Необязательно, целое число) Максимальное количество документов для обработки. По умолчанию все документы.
-
preference - (Необязательно, строка) Указывает узел или фрагмент, на котором должна выполняться операция. По умолчанию случайный.
-
q - (Необязательно, строка) Запрос в синтаксисе строки запроса Lucene.
-
request_cache - (Необязательно, булево) Если
true, кэши запросов используются для данного запроса. По умолчанию значение устанавливается на уровне индекса. -
refresh - (Необязательно, булево) Если
true, Elasticsearch обновляет все фрагменты, участвующие в удалении по запросу, после завершения запроса. По умолчаниюfalse. -
requests_per_second - (Необязательно, целое число) Снижение частоты запросов для этого запроса в подзапросах в секунду. По умолчанию
-1(без снижения частоты). -
routing - (Необязательно, строка) Пользовательское значение, используемое для маршрутизации операций на определённый фрагмент.
-
scroll - (Необязательно, значение времени) Период сохранения контекста поиска для прокрутки. См. Прокрутка результатов поиска.
-
scroll_size - (Необязательно, целое число) Размер запроса прокрутки, который управляет операцией. По умолчанию 1000.
-
search_type -
(Необязательно, строка) Тип операции поиска. Доступные варианты:
-
query_then_fetch -
dfs_query_then_fetch
-
-
search_timeout - (Необязательно, единицы измерения времени) Явное время ожидания для каждого запроса поиска. По умолчанию нет времени ожидания.
-
slices - (Необязательно, целое число) Количество фрагментов, на которые нужно разделить эту задачу. По умолчанию 1, что означает, что задача не разделяется на подзадачи.
-
sort - (Необязательно, строка) Список пар <поле>:<направление>, разделённых запятыми.
-
stats - (Необязательно, строка) Конкретный
tagзапроса для ведения журнала и статистических целей. -
terminate_after -
(Необязательно, целое число) Максимальное количество документов для сбора на каждом фрагменте. Если запрос достигает этого предела, Elasticsearch завершает запрос досрочно. Elasticsearch собирает документы до сортировки.
Используйте с осторожностью. Elasticsearch применяет этот параметр к каждому фрагменту, обрабатывающему запрос. Если возможно, позвольте Elasticsearch автоматически выполнять досрочное завершение. Избегайте указания этого параметра для запросов, которые обращаются к потокам данных с базовыми индексами на нескольких уровнях данных.
-
timeout - (Необязательно, единицы измерения времени) Период, в течение которого каждый запрос удаления ожидает активных фрагментов. По умолчанию
1m(одна минута). -
version - (Необязательно, булево) Если
true, возвращает версию документа в качестве части совпадения. -
wait_for_active_shards -
(Необязательно, строка) Количество копий фрагмента, которые должны быть активными, прежде чем продолжить операцию. Установите значение в
allили любое положительное целое число до общего количества фрагментов в индексе (number_of_replicas+1). По умолчанию: 1, первичный фрагмент.См. Активные фрагменты.
Тело запроса
-
query - (Необязательно, объект запроса) Указывает документы для удаления с помощью DSL запроса.
Тело ответа
Ответ в формате JSON выглядит следующим образом:
{
"took" : 147,
"timed_out": false,
"total": 119,
"deleted": 119,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures" : [ ]
} -
took - Количество миллисекунд с начала до конца всей операции.
-
timed_out - Этот флаг устанавливается в
true, если любой из запросов, выполненных во время выполнения удаления по запросу, истек по времени. -
total - Количество документов, которые были успешно обработаны.
-
deleted - Количество документов, которые были успешно удалены.
-
batches - Количество ответов на запросы прокрутки, полученных в результате удаления по запросу.
-
version_conflicts - Количество конфликтов версий, с которыми столкнулся запрос удаления по запросу.
-
noops - Это поле всегда равно нулю для удаления по запросу. Оно существует только для того, чтобы запросы удаления по запросу, обновления по запросу и переиндексации возвращали ответы с одинаковой структурой.
-
retries - Количество попыток повторной обработки, предпринятых удалением по запросу.
bulk— это количество повторно обработанных операций пакетной обработки, аsearch— количество повторно обработанных операций поиска. -
throttled_millis - Количество миллисекунд, в течение которых запрос ожидал, чтобы соответствовать
requests_per_second. -
requests_per_second - Количество запросов в секунду, эффективно выполненных во время удаления по запросу.
-
throttled_until_millis - Это поле должно всегда быть равно нулю в ответе
_delete_by_query. Оно имеет значение только при использовании API задач, где оно указывает следующую точку времени (в миллисекундах с эпохи), когда запрос, ограниченный по времени, будет выполнен повторно, чтобы соответствоватьrequests_per_second. -
failures - Массив ошибок, если во время процесса возникли невосстановимые ошибки. Если этот массив не пустой, запрос был прерван из-за этих ошибок. Удаление по запросу реализовано с помощью пакетов, и любая ошибка приводит к прерыванию всего процесса, но все ошибки в текущем пакете собираются в массив. Можно использовать параметр
conflicts, чтобы предотвратить прерывание переиндексации при конфликтах версий.
Примеры
Удалить все документы из потока данных my-index-000001 или индекса:
POST my-index-000001/_delete_by_query?conflicts=proceed
{
"query": {
"match_all": {}
}
} Удалить документы из нескольких потоков данных или индексов:
POST /my-index-000001,my-index-000002/_delete_by_query
{
"query": {
"match_all": {}
}
} Ограничить операцию удаления по запросу фрагментами, которые соответствуют определённому значению маршрутизации:
POST my-index-000001/_delete_by_query?routing=1
{
"query": {
"range" : {
"age" : {
"gte" : 10
}
}
}
} По умолчанию _delete_by_query использует пакеты прокрутки объёмом 1000. Можно изменить размер пакета с помощью параметра URL scroll_size:
POST my-index-000001/_delete_by_query?scroll_size=5000
{
"query": {
"term": {
"user.id": "kimchy"
}
}
} Ручное разбиение
Разбить удаление по запросу вручную, указав идентификатор разбиения и общее количество разбиений:
POST my-index-000001/_delete_by_query
{
"slice": {
"id": 0,
"max": 2
},
"query": {
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
}
}
POST my-index-000001/_delete_by_query
{
"slice": {
"id": 1,
"max": 2
},
"query": {
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
}
} Что можно проверить с помощью:
GET _refresh
POST my-index-000001/_search?size=0&filter_path=hits.total
{
"query": {
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
}
} Что приводит к осмысленному результату total, например такому:
{
"hits": {
"total" : {
"value": 0,
"relation": "eq"
}
}
} Автоматическое разбиение
Также можно позволить удалению по запросу автоматически параллелизировать использование разбитой прокрутки для разбиения на _id. Используйте slices для указания количества разбиений:
POST my-index-000001/_delete_by_query?refresh&slices=5
{
"query": {
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
}
} Что также можно проверить с помощью:
POST my-index-000001/_search?size=0&filter_path=hits.total
{
"query": {
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
}
} Что приводит к осмысленному результату total, например такому:
{
"hits": {
"total" : {
"value": 0,
"relation": "eq"
}
}
} Установка slices в auto позволит Elasticsearch выбрать количество разбиений. Этот параметр будет использовать одно разбиение на фрагмент до определенного предела. Если есть несколько источников потоков данных или индексов, он выберет количество разбиений на основе индекса или базового индекса с наименьшим количеством фрагментов.
Добавление slices к _delete_by_query просто автоматизирует ручной процесс, описанный выше, создавая подзапросы, что означает наличие некоторых особенностей:
- Эти запросы можно увидеть в API задач. Эти подзапросы являются «дочерними» задачами задачи для запроса с
slices. - Получение состояния задачи для запроса с
slicesсодержит только состояние завершённых разбиений. - Эти подзапросы индивидуально доступны для таких операций, как отмена и повторное ограничение.
- Повторное ограничение запроса с
slicesпропорционально повторно ограничит незавершенные подзапросы. - Отмена запроса с помощью
slicesотменит каждый подзапрос. - Из-за природы
slicesкаждый подзапрос не получит идеально равной части документов. Все документы будут обработаны, но некоторые разбиения могут быть больше других. Ожидайте, что более крупные разбиения будут иметь более равномерное распределение. - Параметры, такие как
requests_per_secondиmax_docsв запросе с разбиениями, распределяются пропорционально каждому подзапросу. В сочетании с вышеупомянутым неравномерным распределением следует сделать вывод, что использованиеmax_docsсslicesможет не привести к удалению ровноmax_docsдокументов. - Каждый подзапрос получает немного другой снимок исходного потока данных или индекса, хотя они все взяты примерно в одно и то же время.
Изменение ограничения для запроса
Значение requests_per_second можно изменить для выполняющегося удаления по запросу с помощью API _rethrottle. Повторное ограничение, ускоряющее запрос, вступает в силу немедленно, но повторное ограничение, замедляющее запрос, вступает в силу после завершения текущего пакета, чтобы предотвратить истечение времени ожидания прокрутки.
POST _delete_by_query/r1A2WoRbTwKZ516z6NEs5A:36619/_rethrottle?requests_per_second=-1
Используйте API задач, чтобы получить идентификатор задачи. Установите requests_per_second на любое положительное десятичное значение или -1 для отключения ограничения.
Получение состояния операции удаления по запросу
Используйте API задач, чтобы получить состояние операции удаления по запросу:
GET _tasks?detailed=true&actions=*/delete/byquery
Ответ выглядит следующим образом:
{
"nodes" : {
"r1A2WoRbTwKZ516z6NEs5A" : {
"name" : "r1A2WoR",
"transport_address" : "127.0.0.1:9300",
"host" : "127.0.0.1",
"ip" : "127.0.0.1:9300",
"attributes" : {
"testattr" : "test",
"portsfile" : "true"
},
"tasks" : {
"r1A2WoRbTwKZ516z6NEs5A:36619" : {
"node" : "r1A2WoRbTwKZ516z6NEs5A",
"id" : 36619,
"type" : "transport",
"action" : "indices:data/write/delete/byquery",
"status" : {
"total" : 6154,
"updated" : 0,
"created" : 0,
"deleted" : 3500,
"batches" : 36,
"version_conflicts" : 0,
"noops" : 0,
"retries": 0,
"throttled_millis": 0
},
"description" : ""
}
}
}
}
} | Этот объект содержит фактическое состояние. Он такой же, как ответ в формате JSON, с важным добавлением поля |
С помощью идентификатора задачи вы можете получить доступ к задаче напрямую:
GET /_tasks/r1A2WoRbTwKZ516z6NEs5A:36619
Преимущество этого API заключается в интеграции с wait_for_completion=false для прозрачного возврата состояния завершённых задач. Если задача завершена, а wait_for_completion=false было установлено, она вернётся с полем results или error. Стоимость этой функции — документ, который wait_for_completion=false создаёт в .tasks/task/${taskId}. Вам нужно удалить этот документ.
Отмена операции удаления по запросу
Любое удаление по запросу можно отменить, используя API отмены задачи:
POST _tasks/r1A2WoRbTwKZ516z6NEs5A:36619/_cancel
Идентификатор задачи можно найти с помощью API задач.
Отмена должна произойти быстро, но может занять несколько секунд. API состояния задачи выше будет продолжать отображать задачу удаления по запросу, пока эта задача не проверит, что она отменена, и не завершит себя.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docs-delete-by-query.html