?refresh
编辑?refresh
编辑索引、更新、删除 和 批量 API 支持设置 refresh
来控制此请求所做的更改何时对搜索可见。 以下是允许的值:
-
空字符串或
true
- 在操作发生后立即刷新相关的 主分片 和副本分片(不是整个索引),以便更新的文档立即出现在搜索结果中。 这应该 仅 在仔细考虑并验证它不会导致索引和搜索的性能不佳后才进行。
-
wait_for
- 等待请求所做的更改通过刷新变得可见,然后再回复。 这不会强制立即刷新,而是等待刷新发生。 Elasticsearch 会自动刷新每
index.refresh_interval
(默认为一秒)更改过的分片。 该设置是动态的。 调用 刷新 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
。
批量请求在它们触及的每个分片上仅占用一个槽,无论它们修改分片的次数是多少。
示例
编辑这些将创建一个文档并立即刷新索引,使其可见
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"}