?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.
Массовые запросы занимают только один слот на каждом фрагменте, который они затрагивают, независимо от того, сколько раз они изменяют фрагмент.
Примеры
Эти запросы создадут документ и немедленно обновят индекс, чтобы он стал видимым:
resp = client.index(
index="test",
id="1",
refresh=True,
document={
"test": "test"
},
)
print(resp)
resp1 = client.index(
index="test",
id="2",
refresh=True,
document={
"test": "test"
},
)
print(resp1) response = client.index(
index: 'test',
id: 1,
refresh: true,
body: {
test: 'test'
}
)
puts response
response = client.index(
index: 'test',
id: 2,
refresh: true,
body: {
test: 'test'
}
)
puts response const response = await client.index({
index: "test",
id: 1,
refresh: "true",
document: {
test: "test",
},
});
console.log(response);
const response1 = await client.index({
index: "test",
id: 2,
refresh: "true",
document: {
test: "test",
},
});
console.log(response1); PUT /test/_doc/1?refresh
{"test": "test"}
PUT /test/_doc/2?refresh=true
{"test": "test"} Эти запросы создадут документ, не выполняя никаких действий, чтобы сделать его видимым для поиска:
resp = client.index(
index="test",
id="3",
document={
"test": "test"
},
)
print(resp)
resp1 = client.index(
index="test",
id="4",
refresh=False,
document={
"test": "test"
},
)
print(resp1) response = client.index(
index: 'test',
id: 3,
body: {
test: 'test'
}
)
puts response
response = client.index(
index: 'test',
id: 4,
refresh: false,
body: {
test: 'test'
}
)
puts response const response = await client.index({
index: "test",
id: 3,
document: {
test: "test",
},
});
console.log(response);
const response1 = await client.index({
index: "test",
id: 4,
refresh: "false",
document: {
test: "test",
},
});
console.log(response1); PUT /test/_doc/3
{"test": "test"}
PUT /test/_doc/4?refresh=false
{"test": "test"} Этот запрос создаст документ и подождёт, пока он станет видимым для поиска:
resp = client.index(
index="test",
id="4",
refresh="wait_for",
document={
"test": "test"
},
)
print(resp) response = client.index(
index: 'test',
id: 4,
refresh: 'wait_for',
body: {
test: 'test'
}
)
puts response const response = await client.index({
index: "test",
id: 4,
refresh: "wait_for",
document: {
test: "test",
},
});
console.log(response); 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/8.17/docs-refresh.html