1、正確關閉indexwriter例項?關閉過程中發生問題如何處理?
try finally
}
2、indexwriter有關的3個引數
1.maxbuffereddocs
maxbuffereddocs這個引數預設是disabled的,因為lucene中還用另外乙個引數(rambuffersizemb)控制這個bufffer的索引文件個數。
其實maxbuffereddocs和rambuffersizemb這兩個引數是可以一起使用的,一起使用時只要有乙個觸發條件滿足就寫入硬碟,生成乙個新的索引segment檔案。
2.rambuffersize
控制用於buffer索引文件的記憶體上限,如果buffer的索引文件個數到達該上限就寫入硬碟。當然,一般來說也只越大索引速度越快。當我們對文件大小不太確定時,這個引數就相當有用,不至於outofmemory error.
3.mege***ctor
setmergefactor是控制segment合併頻率的,其決定了乙個索引塊中包括多少個文件,當硬碟上的索引塊達到多少時,將它們合併成乙個較大的索引塊。當mergefactor值較大時,生成索引的速度較快。mergefactor的預設值是10,建議在建立索引前將其設定的大一些。
3、
注意:
1.不要隨意設定maxbuffereddocs。
maxbuffereddocs和rambuffersize共同控制記憶體中文件的容量。
如果對maxbuffereddocs進行設定要比較小心了,因為它本身是disabled,如果設定不合理將導致大規模的重建索引非常慢。
例如:
dir = ******fsdirectory.open(new file("d:/20101015index"));
writer = new indexwriter(dir, new standardanalyzer(version.lucene_30), true, maxfieldlength.unlimited);
writer.setusecompoundfile(true);
writer.setmaxbuffereddocs(100);
writer.setmergefactor(10);
//add document
//注意點2:filed例項在多次新增的時候可以重用,節約構造field例項的時間。
field f1 = new field("f1", "", store.yes, index.analyzed) ;
field f2 = new field("f2", "", store.yes, index.analyzed) ;
for (int i = 0; i < 1000000; i++)
writer.optimize();
上述**中對maxbuffereddocs進行設定:
writer.setmaxbuffereddocs(100);
那麼現在對記憶體中文件的容量有兩個控制量:
1.文件數量達到100就寫回磁碟;
2.文件總容量達到16m就寫回磁碟;
因為上面乙個文件的大小很小,100個文件的容量肯定不會達到16m,所以第乙個控制量起到主要的作用。
在沒有設定maxbuffereddocs之前就只有rambuffersize(16m)控制記憶體中文件的數量,
較之這兩種情況,明顯是沒有設定maxbuffereddocs更好的利用了記憶體,因此建立索引更快速。
實驗證明:
不設定maxbuffereddocs,耗時20s左右;
設定maxbuffereddocs為100,耗時280000s左右。 = =! 差別太大了,所以一定要小心!!!
2.不要太迷信mege***ctor比較大會加快重建索引的速度。
通過實驗,在上述**中獎mege***ctor設定成10比100要快2s。
「一家之言」——
對於一般的系統(資料量在千萬級,重建索引暫不考慮併發壓力),在重建索引時不要太糾結這些引數的設定,
只要不犯太嚴重的問題(例如像上面一樣將maxbuffereddocs設定得過小,還不如不設定),效率出入都不會太大。
3.是否有必要將資料先放到ram中,再和磁碟的索引進行合併?
我認為在重建索引的環節沒有必要。因為在使用fsdirectory建立索引的時候不就可以控制記憶體的使用麼!?(maxbuffereddocs和rambuffersize)
而ramdiretory應該重點使用在實時索引上面。
(= =! 我指的重建索引是什麼意思?"對大量的資料一次性建立成磁碟索引!")
這裡也做了乙個測試,是先將文件寫入記憶體,然後合併到磁碟。
主要**如下所示:
dir = new ramdirectory();
dirfs = ******fsdirectory.open(new file("d:/20101015index"));
writer = new indexwriter(dir, new standardanalyzer(version.lucene_30), maxfieldlength.unlimited);
writerfs = new indexwriter(dirfs, new standardanalyzer(version.lucene_30), true, maxfieldlength.unlimited);
//field f1 = new field("f1", "", store.yes, index.analyzed);
field f2 = new field("f2", "", store.yes, index.analyzed);
for (int i = 0; i < 1000000; i++)
// writer.commit();
writerfs.addindexes(writer.getreader());
剛開始學lucene的時候,總熱衷提高效率,什麼引數的設定啊、ram的使用啊等等,殊不知重建索引是乙個初始化階段(服務於後期的檢索),
就算有優化的必要,但絕不是當前必要解決的「主要矛盾」。
應該將重點放到:
1.實時索引;
2.分布式構建檢索框架(如果系統規模有必要的);
3.怎麼在程式質量上利用好記憶體,不至於執行時到處時 記憶體溢位 。
Lucene和Solr學習總結 1
說的專業點就是全文檢索 實現全文檢索的流程的大致操作如下 這張圖表現的很清晰,網上扒下來的 索引庫中應該包含兩部分,一部分是索引,一部分是文件,索引包含對應文件的id,通過該id可以查詢到文件 來看看我的第乙個lucene入門程式 先整理步驟 建立索引 查詢索引 1,建立indexwriter物件,...
lucene學習總結
一,建立索引 1,建立indexwriter directory fsdirectory。open file analyzer new standardanalyzer version indexwriter new indexwriter directory,analyzer,boolean,bo...
lucene學習筆記 1
indexing主要使用的類 indexwriter 較核心的類,index檔案由它建立 directory 乙個抽象的標示index檔案位址的類,有兩個實現 fsdirectory和ramdirectory,前者是基於檔案系統,後者使用記憶體 analyzer 檔案的分析器 聽起來彆扭,還是叫an...