針對Lucene 建立索引過程與搜尋過程耗費時間的矛盾一點思路

來源:互聯網
上載者:User
使用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的話,帶來的問題就是,假如你的資料量足夠大,而使你產生更多的索引段.

以上就是我的方式,希望有更好的方式可以交流

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.