lucene索引合併

2021-06-16 17:11:52 字數 2801 閱讀 3449

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);

//設定復合索引

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...