-
在ES中, 要保證被索引的文檔能夠立即被搜索到, 有兩種方法:_refresh 或者_flush。
-
es.indices.refresh(index="ccat1")
-
那么二者的區別是什么呢?要搞懂這個問題, 就需要對ES中文檔的索引過程有個了解。
我們知道ES的索引數據是寫入到磁盤上的。但這個過程是分階段實現的,因為IO的操作是比較費時的。
當一個文檔進入ES的初期, 文檔是被存儲到內存里的,默認經過1s之后, 會被寫入文件系統緩存,這樣該文檔就可以被搜索到了,注意,此時該索引數據並沒有最終寫入到磁盤上。如果你對這1s的時間間隔還不滿意, 調用_refresh就可以立即實現內存->文件系統緩存, 從而使文檔可以立即被搜索到。
所以refresh實現的是文檔數據從內存到文件系統緩存的過程。
再來看flush,flush是用於translog的。
ES為了數據的安全, 在接受寫入的文檔的時候, 在寫入內存buffer的同時, 會寫一份translog日志,從而在出現程序故障/磁盤異常時, 保證數據的完整和安全。flush會觸發lucene commit,並清空translog日志文件。 translog的flush是ES在后台自動執行的,默認情況下ES每隔5s會去檢測要不要flush translog,默認條件是:每 30 分鍾主動進行一次 flush,或者當 translog 文件大小大於 512MB主動進行一次 flush。對應的配置是index.translog.flush_threshold_period 和 index.translog.flush_threshold_size
需要指出的是, 從ES2.0開始,每次 index、bulk、delete、update 完成的時候,一定觸發flush translog 到磁盤上,才給請求返回 200 OK。這個改變提高了數據安全性,但是會對寫入的性能造成不小的影響。在寫入效率優先的情況下,可以在 index template 里設置如下參數:"index.translog.durability":"async" 和 "index.translog.sync_interval":30s (默認是5s)。