API удаления по запросу
Удаляет документы, соответствующие указанному запросу.
resp = client.delete_by_query(
index="my-index-000001",
query={
"match": {
"user.id": "elkbee"
}
},
)
print(resp) response = client.delete_by_query(
index: 'my-index-000001',
body: {
query: {
match: {
'user.id' => 'elkbee'
}
}
}
)
puts response const response = await client.deleteByQuery({
index: "my-index-000001",
query: {
match: {
"user.id": "elkbee",
},
},
});
console.log(response); 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 управляет тем, сколько времени каждый запрос записи ожидает, пока недоступные фрагменты не станут доступными. Оба работают точно так же, как и в 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. -
-
ignore_unavailable - (Необязательно, логическое значение) Если
false, запрос возвращает ошибку, если он обращается к отсутствующему или закрытому индексу. По умолчаниюfalse. -
lenient -
(Необязательно, логическое значение) Если
true, ошибки запроса, основанные на формате (например, предоставление текста в числовое поле) в строке запроса будут игнорироваться. По умолчаниюfalse.Этот параметр может быть использован только при указании параметра строки запроса
q. -
max_docs - (Необязательно, целое число) Максимальное количество документов для обработки. По умолчанию все документы. Если установлено значение меньше или равно
scroll_size, для получения результатов операции не будет использоваться скроллинг. -
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 - Это поле всегда равно нулю для удаления по запросу. Оно существует только для того, чтобы API удаления по запросу, обновления по запросу и переиндексации возвращали ответы с одинаковой структурой.
-
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 или индекса:
resp = client.delete_by_query(
index="my-index-000001",
conflicts="proceed",
query={
"match_all": {}
},
)
print(resp) response = client.delete_by_query(
index: 'my-index-000001',
conflicts: 'proceed',
body: {
query: {
match_all: {}
}
}
)
puts response const response = await client.deleteByQuery({
index: "my-index-000001",
conflicts: "proceed",
query: {
match_all: {},
},
});
console.log(response); POST my-index-000001/_delete_by_query?conflicts=proceed
{
"query": {
"match_all": {}
}
} Удалить документы из нескольких потоков данных или индексов:
resp = client.delete_by_query(
index="my-index-000001,my-index-000002",
query={
"match_all": {}
},
)
print(resp) response = client.delete_by_query(
index: 'my-index-000001,my-index-000002',
body: {
query: {
match_all: {}
}
}
)
puts response const response = await client.deleteByQuery({
index: "my-index-000001,my-index-000002",
query: {
match_all: {},
},
});
console.log(response); POST /my-index-000001,my-index-000002/_delete_by_query
{
"query": {
"match_all": {}
}
} Ограничить операцию удаления по запросу фрагментами, соответствующими определённому значению маршрутизации:
resp = client.delete_by_query(
index="my-index-000001",
routing="1",
query={
"range": {
"age": {
"gte": 10
}
}
},
)
print(resp) response = client.delete_by_query(
index: 'my-index-000001',
routing: 1,
body: {
query: {
range: {
age: {
gte: 10
}
}
}
}
)
puts response const response = await client.deleteByQuery({
index: "my-index-000001",
routing: 1,
query: {
range: {
age: {
gte: 10,
},
},
},
});
console.log(response); POST my-index-000001/_delete_by_query?routing=1
{
"query": {
"range" : {
"age" : {
"gte" : 10
}
}
}
} По умолчанию _delete_by_query использует порции скролла объёмом 1000. Вы можете изменить размер порции с помощью параметра URL scroll_size:
resp = client.delete_by_query(
index="my-index-000001",
scroll_size="5000",
query={
"term": {
"user.id": "kimchy"
}
},
)
print(resp) response = client.delete_by_query(
index: 'my-index-000001',
scroll_size: 5000,
body: {
query: {
term: {
'user.id' => 'kimchy'
}
}
}
)
puts response const response = await client.deleteByQuery({
index: "my-index-000001",
scroll_size: 5000,
query: {
term: {
"user.id": "kimchy",
},
},
});
console.log(response); POST my-index-000001/_delete_by_query?scroll_size=5000
{
"query": {
"term": {
"user.id": "kimchy"
}
}
} Удалить документ, используя уникальный атрибут:
resp = client.delete_by_query(
index="my-index-000001",
query={
"term": {
"user.id": "kimchy"
}
},
max_docs=1,
)
print(resp) response = client.delete_by_query(
index: 'my-index-000001',
body: {
query: {
term: {
'user.id' => 'kimchy'
}
},
max_docs: 1
}
)
puts response const response = await client.deleteByQuery({
index: "my-index-000001",
query: {
term: {
"user.id": "kimchy",
},
},
max_docs: 1,
});
console.log(response); POST my-index-000001/_delete_by_query
{
"query": {
"term": {
"user.id": "kimchy"
}
},
"max_docs": 1
} Ручное разбиение
Разбить операцию удаления по запросу вручную, указав идентификатор разбиения и общее количество разбиений:
resp = client.delete_by_query(
index="my-index-000001",
slice={
"id": 0,
"max": 2
},
query={
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
},
)
print(resp)
resp1 = client.delete_by_query(
index="my-index-000001",
slice={
"id": 1,
"max": 2
},
query={
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
},
)
print(resp1) response = client.delete_by_query(
index: 'my-index-000001',
body: {
slice: {
id: 0,
max: 2
},
query: {
range: {
'http.response.bytes' => {
lt: 2_000_000
}
}
}
}
)
puts response
response = client.delete_by_query(
index: 'my-index-000001',
body: {
slice: {
id: 1,
max: 2
},
query: {
range: {
'http.response.bytes' => {
lt: 2_000_000
}
}
}
}
)
puts response const response = await client.deleteByQuery({
index: "my-index-000001",
slice: {
id: 0,
max: 2,
},
query: {
range: {
"http.response.bytes": {
lt: 2000000,
},
},
},
});
console.log(response);
const response1 = await client.deleteByQuery({
index: "my-index-000001",
slice: {
id: 1,
max: 2,
},
query: {
range: {
"http.response.bytes": {
lt: 2000000,
},
},
},
});
console.log(response1); 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
}
}
}
} Что можно проверить с помощью:
resp = client.indices.refresh()
print(resp)
resp1 = client.search(
index="my-index-000001",
size="0",
filter_path="hits.total",
query={
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
},
)
print(resp1) response = client.indices.refresh
puts response
response = client.search(
index: 'my-index-000001',
size: 0,
filter_path: 'hits.total',
body: {
query: {
range: {
'http.response.bytes' => {
lt: 2_000_000
}
}
}
}
)
puts response const response = await client.indices.refresh();
console.log(response);
const response1 = await client.search({
index: "my-index-000001",
size: 0,
filter_path: "hits.total",
query: {
range: {
"http.response.bytes": {
lt: 2000000,
},
},
},
});
console.log(response1); 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 для указания количества разбиений:
resp = client.delete_by_query(
index="my-index-000001",
refresh=True,
slices="5",
query={
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
},
)
print(resp) response = client.delete_by_query(
index: 'my-index-000001',
refresh: true,
slices: 5,
body: {
query: {
range: {
'http.response.bytes' => {
lt: 2_000_000
}
}
}
}
)
puts response const response = await client.deleteByQuery({
index: "my-index-000001",
refresh: "true",
slices: 5,
query: {
range: {
"http.response.bytes": {
lt: 2000000,
},
},
},
});
console.log(response); POST my-index-000001/_delete_by_query?refresh&slices=5
{
"query": {
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
}
} Что также можно проверить с помощью:
resp = client.search(
index="my-index-000001",
size="0",
filter_path="hits.total",
query={
"range": {
"http.response.bytes": {
"lt": 2000000
}
}
},
)
print(resp) response = client.search(
index: 'my-index-000001',
size: 0,
filter_path: 'hits.total',
body: {
query: {
range: {
'http.response.bytes' => {
lt: 2_000_000
}
}
}
}
)
puts response const response = await client.search({
index: "my-index-000001",
size: 0,
filter_path: "hits.total",
query: {
range: {
"http.response.bytes": {
lt: 2000000,
},
},
},
});
console.log(response); 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в запросе сslices, распределяются пропорционально каждому подзапросу. В сочетании с вышеупомянутым неравномерным распределением следует сделать вывод, что использованиеmax_docsсslicesможет не привести к удалению ровноmax_docsдокументов. - Каждый подзапрос получает немного другой снимок исходного потока данных или индекса, хотя все они берутся примерно в одно и то же время.
Изменение ограничения для запроса
Значение requests_per_second может быть изменено для выполняемой операции удаления по запросу с помощью API _rethrottle. Повторное ограничение, ускоряющее запрос, вступает в силу немедленно, но повторное ограничение, замедляющее запрос, вступает в силу после завершения текущей порции, чтобы предотвратить временные сбои скролла.
$params = [
'task_id' => 'r1A2WoRbTwKZ516z6NEs5A:36619',
];
$response = $client->deleteByQueryRethrottle($params); resp = client.delete_by_query_rethrottle(
task_id="r1A2WoRbTwKZ516z6NEs5A:36619",
requests_per_second="-1",
)
print(resp) response = client.delete_by_query_rethrottle( task_id: 'r1A2WoRbTwKZ516z6NEs5A:36619', requests_per_second: -1 ) puts response
res, err := es.DeleteByQueryRethrottle( "r1A2WoRbTwKZ516z6NEs5A:36619", esapi.IntPtr(-1), ) fmt.Println(res, err)
const response = await client.deleteByQueryRethrottle({
task_id: "r1A2WoRbTwKZ516z6NEs5A:36619",
requests_per_second: "-1",
});
console.log(response); POST _delete_by_query/r1A2WoRbTwKZ516z6NEs5A:36619/_rethrottle?requests_per_second=-1
Используйте API задач, чтобы получить идентификатор задачи. Установите requests_per_second на любое положительное десятичное значение или -1 для отключения ограничения.
Получение статуса операции удаления по запросу
Используйте API задач, чтобы получить статус операции удаления по запросу:
$response = $client->tasks()->list();
resp = client.tasks.list(
detailed=True,
actions="*/delete/byquery",
)
print(resp) response = client.tasks.list( detailed: true, actions: '*/delete/byquery' ) puts response
res, err := es.Tasks.List(
es.Tasks.List.WithActions("*/delete/byquery"),
es.Tasks.List.WithDetailed(true),
)
fmt.Println(res, err) const response = await client.tasks.list({
detailed: "true",
actions: "*/delete/byquery",
});
console.log(response); 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 с важным добавлением поля |
С помощью идентификатора задачи можно получить доступ к задаче напрямую:
$params = [
'task_id' => 'r1A2WoRbTwKZ516z6NEs5A:36619',
];
$response = $client->tasks()->get($params); resp = client.tasks.get(
task_id="r1A2WoRbTwKZ516z6NEs5A:36619",
)
print(resp) response = client.tasks.get( task_id: 'r1A2WoRbTwKZ516z6NEs5A:36619' ) puts response
res, err := es.Tasks.Get( "r1A2WoRbTwKZ516z6NEs5A:36619", ) fmt.Println(res, err)
const response = await client.tasks.get({
task_id: "r1A2WoRbTwKZ516z6NEs5A:36619",
});
console.log(response); GET /_tasks/r1A2WoRbTwKZ516z6NEs5A:36619
Преимущество этого API заключается в том, что он интегрируется с wait_for_completion=false для прозрачного возврата состояния завершенных задач. Если задача завершена и wait_for_completion=false была установлена для неё, она вернётся с полем results или error. Стоимость этой функции — документ, который wait_for_completion=false создаёт в .tasks/task/${taskId}. Вам нужно удалить этот документ.
Отмена операции удаления по запросу
Любое удаление по запросу можно отменить, используя API отмены задач:
$params = [
'task_id' => 'r1A2WoRbTwKZ516z6NEs5A:36619',
];
$response = $client->tasks()->cancel($params); resp = client.tasks.cancel(
task_id="r1A2WoRbTwKZ516z6NEs5A:36619",
)
print(resp) response = client.tasks.cancel( task_id: 'r1A2WoRbTwKZ516z6NEs5A:36619' ) puts response
res, err := es.Tasks.Cancel(
es.Tasks.Cancel.WithTaskID("r1A2WoRbTwKZ516z6NEs5A:36619"),
)
fmt.Println(res, err) const response = await client.tasks.cancel({
task_id: "r1A2WoRbTwKZ516z6NEs5A:36619",
});
console.log(response); 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/8.17/docs-delete-by-query.html