`

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:测试结果
通过表 1,你可以清楚地看到三个参数对索引时间的影响。在实践中,你会经常的改变合并因子和最小合并文档数的值来提高索引性能。只要你有足够大的内存,你可以为合并因子和最小合并文档数这两个参数赋尽量大的值以提高索引效率,另外我们一般无需更改最大合并文档数这个参数的值,因为系统已经默认将它设置成了最大。

 

 

 

文章出自:http://hi.baidu.com/litertiger/blog/item/b7b4292eb3fa67514ec2264d.html

 

 

分享到:
评论

相关推荐

    lucene对doc.xlsx操作包

    Lucene的核心是建立索引,通过索引快速定位到文档中的相关部分,实现高效搜索。它不直接处理非文本格式的数据,如doc或xlsx,但可以通过第三方库将其转换为文本后再进行处理。 二、处理doc.xlsx文档的挑战 doc....

    lucene4.4使用手册.docx

    在Lucene中,全文检索不处理语义,但能处理英文的大小写不敏感搜索,并且返回的结果列表会根据相关度进行排序。这意味着搜索“ant”不会匹配到“planting”,并且搜索结果会优先显示与查询条件最相符的条目。 2. **...

    lucene入门学习

    1. 全文检索是一种计算机技术,通过对文章中的每个词建立索引,记录词的出现次数和位置,以便快速定位含有指定词汇的文本。例如,Windows 系统的搜索功能、Eclipse 的帮助系统、BBS 和博客的文章搜索等,它们都是...

    lucene使用流程

    2. **大小写敏感性**: Lucene 在进行检索时默认不区分大小写。这对于英文文本来说是一个非常实用的功能,但在处理包含大小写字母混合的文本时,可能需要额外考虑大小写的处理方式。 综上所述,本文详细介绍了一套...

    实验搜索引擎-基于Java+JSP开发的简易搜索引擎项目源码+项目说明文档.zip

    由传入的doc文本元素组成的数组建立索引。 b. 在a项的实现中,调用了写索引方法类indexer。该类在java文件Indexer.java中。 ### 3. 实现查询功能及结果高亮 a. 实现QuerySearch类的search方法。根据从web前端传入...

    如何快速实现高并发短文检索

    - **具体方法**:在数据库中建立全文索引,通过全文检索的方式提高查询效率。 - **优点**:相比简单搜索法,全文检索能提供更好的搜索体验,尤其是支持基本的分词功能。 - **缺点**:尽管性能优于简单的`LIKE`...

    基于java的文本搜索引擎的设计与实现,java全文搜索引擎,Java

    在Java项目中,Lucene扮演着核心角色,负责将爬取的文本数据进行分词、建立倒排索引,使得后续的查询操作能快速定位到相关文档。开发者需要了解Lucene的API,包括Analyzer(分词器)、Document(文档对象)、Field...

    jexcelapi_2_6_4.tar.gz

    在导入Excel数据时,我们通常会先用JExcelAPI解析数据,然后将数据转换为Lucene可理解的文档对象,再将这些文档添加到索引中。以下是一个简单的例子: ```java import org.apache.lucene.document.Document; import...

    超级课程表的技术选型

    - **倒排索引**:通过建立倒排索引来加速文档检索速度,减少磁盘I/O操作。 - **缓存机制**:结合Memcached与Sphinx,利用内存缓存提升搜索效率。 #### 缓存与存储策略 - **Redis + MySQL**:双层存储结构,Redis...

    04-小米在 Elasticsearch 服务成本治理的实践-周明裕 武汉 2024.03.30

    - **冷数据**:读写频率低,查询延迟在秒到分钟级之间,存储周期很长,也使用HDD存储,但不会加载索引数据以释放内存资源。 - **冻结数据**:读写频率极低,查询延迟可能长达几分钟,存储周期为长期甚至永久,采用...

    CSDN TUP第二期:王鹏云演讲PPT

    - **内存索引**:采用边写边读的方式加快索引速度,并通过定期将数据写入磁盘(Snapshot)来控制内存占用。 - **库合并(Merge)**:为了提高性能和减少索引库的数量,可以定期合并索引库。 #### 实时搜索难点 - **...

    Elasticsearch的大杂烩分享_赖鸿智.pdf

    - **索引自动分片**:自动将索引划分为多个分片,分布存储在集群中,提高了系统的容错性和可用性。 - **索引副本机制**:为每个分片创建一个或多个副本,增强了数据的安全性和系统稳定性。 - **RESTful风格接口**:...

    java项目集合csdn.7z

    Java开发者应掌握如何使用Java API与Elasticsearch通信,建立索引,执行查询和聚合,以实现高效的数据检索和分析。 综上所述,这个压缩包包含的项目涵盖了Java开发的全栈技术,从版本控制到前端开发,再到数据库...

    python3实现elasticsearch批量更新数据

    Elasticsearch是一个高度可扩展的开源搜索引擎,它建立在Apache Lucene之上。它以全文搜索为中心,支持多种类型的数据,包括结构化数据、非结构化数据等。它的分布式特性使其能够在多台服务器上存储和处理大量的数据...

Global site tag (gtag.js) - Google Analytics