隨著按段(per-segment)搜尋的發展,
乙個新的文件從索引到可被搜尋的延遲顯著降低了。新文件在幾分鐘之內即可被檢索,但這樣還是不夠快。
磁碟在這裡成為了瓶頸。
提交(commiting)乙個新的段到磁碟需要乙個fsync
來確保段被物理性地寫入磁碟,這樣在斷電的時候就不會丟失資料。 但是fsync
操作代價很大; 如果每次索引乙個文件都去執行一次的話會造成很大的效能問題。
我們需要的是乙個更輕量的方式來使乙個文件可被搜尋,這意味著fsync
要從整個過程中被移除。
在elasticsearch和磁碟之間是檔案系統快取。
像之前描述的一樣, 在記憶體索引緩衝區
中的文件會被寫入到乙個新的段中
。 但是這裡新段會被先寫入到檔案系統快取--這一步代價會比較低,稍後再被重新整理到磁碟--這一步代價比較高。不過只要檔案已經在快取中, 就可以像其它檔案一樣被開啟和讀取了。
lucene 允許新段被寫入和開啟--使其包含的文件在未進行一次完整提交時便對搜尋可見。 這種方式比進行一次提交代價要小得多,並且在不影響效能的前提下可以被頻繁地執行。
緩衝區的內容已經被寫入乙個可被搜尋的段中,但還沒有進行提交
在 elasticsearch 中,寫入和開啟乙個新段的輕量的過程叫做 refresh
。預設情況下每個分片會每秒自動重新整理一次。這就是為什麼我們說 elasticsearch 是 近
實時搜尋: 文件的變化並不是立即對搜尋可見,但會在一秒之內變為可見。
這些行為可能會對新使用者造成困惑: 他們索引了乙個文件然後嘗試搜尋它,但卻沒有搜到。這個問題的解決辦法是用refresh
api 執行一次手動重新整理:
/_refresh
post
/blogs
/_refresh
重新整理(refresh)所有的索引。
只重新整理(refresh)blogs
索引。
儘管重新整理是比提交輕量很多的操作,它還是會有效能開銷。
當寫測試的時候, 手動重新整理很有用,但是不要在生產環境下每次索引乙個文件都去手動重新整理。 相反,你的應用需要意識到 elasticsearch 的近實時的性質,並接受它的不足。
並不是所有的情況都需要每秒重新整理。可能你正在使用 elasticsearch 索引大量的日誌檔案, 你可能想優化索引速度而不是近實時搜尋, 可以通過設定refresh_interval
, 降低每個索引的重新整理頻率:
/my_logs
}每30秒重新整理my_logs
索引。
refresh_interval
可以在既存索引上進行動態更新。 在生產環境中,當你正在建立乙個大的新索引時,可以先關閉自動重新整理,待開始使用該索引時,再把它們調回來:
/my_logs
/_settings
put
/my_logs
/_settings
關閉自動重新整理。
每秒自動重新整理。
refresh_interval
需要乙個 持續時間
值, 例如1s
(1 秒) 或2m
(2 分鐘)。 乙個絕對值 1
表示的是 1毫秒
--無疑會使你的集群陷入癱瘓。
lucene4 5近實時搜尋
近實時搜尋就是他能開啟乙個indexwriter快速搜尋索引變更的內容,而不必關閉writer,或者向writer提交,這個功能是在2.9版本以後引入的,在以前沒有這個功能時,必須呼叫writer的commit方法,然後重新開啟reader,這個過程很耗費時間,因為writer的提交必須對索引裡的所...
Lucene近實時搜尋應用總結
最近因工作需要,用到了lucene,在需求中,需要對生成的索引檔案不斷的更新 新增 刪除等操作,同時還要實時的看到索引改動後的資料,在使用過程中碰到了lucene裡幾個比較常見的問題,特來總結記錄下。ok,進入正題。獲取索引的寫物件 public static indexwriter getinde...
sphinx 增量索引 實現近實時更新
一.sphinx增量索引的設定 資料庫中的已有資料很大,又不斷有新資料加入到資料庫中,也希望能夠檢索到。全部重新建立索引很消耗資源,因為我們需要更新的資料相比較而言很少。例如。原來的資料有幾百萬條,而新增的只是幾千條。這樣就可以使用 主索引 增量索引 的模式來實現近乎實時更新的功能。這個模式實現的基...