`

【Lucene3.0 初窥】数据源内存组织结构—Document/Field

阅读更多

在检索数据的时候,我们很希望可以检索出数据源的各种信息。就比如检索磁盘文件,可以检索出文件的路径,名字, 内容,修改时间等等。再比如检索图书的书号、书名、作者、出版时间....  Lucene是如何组织这些数据源的不同属性信息呢?

 

Lucene 数据源组织结构

 

org.apache.lucene.document包中有两个很重要的类:Document 和 Field。这两个类将杂乱无章的数据形式组织成可以被Lucene使用的内存数据结构。

 

Field类的作用主要是用来表示当前数据源的各种属性。 数据源的每种属性信息都可以组织成一个Field对象。这些对象有不同的属性名,属性值,以及属性数据的存储方式和索引方式。

 

举个列子,比如我们想要检索文件的路径,修改时间和内容。我们可以创建三个Field对象分别存储这三种数据:

//文件路径Field
Field pathField=new Field("path", file.getPath(), Field.Store.YES, Field.Index.NOT_ANALYZED)
//文件修改时间Field
Field modifiedField=new Field("modified", DateTools.timeToString(file.lastModified(), DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED)
//文件内容Field
Field contentField=new Field("contents", new FileReader(file));

 

下面是Field构造器(Field构造器有很多种,这里只做简单说明)

/**
 * name:  名字
 * value:  需要处理的字符串
 * store:  是否需要将Field的原始value保存在索引文件中
 * index:  是否需要对Field的原始value建立索引,如果需要,那么Field值要被分词。
 */
public Field(String name, String value, Store store, Index index) 

 

Store和Index是Field中的枚举类型,用来表示这个Field的存储和索引方式。它们主要是为了告诉Lucene,哪些数据不需要存储,哪些数据不需要检索。

/** 
 *  确定该Field的原始value是否需要存储在索引中
 */
enum Store {
    //该Field的原始值要被存储在索引中
    //对短文本很有用。比如一个文档的标题,这个value以原始形式存储,在存储之前并不通过analyze分词
    YES {
          public boolean isStored() { return true; }
    },
    //该Field的原始值不需要存储在索引中
    NO {
          public boolean isStored() { return false; }
    };
    public abstract boolean isStored();
}
/**
 *   确定该Field是否需要索引
 */
enum Index{
      //该Field的值不需要索引,也就是不能提供关于这种Field值的查询
      //但是如果这个Field被存储了(Stored=YES),那么我们查询别的Field的时候,可以得到这种Field信息
      NO{
          public boolean isIndexed()  { return false; }
          public boolean isAnalyzed() { return false; }
          public boolean omitNorms()  { return true;  }   
      },
      //该Field值需要建索引,而且需要分词
      // 可以通过Field值中的词语进行查询,适合内容查询(全文检索)
      ANALYZED {
          public boolean isIndexed()  { return true;  }
          public boolean isAnalyzed() { return true;  }
          public boolean omitNorms()  { return false; }   	
     },
      //该Field值需要建索引,但不需要分词
      //由于不分词,只能够通过整个值进行查询,适合像商品编号这样的ID值或者单个词语
      NOT_ANALYZED {
          public boolean isIndexed()  { return true;  }
          public boolean isAnalyzed() { return false; }
          public boolean omitNorms()  { return false; }   	
     },
}

 

Document 是Field 的集合(并不是狭隘的文件的含义) 在Lucene中,Document作为数据源的各种属性信息的集合,向Lucene提供原始的要索引的数据。这些数据源不仅可以是文件,也可以是一段字符串、几个数字、甚至一些链接。只要把它们加入到Document对象中,Lucene就可以为这些数据源建立索引。下面的部分Document源码表明:Document主要起到对Field信息进行记录和管理的作用。

 

public final class Document implements java.io.Serializable {
 
    //Field列表
    List<Fieldable> fields = new ArrayList<Fieldable>();
    //在Document中加入Field
    public final void add(Fieldable field) {
         fields.add(field);
    }

    public final void removeField(String name){....}
    public final Field getField(String name) {....}
    .....
}

 

还是上面检索文件的例子,每个文档文件的不同属性信息都被组织成了三个Field对象:path Field、modified Field、content Field。我们可以创建一个Document对象,加入这三个Field,来表示一个文档文件需要被检索的三种数据。

Document doc = new Document();  

doc.add(pathField);
doc.add(modifiedField);
doc.add(contentField);

 

 

总结 :下面的图很清楚的说明Lucene的数据源表示形式

 

举个例子,按照《Lucene体系结构概述》 中代码(IndexFiles.java )对3个txt文件建立索引。Lucene首先将这三个数据源在内存中组织成Document、Field 如下表:

 

Document    Field1 (path)     Field2 (modified)
    Field3 (content)
    1.txt    e:\\....\\1.txt        2010-4-1  I'm a good stud..
    2.txt    e:\\....\\2.txt        2010-4-2  It's me to a fini...
    3.txt    e:\\....\\3.txt        2010-2-11  Hi, Jack me too...

 

Document 和 Field在Lucene中的作用是巨大的。我们都知道Lucene可以对任何形式的数据源建立索引,比如字符串、纯文本、XML、HTML等数据形式。怎么多杂乱无章的数据必须组织成统一有效的结构才能更好的处理,Document / Field 无疑做到了这一点。

 

1
0
分享到:
评论

相关推荐

    Lucene3.0创建索引

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

    lucene3.0 api jar

    1. **索引构建**:Lucene首先需要对数据源(如文件、数据库等)进行索引。`Analyzer`类负责文本的分词,`Document`对象用于存储文档信息,`Field`定义了文档字段和其属性,而`IndexWriter`则负责将这些信息写入索引...

    lucene3.0

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

    lucene3的最新代码

    6. **文档和字段(Document & Field)**:Lucene 通过 Document 对象来表示一份文档,Field 对象则用来描述文档中的各个属性。在 3.0 版本中,对文档的读写操作更为高效,支持多种存储和编码方式。 7. **内存缓存...

    lucene.net源代码

    Lucene.NET支持多种数据源,如文件、数据库等,且具备高度可扩展性。 二、核心组件 1. 分析器(Analyzer):负责将输入文本转化为一系列可搜索的词项(Tokens)。例如,英文的Analyzer会将“quick brown fox”拆...

    lucene基本包

    这些分析器可以根据不同的语言和应用场景进行定制,以适应各种数据源。 5. **文件系统交互** Lucene与文件系统的交互是通过其内部的Segment和Directory概念完成的。Segments是不可变的索引块,而Directory则管理...

    lucene-3.0.1库及源代码

    《深入理解Lucene 3.0.1:库与源代码解析》 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。这个“lucene-3.0.1”版本代表了Lucene在2009年的一个重要里程碑,它提供了强大的文本检索功能,被广泛...

    lucene 3.5 官网 源代码

    倒排索引是Lucene的核心数据结构,存在于`src/core/org/apache/lucene/store`和`src/core/org/apache/lucene/index`中。Term、TermInfo、Posting等类共同构成了倒排索引的组成部分。 4. 查询与搜索 查询解析和执行...

    lucene索引结构原理.docx

    - **数据源的灵活性**:Lucene不指定特定的数据源,而是抽象为文档结构,因此可以适应各种不同的数据源,只需前端有适当的转换器。相比之下,许多系统仅针对特定格式如网页,缺乏对其他文档格式的支持。 - **索引...

    lucene2.0.0搜索引擎源代码

    2. **索引构建(Indexing)**:Lucene支持倒排索引,这是一种能够快速查找包含特定单词的文档的数据结构。在2.0.0版本中,索引构建过程更加优化,减少了磁盘I/O操作,提升了效率。 3. **查询解析(Query Parsing)*...

    基于LUCENE的搜索引擎的设计与实现源代码

    Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。每个文档由多个字段组成,字段可以包含不同类型的数据,如文本、日期或数字。索引是Lucene处理文档的关键步骤,它将文本数据...

    深入了解Lucene之一 系统结构分析.pptx

    本文将从系统结构、源码组织、数据流及其相互关系等多个角度,帮助读者深入理解Lucene的核心机制。 ### **1. 全文检索系统结构** 一个完整的全文检索系统通常包括以下几个关键组成部分: - **索引构建(Indexing...

    Lucene.NET2.9搜索引擎源代码(C#)

    - **文档(Document)**:表示待搜索的数据结构,包含多个字段(Field)。 - **段(Segment)**:索引的基本存储单位,可优化磁盘空间使用和读取性能。 - **查询解析器(QueryParser)**:将用户输入的查询字符串转化为 ...

    lucene-5.3.1源代码

    - 使用`IndexWriter`读取数据源,创建文档并添加到索引中。 - 自定义分析器以适应特定需求,如定制分词规则。 4.2 执行查询: - 通过`QueryParser`解析用户输入,生成查询对象。 - 使用`Searcher`执行查询,...

    lucene索引入门[归类].pdf

    Lucene 并没有规定数据源的格式,而只提供了一个通用的结构(Document 对象)来接受索引的输入,因此输入的数据源可以是:数据库、WORD 文档、PDF 文档、HTML 文档等,只要能够设计相应的解析转换器将数据源构造成 ...

    lucene索引建立[整理].pdf

    首先,我们要理解Lucene的数据源组织结构。在Lucene中,一个文档的数据源通常由多个Field组成,例如文件路径、修改时间和内容。每个Field代表一种特定的数据类型,Document则是这些Field的容器,用于表示完整的文档...

    Lucene 3.6.2 源代码

    6. **缓存(Caching)**: 为了提高性能,Lucene 3.6.2引入了缓存机制,如BitSetCache和TermInfoCache,它们能有效地缓存频繁访问的数据,减少磁盘I/O。 7. **多字段搜索(Multi-field Searching)**: Lucene允许在...

Global site tag (gtag.js) - Google Analytics