Posted on 2007-02-01 16:43
王睿 阅读(4571)
评论(3) 编辑 收藏 所属分类:
搜索技术
当索引的文件不多时,用
Lucene
默认的设置就能得到很好的性能。但是,如果索引大量文件,就得通过一些手段去提高
Lucene
索引性能。
1、
索引性能差的原因
1)
Lucene
索引过程
在索引文件的过程中,
Lucene
不是直接将文件索引到磁盘上,而是首先缓存,然后在写到磁盘。如上图所示。
2)
索引过程的瓶颈
²
往磁盘上写索引文件的过程
²
将磁盘上的几个小
Segment
合并成一个大的
Segment
的过程
2、
提高索引性能的方法
1)
方式
1
:调整
IndexWriter
参数
为控制索引占用的内存以及
Segment
段合并的频率,
Lucene
提供了以下三个参数,通过调整这三个参数的值,可以改善索引的性能。
²
mergeFactor
(合并因子):决定把磁盘上的索引块合并成一个大的索引块的频率,默认值为
10
。
比如,
mergeFactor
=
10
,那么当
Segment
的数量达到
10
的话,这
10
个
Segment
会被合并成一个新的
Segment
。如果合并后的这个大的
Segment
的数量达到
10
的话还会被合并成一个更大的
Segment
。直到
Segment
中索引的文件数量达到
maxMergeDocs
时不在合并。
如果需要索引的文档数非常多的话这个默认值将是非常不合适的。对批处理的索引来讲,为这个参数赋一个比较大的值会得到比较好的索引效果。
²
minMergeDocs
(
最小合并文档数
)
:决定了内存中的文档数至少达到多少才能将它们写回磁盘(其实就是
buffer
的大小)。默认值是
10
。
如果你有足够的内存,那么将这个值尽量设的比较大一些将会显著的提高索引性能。
²
maxMergeDocs
(最大合并文档数):决定了一个索引块中的最大的文档数。默认值是
Integer.MAX_VALUE
。
这个参数设置为比较大的值可以提高索引效率和检索速度,由于该参数的默认值是整型的最大值,所以我们一般不需要改动这个参数。
2)
方式
2
:使用
RAMDirectory
²
RAMDirectory
与
FSDirectory
的不同:
RAMDirectory
的所有操作都在内存中,而
FSDirectory
的操作直接对应磁盘。因此
RAMDirectory
比
FSDirectory
要快。
²
先将索引写入
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
);
}
}