Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.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.

Массовые запросы занимают только один слот на каждом фрагменте, который они затрагивают, независимо от того, сколько раз они изменяют фрагмент.

Примеры

Эти запросы создадут документ и немедленно обновят индекс, чтобы он стал видимым:

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

Spec-Zone.ru

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