?refresh
API индексации, обновления, удаления и Bulk поддерживают установку refresh для управления временем, когда изменения, внесённые этим запросом, станут видимыми для поиска. Доступные значения:
- Пустая строка или
true - Немедленно обновляет соответствующие первичные и реплицированные фрагменты (а не весь индекс) после выполнения операции, так что обновлённый документ появляется в результатах поиска немедленно. Это должно только делаться после тщательного обдумывания и проверки, что это не приведёт к плохой производительности, как с точки зрения индексирования, так и с точки зрения поиска.
-
wait_for - Дожидается, пока изменения, внесённые запросом, станут видимыми после обновления, прежде чем ответить. Это не принуждает к немедленному обновлению, а скорее ожидает, когда произойдёт обновление. Elasticsearch автоматически обновляет изменённые фрагменты каждые
index.refresh_interval, по умолчанию равное одной секунде. Это значение динамично. Вызов API обновления или установкаrefreshвtrueв любом из поддерживающих его API также вызовет обновление, что, в свою очередь, вызовет возврат уже выполняемых запросов сrefresh=wait_for. -
false(по умолчанию) - Не выполнять никаких действий, связанных с обновлением. Внесённые этим запросом изменения станут видимыми в какой-то момент после возврата ответа запроса.
Выбор используемого значения
Если у вас нет веской причины ждать, пока изменения станут видимыми, всегда используйте refresh=false (значение по умолчанию). Самый простой и быстрый вариант — опустить параметр refresh из URL.
Если вам абсолютно необходимо, чтобы изменения, внесённые запросом, были видимы синхронно с запросом, вы должны выбрать между большей нагрузкой на Elasticsearch (true) и более длительным ожиданием ответа (wait_for). Вот несколько моментов, которые должны прояснить это решение:
- Чем больше изменений вносится в индекс, тем больше работы
wait_forсберегает по сравнению сtrue. В случае, если индекс изменяется только один раз каждыеindex.refresh_interval, он не экономит никакой работы. -
trueсоздаёт менее эффективные структуры индексов (маленькие сегменты), которые впоследствии должны быть объединены в более эффективные структуры индексов (большие сегменты). Это означает, что стоимостьtrueоплачивается во время индексирования для создания маленького сегмента, во время поиска для поиска маленького сегмента и во время слияния для создания больших сегментов. - Никогда не начинайте несколько запросов
refresh=wait_forподряд. Вместо этого объедините их в один массовый запрос сrefresh=wait_for, и Elasticsearch запустит их все параллельно и вернёт только тогда, когда все они завершатся. - Если интервал обновления установлен на
-1, отключив автоматические обновления, запросы сrefresh=wait_forбудут ждать бесконечно, пока какое-либо действие не вызовет обновление. И наоборот, установкаindex.refresh_intervalна значение, меньшее, чем по умолчанию, например,200ms, ускорит возвратrefresh=wait_for, но всё равно будут созданы неэффективные сегменты. -
refresh=wait_forвлияет только на запрос, в котором он присутствует, но, принуждая к немедленному обновлению,refresh=trueповлияет на другие текущие запросы. В общем случае, если у вас работает система, которую вы не хотите беспокоить,refresh=wait_for— это меньшее изменение.
refresh=wait_for Может вызывать обновление
Если запрос refresh=wait_for поступает, когда уже есть index.max_refresh_listeners (по умолчанию 1000) запросов, ожидающих обновления в этом фрагменте, этот запрос будет вести себя так, как будто у него был установлен refresh на true: он принудительно вызовет обновление. Это сохраняет обещание, что при возврате запроса refresh=wait_for его изменения будут видны для поиска, одновременно предотвращая неконтролируемое использование ресурсов для заблокированных запросов. Если запрос принудительно вызывал обновление из-за исчерпания слотов слушателей, то его ответ будет содержать "forced_refresh": true.
Массовые запросы занимают только один слот на каждом фрагменте, который они затрагивают, независимо от того, сколько раз они изменяют фрагмент.
Примеры
Эти запросы создадут документ и немедленно обновят индекс, чтобы он стал видимым:
PUT /test/_doc/1?refresh
{"test": "test"}
PUT /test/_doc/2?refresh=true
{"test": "test"} Эти запросы создадут документ, не выполнив никаких действий, чтобы сделать его видимым для поиска:
PUT /test/_doc/3
{"test": "test"}
PUT /test/_doc/4?refresh=false
{"test": "test"} Этот запрос создаст документ и подождёт, пока он станет видимым для поиска:
PUT /test/_doc/4?refresh=wait_for
{"test": "test"}
© 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-refresh.html