越来越多的人利用开源组件 Lucene来开发自己的搜索引擎。在数据量不大的情况下,我们不会太关注创建索引的效率;但是,但数据达到一定的数量是,我们就不得不考虑如何提高创建索引的性能,以缩短索引创建的时间。
我们是用Lucene中提供的类IndexWriter来创建索引的,所以我们不妨先看一看IndexWriter类中关系到索引创建效率的几个方法。
一、SetMergeFactor(合并因子)
SetMergeFactor是控制segment合并 频率的,其决定了一个索引块中包括多少个文档,当硬盘上的索引块达到多少时,将它们合并成一个较大的索引块。当MergeFactor值较大时,生成索引 的速度较快。MergeFactor的默认值是10,建议在建立索引前将其设置的大一些。
二、SetMaxBufferedDocs(最大缓存文档数)
SetMaxBufferedDocs是控制写入一个新的segment前内存中保存的document的数目,设置较大的数目可以加快建索引速度,默认为10。
三、SetMaxMergeDocs(最大合并文档数)
SetMaxMergeDocs是控制一个segment中可以保存的最大document数目,值较小有利于追加索引的速度,默认Integer.MAX_VALUE,无需修改。
在创建大量数据的索引时,我们会发现索引过程的瓶颈在于大量的磁盘操作,如果内存足够大的话,我们应当尽量使用内存,而非硬盘。可以通过SetMaxBufferedDocs来调整,增大Lucene使用内存的次数。
如果内存足够大的话,我们也可以在索引过程中完全避免使用硬盘。Lucene支持使用文件系统和内存两种方式创建索引,我们可以先把索引写入到RAMDirectory,达到一定数量时再批量写进FSDirectory,减少磁盘操作次数。相关的代码如下:
RAMDirectory rmd = new RAMDirectory();
IndexWriter writer = new IndexWriter(rmd, new StandardAnalyzer(), true);
while (not eof) //遍历
{
Document doc = new Document();
doc.Add(…); //Add Fields
writer.AddDocument(doc);
}
writer.SetUseCompoundFile(true);
writer.Optimize();
writer.Close();
另外,SetUseCompoundFile这个方法可以使Lucene在创建索引库时,会合并多个 Segments 文件到一个 .cfs 中。此方式有助于减少索引文件数量,对于将来搜索的效率有较大影响。
若需要从索引中删除某一个或者某一类文档,IndexReader提供了两种方法:
reader.DeleteDocument(int docNum)
reader.DeleteDocuments(Term term)
前者是根据文档的编号来删除该文档,docNum是该文档进入索引时Lucene的编号,是按照顺序编的;后者是删除满足某一个条件的多个文档。
在执行了DeleteDocument或者DeleteDocuments方法后,系统会生成一个*.del的文件,该文件中记录了删除的文档,但 并未从物理上删除这些文档。此时,这些文档是受保护的,当使用Document doc = reader.Document(i)来访问这些受保护的文档时,Lucene会报“Attempt to access a deleted document”异常。如果一次需要删除多个文档时,可以用两种方法来解决:
1. 删除一个文档后,用IndexWriter的Optimize方法来优化索引,这样我们就可以继续删除另一个文档。
2. 先扫描整个索引文件,记录下需要删除的文档在索引中的编号。然后,一次性调用DeleteDocument删除这些文档,再调用IndexWriter的Optimize方法来优化索引。
转自:http://blog.sina.com.cn/s/blog_56e2f4250100nxzy.html
分享到:
相关推荐
- **首次创建索引**:首先,我们需要遍历整个数据源,创建每个文档的实例,然后将这些文档添加到Lucene的索引writer中。完成这一步后,就会生成一个完整的初始索引。 - **监控数据变更**:为了实现增量索引,我们...
在本主题中,我们将深入探讨如何使用Lucene进行创建、删除、修改和组合条件查询,以及如何实现类似MySQL中的LIKE、IN、OR和时间范围条件查询。 首先,**创建索引**是使用Lucene的第一步。创建索引涉及到读取数据源...
2. **.del文件**:记录了被删除的文档ID,当文档被删除时,并不立即从索引中移除,而是标记为删除,以便在后续合并段时处理。 3. **.tii和.tis文件**:存储了Term信息的索引,用于快速找到对应Term的postings列表。...
3. **创建索引**:使用Lucene的`IndexWriter`类,将预处理后的数据转换为Lucene的文档(Document)对象,并添加到索引中。每个文档可以包含多个字段(Field),每个字段对应数据库中的一个列,如标题、内容等。 4. ...
创建索引是将数据结构化以便快速搜索的过程。在 Lucene.net 中,首先需要创建一个 IndexWriter 对象,然后使用 AddDocument 方法添加文档。每个文档由字段(Field)组成,字段可以设置不同的属性,如是否存储原始...
总之,Lucene作为强大的全文检索库,通过与Paoding Analyzer和JavaCC等工具的结合,能有效处理中文分词和提高索引效率,为站内检索提供坚实的基础。开发者可以根据自身需求,进一步定制和优化,以满足各种复杂的搜索...
通过这个类,你可以将文档添加到索引中,或者对已有索引进行修改和删除。 - `Analyzer`:用于分词和标准化文本,如去除停用词、词干提取等。Lucene提供了一些内置的Analyzer,如StandardAnalyzer,也可以自定义...
在给定的`MailDAO.java`文件中,可能包含了一个用于操作邮件数据的DAO(Data Access Object)类,通过这个类,我们可以将邮件内容存储到Lucene索引中,或者从索引中检索相关的邮件信息。使用DAO模式,有助于保持业务...
2. **创建索引**:使用 Lucene.Net 提供的 API,我们可以将数据表中的字段映射到 Lucene 文档中。每个文档代表数据库中的一条记录,每个字段对应记录的一个属性。创建索引的过程是将这些字段转换为倒排索引,以便于...
在Lucene中,索引是其关键组成部分,它通过分析文本并将其转换为可搜索的结构来实现高效的查询。索引过程包括分词(Tokenization)、词干提取(Stemming)、停用词过滤(Stopword Removal)等一系列步骤,这些步骤...
NLuke是一款基于Lucene.Net的开源工具,专用于管理和查看Lucene.Net创建的全文搜索引擎索引。Lucene.Net是Apache Lucene的.NET版本,是一个高性能、全功能的文本搜索库,广泛应用于各种需要全文检索功能的系统中。...
在倒排索引中,对于每个项,都有一个列表记录了包含该项的所有文档。这种方式与自然的文档-项关系相反,从而提高了搜索效率。 在Lucene中,域有两种类型:被索引的域和被存储的域。被索引的域会进行分词处理,形成...
创建索引是Lucene的第一步,这涉及到对文档数据的读取、分析和存储。你需要定义一个`Document`对象,然后添加各种字段,如`Field("title", "文档标题")`,`Field("content", "文档内容")`等。接着,使用`IndexWriter...
我们可以调用`addDocument( Document doc )`方法将文档添加到索引中,其中Document对象包含了所有要索引的信息。 4. **关闭IndexWriter**: 在完成索引操作后,记得调用`close()`方法关闭IndexWriter,确保所有更改...
Lucene支持多种操作,如创建、更新和删除索引,以及复杂的查询语法,这个工具可能是为了辅助这些操作,提供一种便捷的方式来诊断可能出现的问题。 至于“压缩包子文件的文件名称列表”中提到的“lucene tool”,这...
在实际应用中,我们可以通过Java API与Lucene进行交互,创建索引、搜索、更新和删除文档。`索引.ppt`这样的文件可能是对Lucene索引原理的详细讲解,可能包含了PPT演示,涵盖了上述概念并可能提供了实例代码和案例...
1. **创建索引**:首先,需要将要搜索的数据(如文件内容)读取并分词,然后使用Lucene API创建索引。 2. **添加文档**:将分词后的数据作为文档添加到索引中,每个文档都有唯一的ID和多个字段。 3. **更新索引**:...
- **合并段(Merge Segments)**: `IndexWriter`会在索引中创建多个段,定期合并小段可以提高搜索效率。 - **缓存(Cache)**: 使用`BitSet`缓存和`FilterCache`可以加快查询速度,特别是对于经常查询的过滤条件。...
1. **创建索引(Indexing)** - 初始化 Analyzer:选择适合的语言分析器,如中文使用 `SmartChineseAnalyzer`,处理不同语言的分词问题。 - 创建 Directory 对象:作为索引的存储位置,可以选择 RAMDirectory...