`

【Lucene3.0 初窥】索引创建(1):IndexWriter索引器

阅读更多

《Lucene索引创建》系列文章将从源代码出发,详细揭示Lucene两大功能之一的索引创建过程。并阐述其中所用到的信息检索的相关技术。由于Lucene是基于多线程的,为了能够简洁明了的说明Lucene索引创建的过程,我们尽量会绕开Lucene多线程机制的处理细节。

 

1.1 准备工作

 我们对content目录中1.txt、2.txt、3.txt这三个英文文档的文件名,路径,内容建立索引。代码如下:

//索引文件存放的位置
File indexDir=new File(".\index");
//需要建立索引的文档集合的位置
 File docDir = new File(".\content"); 
//创建索引器(核心)
IndexWriter standardWriter = new IndexWriter(FSDirectory.open(indexDir),new StandardAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED);         
//不建立复合式索引文件,默认的情况下是复合式的索引文件
standardWriter.setUseCompoundFile(false);
//为原文档集合中的每个文档的相关信息建立索引
for (File fileSrc : docDir.listFiles()) {   
        //Lucene的文档结构
        Document doc = new Document();  	           	   
        //文件名称,可查询,不分词
        String fileName=file.getName().substring(0,file.getName().indexOf("."));
        doc.add(new Field("name",fileName, Field.Store.YES, Field.Index.NOT_ANALYZED));  
         //文件路径,可查询,不分词
        String filePath=file.getPath();
        doc.add(new Field("path", filePath, Field.Store.YES, Field.Index.NOT_ANALYZED));
        //文件内容,需要检索
        doc.add(new Field("content", new FileReader(file)));  	       	
        //使用索引器对Document文档建索引
       standardWriter.addDocument(doc);  
}  
//关闭索引器,并写入磁盘索引文件
standardWriter.optimize();  
standardWriter.close();  

其中,IndexWriter索引器用来创建索引。Document和Field类(详见《Document/Field 数据源组织结构》 )表示这三个文档的结构如下:

            Document      Field1(name)        Field2(path)                           Field3(content)

                doc1                 1               e:\\content\\1.txt        The lucene is a good IR. I hope I can lean well.

                doc2                 2               e:\\content\\2.txt        You know it's difficult to learn Lucene well.

                doc3                 3               e:\\content\\3.txt        Maybe is very hard. I must do it well.

 

 

1.2 IndexWriter 索引器

 

一个IndexWriter对象创建并且维护(maintains) 一条索引并生成segment,使用DocumentsWriter类来建立多个文档的索引数据,SegmentMerger类负责合并多个 segment。

 

1.2.1 构造器

org.apache.lucene.index包是lucene用来创建索引的。其中的IndexWriter类是Lucene的索引器 下面是IndexWriter的构造器。

/**
 * d 索引文件存储的目录类
 * a 语言分析器,主要用于分词
 * create 真—创建新的索引文件或者重新覆盖已存在的索引文件; 假—在已存在的索引文件后追加索引记录
 * mfl 允许Field中的词的最大数量
 */
public IndexWriter(Directory d, Analyzer a, boolean create, MaxFieldLength mfl){
    init(d, a, null, mfl.getLimit(), null, null);
}

其中Directory将在后面再谈;Analyzer详细可见《Lucene分析器—Analyzer》 ;create确定是否一条新的索引将被创建,或者是否一条已经存在的索引将被打开;MaxFieldLength默认的最大长度为10000,在《Document-Field数据源 组织结构 中我们知道Field可以表示数据源的任何属性信息,如果Field中的value数据量非常大,那么很有可能在建索引的时候造成内存溢出。所以有必要限制每个Field中value的最大词数。

 

1.2.3 建立索引的方法:addDocument(Document)

该方法是用来创建索引的。我们进一步看看这个方法的源码:

public void addDocument(Document doc)  {
       addDocument(doc, analyzer);
}

public void addDocument(Document doc, Analyzer analyzer) {
    ensureOpen();
    boolean doFlush = false;
    boolean success = false;
    try {
      try {
            //使用DocumentWriter建立索引
            doFlush = docWriter.addDocument(doc, analyzer);
            success = true;
      } finally {
           if (!success) {

               if (infoStream != null)
               message("hit exception adding document");

               synchronized (this) {

                   if (docWriter != null) {
                        final Collection<String> files = docWriter.abortedFiles();
                        if (files != null)
                        deleter.deleteNewFiles(files);
                   }
               }
           }
      }
      if (doFlush)
             flush(true, false, false);
      }catch (OutOfMemoryError oom) {
             handleOOM(oom, "addDocument");
    }
}

其中docWriter.addDocument(doc,analyzer);调用了DocumentWriter类来创建一个Document对象的索引。而DocumentWriter类将在《索引创建(2):DocumentWriter处理流程 》详细介绍。

 

7
0
分享到:
评论

相关推荐

    Lucene3.0创建索引

    ### Lucene3.0创建索引 在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、...

    lucene3.0庖丁+索引搜索程序

    《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene3.0版本,结合“庖丁解...

    Lucene 3.0 原理与代码分析完整版

    二、Lucene索引流程 1. 文档分词:Lucene使用Analyzer对输入的文档进行分词,生成Token流。 2. 字符串到Term:将分词结果转化为Term对象,每个Term代表一个唯一的词汇项。 3. 建立Term Frequency(TF):记录每个...

    lucene3.0 实例

    2. 创建索引writer:`IndexWriter` 类负责创建和更新索引,使用 `IndexWriterConfig` 进行配置。 3. 构建文档:为每个要索引的文件创建 `Document` 对象,然后添加字段,如 `Field("content", fileContent, ...

    lucene3.0-api.CHM

    1. 创建索引:首先,创建一个Directory实例,然后使用IndexWriter添加文档并建立索引。 2. 更新索引:当文档有变化时,可以使用IndexWriter的updateDocument方法进行更新。 3. 搜索索引:使用IndexSearcher实例和...

    lucene3.0使用介绍及实例

    在这个例子中,我们创建了一个索引,包含一个文档,然后搜索包含"Lucene 3.0"的文档。这个简单的示例展示了Lucene的基本用法,实际应用中可以根据需要扩展,例如添加更多的文档字段、实现更复杂的查询逻辑,或者使用...

    lucene3.0基础实例

    2. 创建索引写入器(IndexWriter):`IndexWriter`负责建立索引,通过它我们可以添加、删除和更新文档。 3. 创建文档(Document):`Document`对象用于存储要索引的信息,添加字段并赋值。 4. 添加文档到索引:使用`...

    lucene 2.0 api以及lucene 3.0 api

    1. **索引构建**: Lucene 2.0 提供了 `IndexWriter` 类,用于创建和更新索引。开发者可以使用 `Document` 类来封装待索引的数据,然后通过 `addDocument()` 方法添加到索引中。 2. **查询构造**: 通过 `QueryParser...

    lucene3.0全文检索入门实例

    在 Lucene 3.0 中,使用 `IndexWriter` 类来写入文档到索引中。相比于 2.0 版本,3.0 引入了更高级的分析器(Analyzer)和文档(Document)处理,使得对文本的预处理更为精细,支持更多的语言和特性。 ```java ...

    Lucene3.0增删改查和关键字高亮实例

    在这个“Lucene3.0增删改查和关键字高亮实例”项目中,我们将深入理解如何利用Lucene 3.0版本进行索引构建、文档的增删改查操作,并学习关键字高亮显示的实现方法。 首先,我们要了解**创建索引**的基本流程。在...

    lucene 3.0 入门实例

    1. **创建索引(Creating an Index)**: 首先,我们需要创建一个 IndexWriter 对象,配置相应的目录(Directory)和索引设置。然后,通过添加 Document 对象到 IndexWriter 来索引文档。 2. **索引字段(Indexing ...

    lucene3.0英文API

    1. **改进的性能**:Lucene 3.0引入了更高效的内存管理,优化了索引和搜索速度。 2. **多线程支持**:增加了对并发写入和读取的支持,提升了多用户环境下的性能。 3. **新的分析器**:提供了更多针对特定语言的...

    Lucene3.0入门实例含jar包

    - **IndexWriter** 类是用于创建和更新 Lucene 索引的主要接口。通过 IndexWriter,我们可以添加、删除或更新 Document。 - **倒排索引**:Lucene 使用倒排索引,将每个唯一的词(Term)映射到包含该词的所有文档...

    关于全文检索的文章(使用技术Lucene3.0)

    1. **创建索引**: 首先,使用Analyzer处理文档内容,然后使用IndexWriter将处理后的文档添加到索引中。 2. **搜索索引**: 使用IndexSearcher和QueryParser解析查询,然后执行搜索。 3. **结果排序**: Lucene支持...

    lucene3.0

    1. 创建索引:将数据源(如数据库、文件系统)中的内容读取并转换为Lucene的Document对象,然后添加到IndexWriter中进行索引。 2. 查询处理:用户输入查询后,使用Analyzer处理查询字符串,生成Query对象。 3. ...

    lucene 3.0 中的demo项目部署

    Lucene的核心组件包括Analyzer(分析器)、IndexWriter(索引写入器)、IndexReader(索引读取器)和Searcher(搜索器)。Analyzer负责将文本分解为可搜索的词项,IndexWriter则用于创建和更新索引,IndexReader用于...

    Lucene3.0 Demo

    Lucene 3.0 提供了强大的文本检索功能,通过创建索引、更新和删除文档,开发者可以构建高效搜索引擎。索引创建涉及文档对象、Analyzer、IndexWriter等核心组件,而更新和删除则依赖于`IndexWriter`的相应方法。虽然...

    lucene3.0 api jar

    `IndexWriter`在创建索引时会使用`Directory`来保存索引数据。 3. **查询解析**:用户输入的查询字符串需要通过`QueryParser`或`MultiFieldQueryParser`转换成`Query`对象。`Analyzer`同样在这个过程中起作用,用于...

Global site tag (gtag.js) - Google Analytics