Posted on 2007-02-01 16:43
王睿 閱讀(4576)
評論(3) 編輯 收藏 所屬分類:
搜索技術
當索引的文件不多時,用
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
的大小)。默認值是
10
。
如果你有足夠的內存,那么將這個值盡量設的比較大一些將會顯著的提高索引性能。
2???????
maxMergeDocs
(最大合并文檔數):決定了一個索引塊中的最大的文檔數。默認值是
Integer.MAX_VALUE
。
這個參數設置為比較大的值可以提高索引效率和檢索速度,由于該參數的默認值是整型的最大值,所以我們一般不需要改動這個參數。
2)???????
方式
2
:使用
RAMDirectory
2???????
RAMDirectory
與
FSDirectory
的不同:
RAMDirectory
的所有操作都在內存中,而
FSDirectory
的操作直接對應磁盤。因此
RAMDirectory
比
FSDirectory
要快。
2???????
先將索引寫入
RAMDirectory
到一定程度在從
RAMDirectory
寫入
FSDirectory
可以提高索引性能。
?
FSDirectory?fsDir?
=
?FSDirectory.getDirectory(
"
/tmp/index
"
,
true
);
RAMDirectory?ramDir?
=
?
new
?RAMDirectory();
IndexWriter?fsWriter?
=
?IndexWriter(fsDir,
new
?SimpleAnalyzer(),?
true
);
IndexWriter?ramWriter?
=
?
new
?IndexWriter(ramDir,
new
?SimpleAnalyzer(),?
true
);

while
?(there?are?documents?to?index)?
{

?create?Document?
ramWriter.addDocument(doc);

if
?(condition?
for
?flushing?memory?to?disk?has?been?met)?
{

fsWriter.addIndexes(Directory[]?
{ramDir}
);
ramWriter.close();
ramWriter?
=
?
new
?IndexWriter(ramDir,?
new
?SimpleAnalyzer(),
true
);
}
}