`

Lucene中Field类很重要

 
阅读更多

org.apache.lucene.demo.IndexFiles类中,使用递归的方式去索引文件。在构造了一个IndexWriter索引器之后,就可以向索引器中添加Doucument了,执行真正地建立索引的过程。遍历每个目录,因为每个目录中可能还存在目录,进行深度遍历,采用递归技术找到处于叶节点处的文件(普通的具有扩展名的文件,比如my.txt文件),然后调用如下代码中红色部分:

static void indexDocs(IndexWriter writer, File file)
    throws IOException {
    // file可以读取
    if (file.canRead()) {
      if (file.isDirectory()) { // 如果file是一个目录(该目录下面可能有文件、目录文件、空文件三种情况)
        String[] files = file.list(); // 获取file目录下的所有文件(包括目录文件)File对象,放到数组files里
        // 如果files!=null
        if (files != null) {
          for (int i = 0; i < files.length; i++) { // 对files数组里面的File对象递归索引,通过广度遍历
            indexDocs(writer, new File(file, files[i]));
          }
        }
      } else { // 到达叶节点时,说明是一个File,而不是目录,则建立索引
        System.out.println("adding " + file);
        try {
          writer.addDocument(FileDocument.Document(file));
        }
        catch (FileNotFoundException fnfe) {
          ;
        }
      }
    }
}

上面红色标注的这一句:

writer.addDocument(FileDocument.Document(file));

其实做了很多工作。每当递归到叶子节点,获得一个文件,而非目录文件,比如文件myWorld.txt。然后对这个文件进行了复杂的操作:

先根据由myWorld.txt构造的File对象f,通过f获取myWorld.txt的具体信息,比如存储路径、修改时间等等,构造多个Field对象,再由这些不同Field的聚合,构建出一个Document对象,最后把Document对象加入索引器IndexWriter对象中,通过索引器可以对这些聚合的Document的Field中信息进行分词、过滤处理,方便检索。

org.apache.lucene.demo.FileDocument类的源代码如下所示:

package org.apache.lucene.demo;

import java.io.File;
import java.io.FileReader;

import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;


public class FileDocument {
public static Document Document(File f)
       throws java.io.FileNotFoundException {

    // 实例化一个Document
    Document doc = new Document();
    // 根据传进来的File f,构造多个Field对象,然后把他们都添加到Document中

    // 通过f的所在路径构造一个Field对象,并设定该Field对象的一些属性:
    // “path”是构造的Field的名字,通过该名字可以找到该Field
    // Field.Store.YES表示存储该Field;Field.Index.UN_TOKENIZED表示不对该Field进行分词,但是对其进行索引,以便检索

    doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.UN_TOKENIZED));

   // 构造一个具有最近修改修改时间信息的Field
    doc.add(new Field("modified",
        DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE),
        Field.Store.YES, Field.Index.UN_TOKENIZED));

    // 构造一个Field,这个Field可以从一个文件流中读取,必须保证由f所构造的文件流是打开的
    doc.add(new Field("contents", new FileReader(f)));
    return doc;
}

private FileDocument() {}
}

通过上面的代码,可以看出Field是何其的重要,必须把Field完全掌握了。

Field类定义了两个很有用的内部静态类:Store和Index,用它们来设置对Field进行索引时的一些属性。

// Store是一个内部类,它是static的,主要为了设置Field的存储属性
public static final class Store extends Parameter implements Serializable {

    private Store(String name) {
      super(name);
    }

    // 在索引中压缩存储Field的值
    public static final Store COMPRESS = new Store("COMPRESS");

    // 在索引中存储Field的值
    public static final Store YES = new Store("YES");

    // 在索引中不存储Field的值
    public static final Store NO = new Store("NO");
}

//通过Index设置索引方式
public static final class Index extends Parameter implements Serializable {

    private Index(String name) {
      super(name);
    }

    // 不对Field进行索引,所以这个Field就不能被检索到(一般来说,建立索引而使它不被检索,这是没有意义的)
    // 如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS,则可以检索

    public static final Index NO = new Index("NO");

    // 对Field进行索引,同时还要对其进行分词(由Analyzer来管理如何分词)
    public static final Index TOKENIZED = new Index("TOKENIZED");

    // 对Field进行索引,但不对其进行分词
    public static final Index UN_TOKENIZED = new Index("UN_TOKENIZED");

   // 对Field进行索引,但是不使用Analyzer
    public static final Index NO_NORMS = new Index("NO_NORMS");

}

Field类中还有一个内部类,它的声明如下:

public static final class TermVector extends Parameter implements Serializable

这是一个与词条有关的类。因为在检索的时候需要指定检索关键字,通过为一个Field添加一个TermVector,就可以在检索中把该Field检索到。它的构造函数:

private TermVector(String name) {
      super(name);
    }

通过指定一个字符串,来构造一个Field的TermVector,指定该Field的对词条的设置方式,如下:

// 不存储
    public static final TermVector NO = new TermVector("NO");
    
    // 为每个Document都存储一个TermVector
    public static final TermVector YES = new TermVector("YES");
    
    // 存储,同时存储位置信息
    public static final TermVector WITH_POSITIONS = new TermVector("WITH_POSITIONS");
    
    // 存储,同时存储偏移量信息
    public static final TermVector WITH_OFFSETS = new TermVector("WITH_OFFSETS");
    
    // 存储,同时存储位置、偏移量信息
    public static final TermVector WITH_POSITIONS_OFFSETS = new TermVector("WITH_POSITIONS_OFFSETS");
}

同时,Field的值可以构造成很多类型,Field类中定义了4种:String、Reader、byte[]、TokenStream。

然后就是Field对象的构造,应该看它的构造方法,它有7种构造方法:

public Field(String name, byte[] value, Store store)
public Field(String name, Reader reader)
public Field(String name, Reader reader, TermVector termVector)
public Field(String name, String value, Store store, Index index)
public Field(String name, String value, Store store, Index index, TermVector termVector)
public Field(String name, TokenStream tokenStream)
public Field(String name, TokenStream tokenStream, TermVector termVector)

还要注意了,通过Field类的声明:

public final class Field extends AbstractField implements Fieldable, Serializable

可以看出,应该对它继承的父类AbstractField类有一个了解,下面的是AbstractField类的属性:

protected String name = "body";
protected boolean storeTermVector = false;
protected boolean storeOffsetWithTermVector = false;
protected boolean storePositionWithTermVector = false;
protected boolean omitNorms = false;
protected boolean isStored = false;
protected boolean isIndexed = true;
protected boolean isTokenized = true;
protected boolean isBinary = false;
protected boolean isCompressed = false;
protected boolean lazy = false;
protected float boost = 1.0f;
protected Object fieldsData = null;

还有Field实现了Fieldable接口,添加了一些对对应的Document中的Field进行管理判断的方法信息。

分享到:
评论

相关推荐

    lucene.NET 中文分词

    在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备丰富的词汇库和优秀的分词算法,能有效地对中文文本进行拆分。 - **IK Analyzer**:是一个开源的...

    供lucene初学者学习的几个类

    4. **Field**: `Field` 类代表文档中的一个属性,每个`Field`都有类型,这决定了其如何被索引和存储。例如,`TextField`适合全文搜索,而`StoredField`则仅存储,不参与索引。 5. **QueryParser**: `QueryParser` ...

    lucene 3.0 API 中文帮助文档

    首先,Lucene 3.0 API是Lucene的一个重要版本,它包含了丰富的类和接口,用于索引、查询和管理文本数据。这个版本的API设计目标是提高性能、稳定性,并提供更灵活的搜索功能。 在解压后的文件中,`index.html`是主...

    Lucene3.5源码jar包

    Lucene 3.5.0是Lucene的一个重要版本,它在3.x系列中引入了许多关键改进和新特性。在这个版本中,开发者可以找到关于索引构建、查询解析、搜索优化等多个方面的源代码实现。以下是对这个版本中一些关键知识点的详细...

    lucene中文分词

    在Lucene中,分词工作主要由Analyzer类来完成。Analyzer是 Lucene 提供的一个接口,用户可以通过实现这个接口来自定义分词策略。默认情况下,Lucene并不支持中文分词,因此我们需要引入专门的中文分词器。"je-...

    lucene中文下载

    下载最新稳定版的 Lucene,通常为 `.jar` 文件,将其加入到你的项目类路径中。同时,确保下载的版本支持中文处理,因为默认的分析器可能不适用于中文。 **3. 中文处理** - **分析器(Analyzer)**:对于中文,你...

    lucene 4.7.2 Demo

    排序功能在信息检索中至关重要,Lucene 4.7.2提供了基于文档评分和自定义字段的排序。评分通常基于TF-IDF算法,而字段排序则允许用户根据特定字段的值进行升序或降序排列。 高亮显示则是为了提高用户体验,它可以在...

    luceneDemo(完整代码)

    在Lucene中,IndexWriter是创建和更新索引的主要类,它负责将文档转换为倒排索引。Document类用于封装单个文档,其中可以包含多个Field,每个Field代表文档的一个属性。Field类有多种类型,如TextField用于全文搜索...

    lucene包,lucene实现核心代码

    在Java的网络搜索实现中,Lucene扮演着至关重要的角色,它能够帮助开发者快速构建自己的搜索引擎。 在"lucene包"中,我们可以找到Lucene的核心组件和类,这些类负责索引和搜索文档。以下是Lucene实现的核心知识点:...

    lucene-2.9.4

    Lucene使用Field类来表示文档的各个部分,每个Field可以有不同的存储和索引特性。例如,有些Field可以被存储以便检索,有些则仅用于索引。 7. **更新与删除** Lucene 2.9.4支持动态更新和删除文档,但需要注意的...

    Lucene与中文分词技术的研究及应用

    Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)、搜索器(Searcher)等。 - **文档**:是Lucene中的基本存储单位,由多个字段组成。 - **字段**:包含具体的文本内容,是文档的组成部分。 - ...

    Lucene实战(中文版第二版)对应Lucene版本

    这个版本中,你可以学习到如何通过`IndexWriter`类创建和更新索引,以及如何使用`Document`、`Field`来组织和存储文档内容。 2. **查询解析**:Lucene提供了`QueryParser`类用于将用户输入的文本转换为查询对象。...

    lucene-4.7.0.

    高亮显示是Lucene 4.7.0中的一个重要特性,它可以在搜索结果中突出显示匹配的关键词,帮助用户快速定位到关键信息。高亮器(Highlighter)组件可以根据查询结果生成高亮的片段,使用户能一眼看出哪些部分与查询相关...

    Lucene3.0.1 官方api

    3. **文档(Document)与字段(Field)**:`Document`类用于存储单个文档的信息,而`Field`类定义了文档中的每个属性,如文本内容、关键词、日期等。开发者可以自定义字段类型,例如设置为可搜索、存储或两者兼有。 ...

    lucene3.0核心jar包

    在 3.0 版本中,开发者可以通过 Field 类来创建和配置这些字段。 4. **查询解析(Query Parser)**:Lucene 提供了一个强大的查询解析器,可以将用户输入的自然语言查询转换为内部查询对象。在 3.0 版本中,查询...

    Lucene4.7-Web 例子

    1. 定义索引文档:在Lucene中,每个需要被搜索的对象都被表示为一个Document对象,包含多个Field,每个Field代表对象的一个属性。 2. 分析器选择:根据文本内容选择合适的Analyzer,例如中文文本可以使用...

    lucene整理文档,lucene详细描述,安装使用过程。

    对于非 Maven 项目,可以直接下载 Lucene 的 JAR 包并将其添加到项目的类路径中。 **Lucene 的基本组件** 1. **Analyzer**: 分析器是 Lucene 中的关键组件,负责将输入文本拆分成可搜索的 tokens(词元)。...

    lucene 对 xml建立索引

    - 可以使用`Field`类来表示文档中的一个字段,包括字段名和字段值。 - 特别注意:对于带有属性的元素,可以使用`HashMap`来存储属性信息,并将其添加到文档中。 #### 四、示例代码分析 1. **SAX处理器类** (`SAX...

    lucene2.3API中文文档、lucene-3.5.0JAR包

    在文档中,你可以找到关于Lucene核心组件的详细信息,如Analyzer(分析器)用于文本预处理,Tokenizer(分词器)进行词汇分割,Filter(过滤器)进行额外的文本处理,以及Document(文档)、Field(字段)和...

Global site tag (gtag.js) - Google Analytics