Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›REST API ›Документы API

?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

Spec-Zone.ru

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