При запросе больших объемов данных ожидание полезной нагрузки может занять очень много времени. API асинхронного поиска предназначен для получения огромных объемов данных не одним запросом, а в виде потока.
Это означает, что вместо того, чтобы ждать, пока запрос закончит получение всех результатов, асинхронный запрос будет возвращать результаты частично, по мере их сбора.
Запрос будет возвращать идентификатор и другие индикаторы состояния, поэтому можно закрыть консоль или терминал Kibana DevTools и вернуться позже, чтобы посмотреть ход выполнения запроса и полученные результаты.
Выполнение асинхронного поискового запроса
Асинхронный поисковый запрос получает те же параметры, что и обычный поиск.
Давайте проиндексируем несколько документов и выполним запрос.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | POST test_async/_doc { "text": "Doc1" } POST test_async/_doc { "text": "Doc2" } POST test_async/_doc { "text": "Example doc" } POST test_async/_async_search |
Ответ будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | { "id": "SOME_ID", "is_partial": false, "is_running": false, "start_time_in_millis": 1636010235096, "expiration_time_in_millis": 1636442235096, "response": { "took": 719, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1.0, "hits": [ { "_index": "test_async", "_type": "_doc", "_id": "0JjG6XwBpL6RE1SX6qi6", "_score": 1.0, "_source": { "title": "Example doc" } }, { "_index": "test_async", "_type": "_doc", "_id": "0ZjO6XwBpL6RE1SX0Kgt", "_score": 1.0, "_source": { "text": "Doc1" } }, { "_index": "test_async", "_type": "_doc", "_id": "0pjO6XwBpL6RE1SX1KgU", "_score": 1.0, "_source": { "text": "Doc2" } } ] } } } |
Важные свойства в асинхронных поисковых запросах
Поле | Описание |
id | Если запрос выполняется дольше заданного времени, установленного в параметре wait_for_completion_timeout, то генерируется идентификатор для последующего получения статуса запроса. |
is_partial | Когда запрос выполняется, этот параметр всегда будет равен true. В противном случае он будет указывать на неудачу или завершение запроса. |
is_running | Указывает, выполняется ли запрос или завершен. |
shards.total | Общее количество осколков, на которых будет выполняться запрос. |
shards.successful | Количество осколков, на которых до текущего момента времени успешно выполнялся запрос. |
hits.total.value | Документы, возвращенные запросом на данный момент. Эти документы относятся к "успешным осколкам". |
Как получить только статус
Если нам не нужны хиты запроса и мы хотим проверить только статус, мы можем вызвать конечную точку status:
1 | GET /_async_search/status/SOME_ID |
Ответ будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 | { "id" : "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=", "is_running" : true, "is_partial" : true, "start_time_in_millis" : 1583945890986, "expiration_time_in_millis" : 1584377890986, "_shards" : { "total" : 562, "successful" : 188, "skipped" : 0, "failed" : 0 } } |
Свойство "successful" указывает количество осколков, на которых был выполнен запрос.
Для завершенного асинхронного поиска в ответе состояния имеется дополнительное поле completion_status, в котором указывается код состояния HTTP завершенного асинхронного поиска.
Например, если запрос выполнен корректно:
1 | "completion_status" : 200 |
Если запрос выполнился с ошибками:
1 | "completion_status" : 503 |
Как удалить запрос
Если в какой-то момент времени необходимо отменить выполнение async-запроса, можно вызвать глагол DELETE, и запрос будет отменен.
1 | DELETE /_async_search/SOME_ID |
Если в OpenSearch включены средства безопасности, то удалять запросы могут два типа пользователей:
- Аутентифицированный пользователь, выполнивший запрос
- Пользователь, имеющий кластерные привилегии 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.
Заключение
Использование асинхронного поиска - отличная идея, когда необходимо выполнять запросы с высокими требованиями и получать частичные результаты, а не ждать окончания запроса.