?refresh
编辑?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_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
可以强制刷新编辑
如果在该分片上已有 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"}