索引、更新、刪除和批量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"}