索引、更新、删除和批量API支持设置refresh
,以控制什么时候由此请求作出的更改对搜索可见,这些是容许的值:segmentfault
空字符串或true
性能
wait_for
code
index.refresh_interval
(默认值为1秒)自动刷新已经更改的碎片,这个设置是动态的。调用Refresh API或在任何支持它的API上将refresh
设置为true
也会致使刷新,从而致使已经运行的带有refresh=wait_for
的请求返回。false
(默认)索引
除非你有充分的理由等待更改变为可见,不然老是使用refresh=false
,或者,由于这是默认值,因此将refresh
参数排除在URL以外,这是最简单、最快的选择。资源
若是你必须使请求所作的更改可见与请求同步,那么你必须在对Elasticsearch增长更多负载(true
)和等待更长时间的响应(wait_for
)之间进行选择,如下几点应该为该决定提供参考:文档
true
相比,对索引进行的更改越多,wait_for
节省越多的工做,在每次index.refresh_interval
只更改一次索引的状况下,它不会节省任何工做。true
建立的索引结构效率较低(小段),稍后必须合并为更高效的索引结构(大段),这意味着true
的代价是在索引时建立小段,在搜索时搜索小段,在合并时制做大段。refresh=wait_for
请求,相反,将使用refresh=wait_for
的请求批量到单个bulk请求中,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_listener
(默认为1000
)请求等待刷新的状况下在那个碎片上出现refresh=wait_for
请求,那么该请求的行为就好像它已经将refresh
设置为true
同样:它将强制刷新。这保证了当refresh=wait_for
请求返回时,它的更改对于搜索是可见的,同时防止对被阻塞的请求使用未检查的资源,若是一个请求由于耗尽了监听器插槽而强制刷新,那么它的响应将包含"forced_refresh": true
。字符串
Bulk请求在每一个碎片上只占用一个插槽,无论它们修改碎片多少次。get
这将建立一个文档,并当即刷新索引,使其可见:同步
PUT /test/_doc/1?refresh {"test": "test"} PUT /test/_doc/2?refresh=true {"test": "test"}
这将建立一个文档,而不须要作任何事情使其对于搜索可见:it
PUT /test/_doc/3 {"test": "test"} PUT /test/_doc/4?refresh=false {"test": "test"}
这将建立一个文档,并等待它对于搜索成为可见:
PUT /test/_doc/4?refresh=wait_for {"test": "test"}