OpenSearch: Асинхронный поиск

При запросе больших объемов данных ожидание полезной нагрузки может занять очень много времени. API асинхронного поиска предназначен для получения огромных объемов данных не одним запросом, а в виде потока.

Это означает, что вместо того, чтобы ждать, пока запрос закончит получение всех результатов, асинхронный запрос будет возвращать результаты частично, по мере их сбора.

Запрос будет возвращать идентификатор и другие индикаторы состояния, поэтому можно закрыть консоль или терминал Kibana DevTools и вернуться позже, чтобы посмотреть ход выполнения запроса и полученные результаты.

Выполнение асинхронного поискового запроса

Асинхронный поисковый запрос получает те же параметры, что и обычный поиск.

Давайте проиндексируем несколько документов и выполним запрос.

Ответ будет выглядеть следующим образом:

Важные свойства в асинхронных поисковых запросах

Поле Описание
id Если запрос выполняется дольше заданного времени, установленного в параметре wait_for_completion_timeout, то генерируется идентификатор для последующего получения статуса запроса.
is_partial Когда запрос выполняется, этот параметр всегда будет равен true. В противном случае он будет указывать на неудачу или завершение запроса.
is_running Указывает, выполняется ли запрос или завершен.
shards.total Общее количество осколков, на которых будет выполняться запрос.
shards.successful Количество осколков, на которых до текущего момента времени успешно выполнялся запрос.
hits.total.value Документы, возвращенные запросом на данный момент. Эти документы относятся к "успешным осколкам".

Как получить только статус

Если нам не нужны хиты запроса и мы хотим проверить только статус, мы можем вызвать конечную точку status:

Ответ будет выглядеть следующим образом:

Свойство "successful" указывает количество осколков, на которых был выполнен запрос.

Для завершенного асинхронного поиска в ответе состояния имеется дополнительное поле completion_status, в котором указывается код состояния HTTP завершенного асинхронного поиска.

Например, если запрос выполнен корректно:

Если запрос выполнился с ошибками:

Как удалить запрос

Если в какой-то момент времени необходимо отменить выполнение async-запроса, можно вызвать глагол DELETE, и запрос будет отменен.

Если в OpenSearch включены средства безопасности, то удалять запросы могут два типа пользователей:

  1. Аутентифицированный пользователь, выполнивший запрос
  2. Пользователь, имеющий кластерные привилегии cancel_task.

Дополнительные параметры

Поле Описание
wait_for_completion_timeout Блокирует выполнение запроса таким образом, чтобы он завершился через указанное время, по умолчанию равное 1 секунде. Результаты не будут сохранены (поле ID отсутствует), если запрос завершился раньше этого времени.
keep_on_completion Сохраняет результаты, даже если запрос завершился в течение таймаута wait_for_completion_timeout.
keep_alive По умолчанию равно 5 дням и определяет, в течение какого времени будет сохраняться состояние асинхронных запросов. По истечении этого времени все текущие запросы и статусы будут удалены.
batched_reduce_size Определяет, как часто становятся доступны частичные результаты, по умолчанию 5.
request_cache Используется для включения или отключения кэширования на основе *по каждому запросу*.
По умолчанию имеет значение true.

Следующие параметры не могут быть изменены, но заслуживают внимания:

Поле Описание
pre_filter_shard_size Значение 1 принуждает выполнять предварительный обход фильтра, чтобы пропустить документы, не соответствующие запросу.
ccs_minimize_roundtrips Указывает на необходимость минимизации сетевых обходов при выполнении кросс-кластерных поисковых запросов. Устанавливается в значение false.

OpenSearch по умолчанию не ограничивает размер ответа на async-запросы. Хранение огромных ответов может дестабилизировать работу кластера. Чтобы ограничить максимальный размер ответа, можно изменить кластерный параметр search.max_async_search_response_size.

Заключение

Использование асинхронного поиска - отличная идея, когда необходимо выполнять запросы с высокими требованиями и получать частичные результаты, а не ждать окончания запроса.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий