直播 Lucene學習高階 總結1 來自網路

2021-08-26 11:41:38 字數 3156 閱讀 5800

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