lucene 索引合併問題

2021-04-12 19:10:25 字數 2463 閱讀 1640

lucene 索引合併 關鍵步驟如下:

indexwriter fswriter = null ;                //fs

indexwriter ramwriter = null ;                //ram

directory fsdir;

directory ramdir;

ramdir = new ramdirectory();

//  判斷原索引檔案是否存在

//開啟已經存在的索引檔案  最後一項必須為false 若為true則會刪除已經存在的索引 這一步很重要

system.out.println("*********now open exist index :" + indexpath + "**********");

fswriter = new indexwriter(indexpath, new standardanalyzer(),false);

//fswriter.setusecompoundfile(false);        //設定復合索引false

ramwriter = new indexwriter(ramdir, new standardanalyzer(),true);        //構建給予ram的索引

system.out.println("compoundfile()= " + fswriter.getusecompoundfile());

//對datadir目錄下的所有檔案建立ram索引

buildramindexdirectory(datadir);

ramwriter.optimize();                                //記憶體索引優化          

system.out.println("...begin combin index.....");

fswriter.addindexes(new directory);       //索引合併

ramwriter.close();                        //關閉記憶體索引       

fswriter.close();                        //關閉檔案索引

上述方法是通過ram 和fs 合併  也可以合併 fs 和fs.

合併ram索引的時候 可以根據記憶體大小 通過控制 ram 索引的大小來分批量多次進行合併。

while());       //索引合併

ramwriter.close();                        //關閉記憶體索引  

ramwriter = new indexwriter(ramdir, new standardanalyzer(),true);        //構建給予ram的索引}}

背景:單執行緒為30萬條資料建索引花了10分鐘,為了提高效率採用多執行緒

起初我採用多個執行緒共享乙個indexwriter例項(也意味著往同乙個目錄寫索引),這是

lucene in action 和lucene wiki的推薦做法,不知道到為什麼總是報filenotfoundexception,

很讓人困惑。偶爾會成功一次。這個錯誤讓我想起另外乙個問題,就是在建索引的時候搜尋也會報這個

錯誤,lucene in action 明明也說了建索引讀的時候沒問題。

言歸正傳,我第二次嘗試使用每個執行緒單獨擁有自己的indexwriter例項,但往同乙個目錄寫索引,果然報了

寫鎖的錯, 這和書上說的很一致。

最後沒辦法了,我使用每個執行緒單獨使用自己的例項,往自己的目錄寫索引,最後乙個幹完的執行緒將所有的索引合併

比如我開了4個執行緒,那麼就有5個目錄build_index,build_index1,build_index2,build_index3,build_index4

執行緒1往build_index1中寫,執行緒2往build_index2,。。。依次類推,最後乙個幹完的將build_index1-4目錄的索引合併到

build_index.

我開了4個執行緒嘗試發現也要花大概7-8分鐘,合併索引的過程非常快20秒左右。

開了10個執行緒,整個過程需要6分多鐘,合併索引也只花了21秒。

似乎效果並不明顯,這因該是因為資料量還不夠大引起的,資料量越大,並行的優勢會越明顯

可見合併索引的過程非常快,這又提供了另外的好處,我們通常將build_index作為搜尋目錄,就像上面說的那樣,建索引的過程 會影響搜尋(雖然按 照書上說是不影響的),如果我們採用這種方案,建索引的絕大部分過程其實與build_index目錄無關,只有最後 合併的時候需要用到 build_index,但那個過程又非常的快速,所以可以極大的緩解建索引給搜尋帶來的問題。

順便說:當然你也可以再開乙個通知執行緒專門等待索引執行緒,當索引執行緒完畢之後加入通知執行緒的佇列,通知執行緒發現自己的佇列有通知記錄就開始合併索引,這樣就不用所有的執行緒完畢之後才開始合併索引。(這種方案待嘗試)

如果條件允許,你可以擴充套件一下這個方案,將多執行緒索引公升級為多台機器同時建。

lucene索引合併

lucene 索引合併 關鍵步驟如下 indexwriter fswriter null fs indexwriter ramwriter null ram directory fsdir directory ramdir ramdir new ramdirectory 判斷原索引檔案是否存在 開啟...

lucene索引合併與增量索引

利用 lucene,在建立索引的工程中你可以充分利用機器的硬體資源來提高索引的效率。當你需要索引大量的檔案時,你會注意到索引過程的 瓶頸是在 往磁碟上寫索引檔案的過程中。為了解決這個問題,lucene 在記憶體中持有一塊緩衝區。但我們如何控制 lucene 的緩衝區呢?幸運的是,lucene 的類 ...

lucene索引合併與增量索引

利用 lucene,在建立索引的工程中你可以充分利用機器的硬體資源來提高索引的效率。當你需要索引大量的檔案時,你會注意到索引過程的瓶頸是在往磁碟上寫索引檔案的過程中。為了解決這個問題,lucene 在記憶體中持有一塊緩衝區。但我們如何控制 lucene 的緩衝區呢?幸運的是,lucene 的類 in...