Spec-Zone.ru › Elasticsearch 7
›Руководство по Elasticsearch [7.17] ›REST API ›API документов

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, с важным добавлением поля total. total — это общее количество операций, которые ожидает выполнить переиндексация. Вы можете оценить прогресс, сложив поля updated, created и deleted. Запрос завершится, когда их сумма будет равна полю total.

С помощью идентификатора задачи вы можете получить доступ к задаче напрямую:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API