使用lucene,首先要做的就是建立索引檔案,這是一個非常耗時的工作,特別是針對大資料量進行索引的時候更是如此.
Lucene 提供了幾個最佳化參數
mergeFactor,maxMergeDocs,minMergeDocs,首先說的是mergeFactor, 預設值為10,控制索引段的合并頻率和大小,即每當有10個Document對象添加到索引段時,lucene就會在磁碟建立一個新的段,當建立了10個這樣的段之後就會將這10個段合并為一個段,以此類推下去,當這個段內的Document對象數量沒有超過maxMergeDocs的值的時候,會一直按照這個規則合并下去,同時磁碟目錄內的索引段數量控制在10個以內.
當制定了較小的mergeFactor時,也就意味著將進行大量的磁碟操作,但是帶來的好處是產生較少個數的索引檔案.於是矛盾就產生了
mergeFactor較小 則製作索引檔案非常慢,但是搜尋相對會快.
我們如何來解決這樣的矛盾呢? 我提出如下的解決方案,並且已經在我們項目中使用了這樣的方式.
我先說明下我們的需求.
我們是將資料庫中的內容製作成索引檔案並提供搜尋,資料庫中有上百萬的資料,製作一次索引大概需要1個半小時時間(資料庫和索引製作程式在一個機器上)
好了,不廢話了,說我們的方式
lucene 提供了FsDirectory和RamDirectory兩種方式,這裡我們首先使用RamDirectory,也就是說我們在記憶體中建立索引檔案,儲存的Document個數根據你記憶體而定了,這樣不管mergefactor 指定多少,索引段合并多少次,都是在記憶體中操作了,減少了IO操作, 當Document的個數比如大於5000時 將RamDirectory 中的內容合并到FsDirectory中,通過fsDirectory.addIndexes(Directory[] {RamDirectory});實現.
這樣也就意味著每添加5000個Document 才進行了一次IO操作,而假如把mergeFactor設定為5000的話,帶來的問題就是,假如你的資料量足夠大,而使你產生更多的索引段.
以上就是我的方式,希望有更好的方式可以交流