當索引的文件不多時,用 Lucene 默認的設置就能得到很好的性能。但是,如果索引大量文件,就得通過一些手段去提高 Lucene 索引性能。
1、? 索引性能差的原因
1)???????
Lucene
索引過程
???
在索引文件的過程中,
Lucene
不是直接將文件索引到磁盤上,而是首先緩存,然后在寫到磁盤。如上圖所示。
2)??????? 索引過程的瓶頸
2??????? 往磁盤上寫索引文件的過程
2??????? 將磁盤上的幾個小 Segment 合并成一個大的 Segment 的過程
2、? 提高索引性能的方法
1)??????? 方式 1 :調整 IndexWriter 參數
為控制索引占用的內存以及 Segment 段合并的頻率, Lucene 提供了以下三個參數,通過調整這三個參數的值,可以改善索引的性能。
2???????
mergeFactor
(合并因子):決定把磁盤上的索引塊合并成一個大的索引塊的頻率,默認值為
10
。
比如,
mergeFactor
=
10
,那么當
Segment
的數量達到
10
的話,這
10
個
Segment
會被合并成一個新的
Segment
。如果合并后的這個大的
Segment
的數量達到
10
的話還會被合并成一個更大的
Segment
。直到
Segment
中索引的文件數量達到
maxMergeDocs
時不在合并。
如果需要索引的文檔數非常多的話這個默認值將是非常不合適的。對批處理的索引來講,為這個參數賦一個比較大的值會得到比較好的索引效果。
2???????
minMergeDocs
(
最小合并文檔數
)
:決定了內存中的文檔數至少達到多少才能將它們寫回磁盤(其實就是
buffer
的大?。DJ值是
10
。
如果你有足夠的內存,那么將這個值盡量設的比較大一些將會顯著的提高索引性能。
2???????
maxMergeDocs
(最大合并文檔數):決定了一個索引塊中的最大的文檔數。默認值是
Integer.MAX_VALUE
。
這個參數設置為比較大的值可以提高索引效率和檢索速度,由于該參數的默認值是整型的最大值,所以我們一般不需要改動這個參數。
2)??????? 方式 2 :使用 RAMDirectory
2??????? RAMDirectory 與 FSDirectory 的不同: RAMDirectory 的所有操作都在內存中,而 FSDirectory 的操作直接對應磁盤。因此 RAMDirectory 比 FSDirectory 要快。
2??????? 先將索引寫入 RAMDirectory 到一定程度在從 RAMDirectory 寫入 FSDirectory 可以提高索引性能。





















