提高索引性能 利用 Lucene,在创建索引的工程中你可以充分利用机器的硬件资源来提高索引的效率。当你需要索引大量的文件时,你会注意到索引过程的瓶颈是在往磁盘上写索引文件的过程中
。
为了解决这个问题, Lucene
在内存中持有一块缓冲区。但我们如何控制 Lucene 的缓冲区呢?幸运的是,Lucene 的类 IndexWriter
提供了三个参数用来调整缓冲区的大小以及往磁盘上写索引文件的频率。 1.合并因子(mergeFactor) 这个参数决定了在 Lucene
的一个索引块中可以存放多少文档以及把磁盘上的索引块合并成一个大的索引块的频率。比如,如果合并因子的值是 10,那么当内存中的文档数达到 10
的时候所有的文档都必须写到磁盘上的一个新的索引块中。并且,如果磁盘上的索引块的隔数达到 10 的话,这 10
个索引块会被合并成一个新的索引块。这个参数的默认值是
10,如果需要索引的文档数非常多的话这个值将是非常不合适的。对批处理的索引来讲,为这个参数赋一个比较大的值会得到比较好的索引效果。
2.最小合并文档数 这个参数也会影响索引的性能。它决定了内存中的文档数至少达到多少才能将它们写回磁盘。这个参数的默认值是10,如果你有足够的内存,那么将这个值尽量设的比较大一些将会显著的提高索引性能。
3.最大合并文档数 这个参数决定了一个索引块中的最大的文档数。它的默认值是 Integer.MAX_VALUE,将这个参数设置为比较大的值可以提高索引效率和检索速度,由于该参数的默认值是整型的最大值,所以我们一般不需要改动这个参数。
清单 5 列出了这个三个参数用法,清单 5 和清单 1 非常相似,除了清单 5 中会设置刚才提到的三个参数。
清单5:提高索引性能
/** * This class demonstrates how to improve the indexing performance * by adjusting the parameters provided by IndexWriter. */
class AdvancedTextFileIndexer {
public static void main(String[] args) throws Exception {
//fileDir is the directory that contains the text files to be indexed
File fileDir = new File("C:\\files_to_index"); //indexDir is the directory that hosts Lucenes index files
File indexDir = new File("C:\\luceneIndex");
Analyzer luceneAnalyzer = new StandardAnalyzer();
File[] textFiles = fileDir.listFiles();
long startTime = new Date().getTime();
int mergeFactor = 10;
int minMergeDocs = 10;
int maxMergeDocs = Integer.MAX_VALUE;
IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer, true);
indexWriter.mergeFactor = mergeFactor;
indexWriter.minMergeDocs = minMergeDocs;
indexWriter.maxMergeDocs = maxMergeDocs; //Add documents to the index
for (int i = 0; i < textFiles.length; i++) {
if (textFiles[i].isFile() >> textFiles[i].getName().endsWith(".txt")) {
Reader textReader = new FileReader(textFiles[i]);
Document document = new Document();
document.add(Field.Text("content", textReader));
document.add(Field.Keyword("path", textFiles[i].getPath()));
indexWriter.addDocument(document);
}
}
indexWriter.optimize();
indexWriter.close();
long endTime = new Date().getTime();
System.out.println("MergeFactor: " + indexWriter.mergeFactor);
System.out.println("MinMergeDocs: " + indexWriter.minMergeDocs);
System.out.println("MaxMergeDocs: " + indexWriter.maxMergeDocs);
System.out.println("Document number: " + textFiles.length);
System.out.println("Time consumed: " + (endTime - startTime) +
" milliseconds");
}
}
通过这个例子,我们注意到在调整缓冲区的大小以及写磁盘的频率上面 Lucene 给我们提供了非常大的灵活性。现在我们来看一下代码中的关键语句。如下的代码首先创建了类 IndexWriter 的一个实例,然后对它的三个参数进行赋值。
int mergeFactor = 10;
int minMergeDocs = 10;
int maxMergeDocs = Integer.MAX_VALUE;
IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
indexWriter.mergeFactor = mergeFactor;
indexWriter.minMergeDocs = minMergeDocs;
indexWriter.maxMergeDocs = maxMergeDocs;
下面我们来看一下这三个参数取不同的值对索引时间的影响,注意参数值的不同和索引之间的关系。我们为这个实验准备了 10000 个测试文档。表 1 显示了测试结果。
表1:测试结果
通过表
1,你可以清楚地看到三个参数对索引时间的影响。在实践中,你会经常的改变合并因子和最小合并文档数的值来提高索引性能。只要你有足够大的内存,你可以为
合并因子和最小合并文档数这两个参数赋尽量大的值以提高索引效率,另外我们一般无需更改最大合并文档数这个参数的值,因为系统已经默认将它设置成了最大。
分享到:
相关推荐
lucene 对 xml建立索引 建立索引就是怎么简单 呵呵
基于lucene 2.4简单的一个索引和搜索实例
本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 【该源码由51aspx提供】 源码 " onerror="this.src='/images/ifnoimg.gif'" src="/uploads/allimg/090904/1039152O5-0.jpg...
Lucene建立索引jar包和Paoding庖丁分词jar包,Lucene结合Paoding庖丁分词创建索引索引jar包汇总
使用lucene,建索引。倒排索引现在在搜索引擎涌出很大,本工程为入门提供参考
lucene建立数据库索引的问题,在这里,把其中的一些问题补充说明,希望对大家有新的帮助,希望大家相互提出问题,相互学习,共同进步!!
Lucene(这里用到的是Lucene.net版本也成为DotLucene)是一个...本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 支持简单的中文分词,同时提供了Lucene.Net-2.0-004版本的源码给大家
Lucene索引器实例Lucene索引器实例Lucene索引器实例Lucene索引器实例
最简单的Lucene建立、搜索索引的方法,工程基于Myeclipse10
在Eclipse环境中运用java,Lucene建索引及查询关键字
lucene
用Lucene检索文本,建立索引,用struts构建web程序框架
lucene 做索引查询流程,来自《lucene in action》
用lucene对数据库建立索引及搜索.doc
Lucene结合Sql建立索引Demo源码 Lucene(这里用到的是Lucene.net版本也成为DotLucene)是一个信息检索的函数库(Library),利用它你可以...本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索
利用Lucene.net做的建立索引,检索分页
Lucene实现索引和查询的实例讲解Lucene实现索引和查询的实例讲解
Lucene创建索引步骤: 1、创建Directory(索引位置) 2、创建IndexWrite(写入索引) 3、创建Document对象 4、为Document添加Field(相当于添加属性:类似于表与字段的关系) 5、通过IndexWriter添加文档到索引中
Lucene创建索引,查询索引的简单使用。