?refresh编辑

索引更新删除批量 API 支持设置 refresh 来控制此请求所做的更改何时对搜索可见。以下是允许的值:

空字符串或 true
在操作发生后立即刷新相关的 主分片 和 副本分片(而不是整个索引),以便更新后的文档立即出现在搜索结果中。这应该在经过仔细考虑和验证后才能进行,以确保它不会导致索引和搜索性能不佳。
wait_for
在回复之前,等待刷新使请求所做的更改可见。这不会强制立即刷新,而是等待刷新发生。Elasticsearch 会自动刷新每 index.refresh_interval 更改过的分片,默认值为 1 秒。该设置是 动态的。调用 刷新 API 或在任何支持它的 API 上将 refresh 设置为 true 也会导致刷新,进而导致已运行的 refresh=wait_for 请求返回。
false(默认值)
不采取任何与刷新相关的操作。此请求所做的更改将在请求返回后的某个时间点变得可见。

选择要使用的设置编辑

除非您有充分的理由等待更改变得可见,否则请始终使用 refresh=false(默认设置)。最简单、最快的选择是从 URL 中省略 refresh 参数。

如果您绝对必须使请求所做的更改与请求同步可见,则必须在增加 Elasticsearch 的负载 (true) 和等待更长的响应时间 (wait_for) 之间做出选择。以下几点可以帮助您做出决定:

  • 对索引所做的更改越多,wait_fortrue 相比节省的工作就越多。如果索引仅在每个 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 可以强制刷新编辑

如果在该分片上已有 index.max_refresh_listeners(默认为 1000)个请求正在等待刷新时收到 refresh=wait_for 请求,则该请求的行为将与 refresh 设置为 true 时完全相同:它将强制刷新。这保证了当 refresh=wait_for 请求返回时,其更改对搜索可见,同时防止了对阻塞请求的资源使用不受控制。如果请求因为侦听器插槽不足而强制刷新,则其响应将包含 "forced_refresh": true

批量请求在它们接触的每个分片上只占用一个插槽,无论它们修改分片的次数是多少。

示例编辑

这些将创建一个文档并立即刷新索引,使其可见:

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
PUT /test/_doc/1?refresh
{"test": "test"}
PUT /test/_doc/2?refresh=true
{"test": "test"}

这些将创建一个文档,而不会执行任何操作使其对搜索可见:

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
PUT /test/_doc/3
{"test": "test"}
PUT /test/_doc/4?refresh=false
{"test": "test"}

这将创建一个文档并等待它对搜索可见:

response = client.index(
  index: 'test',
  id: 4,
  refresh: 'wait_for',
  body: {
    test: 'test'
  }
)
puts response
PUT /test/_doc/4?refresh=wait_for
{"test": "test"}