`
twh1224
  • 浏览: 95624 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Lucene学习(5)

阅读更多
研究Lucene分析器的实现。

Analyzer抽象类

所有的分析器的实现,都是继承自抽象类Analyzer,它的源代码如下所示:
package org.apache.lucene.analysis; 
 
import java.io.Reader; 
 
public abstract class Analyzer { 
//   通过Field的名称,和一个Reader对象,创建一个分词流,该方法是抽象方法 
public abstract TokenStream tokenStream(String fieldName, Reader reader); 
 
//个人理解,感觉这个方法是在后台分词用的,因为对一个文件建立索引,要构造Field,可能有重复的。 
public int getPositionIncrementGap(String fieldName) 
{ 
    return 0; 
} 
} 


这里,tokenStream()的作用非常大。它返回一个TokenStream类对象,这个TokenStream类对象应该是已经经过分词器处理过的。

与Analyzer抽象类有关的其他类

TokenStream也是一个抽象类:
package org.apache.lucene.analysis; 
 
import java.io.IOException; 
 
// 对后台选择的待分析处理的文件,一个TokenStream对象包含了对这个文件分词的词条序列 
 
public abstract class TokenStream { 
// 返回下一个分词的词条 
public abstract Token next() throws IOException; 
 
// 重置一个分词流,恢复到分词工作的开始状态 
public void reset() throws IOException {} 
 
// 关闭分词流,停止分词 
public void close() throws IOException {} 
} 


TokenStream类的方法表明,它最基本的是对分词流的状态进行管理。具体地,它如何对分析的对象处理,应该从继承该抽象类的子类的构造来看。

在包org.apache.lucene.analysis下可以看到有两个TokenStream的子类:Tokenizer和 TokenFilter,它们还都是抽象类,从这两个抽象类可以看出,是在TokenStream的基础上,按照功能进行分类实现:处理分词、过滤分词。

Tokenizer类在Lucene中定义如下所示:
package org.apache.lucene.analysis; 
 
import java.io.Reader; 
import java.io.IOException; 
 
// Tokenizer所处理的输入来源是一个Reader对象 
 
public abstract class Tokenizer extends TokenStream { 
// 一个Reader对象作为它的成员 
protected Reader input; 
 
protected Tokenizer() {} 
 
protected Tokenizer(Reader input) { 
    this.input = input; 
} 
 
// 关闭输入流 
public void close() throws IOException { 
    input.close(); 
} 
} 


接着,看看TokenFilter类的实现,TokenFilter类在Lucene中定义如下所示:
package org.apache.lucene.analysis; 
 
import java.io.IOException; 
 
// TokenFilter是TokenStream的子类,在分词之后进行,起过滤器的作用 
public abstract class TokenFilter extends TokenStream { 
// 它以一个TokenStream对象作为成员 
protected TokenStream input; 
 
protected TokenFilter(TokenStream input) { 
    this.input = input; 
} 
 
public void close() throws IOException { 
    input.close(); 
} 
} 


TokenFilter是可以嵌套Tokenizer的:

当一个Tokenizer对象不为null时,如果需要对其进行过滤,可以构造一个TokenFilter来对分词的词条进行过滤。

同样地,在包org.apache.lucene.analysis下可以找到继承自Tokenizer类的具体实现类。

很明显了,实现Tokenizer类的具体类应该是分词的核心所在了。

对指定文本建立索引之前,应该先构造Field对象,在此基础上再构造Document对象,然后添加到IndexWriter中进行分析处理。在这个分析处理过程中,包含对其进行分词(Tokenizer),而经过分词处理以后,返回的是一个Token对象(经过分词器得到的词条),它可能是 Field中的一个Term的一部分。

看一看Token类都定义了哪些内容:
package org.apache.lucene.analysis; 
 
import org.apache.lucene.index.Payload; 
import org.apache.lucene.index.TermPositions; 
 
public class Token implements Cloneable { 
String termText;      // 一个词条的内容 
int startOffset;      // 记录在源文件中第一次出现的位置 
int endOffset;      // 记录在源文件中最后一次出现的位置t 
String type = "word";      // lexical type 
 
Payload payload; 
 
private int positionIncrement = 1;    // 位置增量 
 
public Token(String text, int start, int end) {    // 初始化一个词条实例时,初始化词条文本内容、开始位置、最后位置 
    termText = text; 
    startOffset = start; 
    endOffset = end; 
} 
 
public Token(String text, int start, int end, String typ) {     // 初始化一个词条实例时,初始化词条文本内容、开始位置、最后位置、类型 
    termText = text; 
    startOffset = start; 
    endOffset = end; 
    type = typ; 
} 
 
// 设置位移增量的,相对于TokenStream中该Token的前一个,只能设置为1或0 
 
//默认为1,如果为0,则表示多个Term都具有同一个位置。 
public void setPositionIncrement(int positionIncrement) { 
    if (positionIncrement < 0) 
      throw new IllegalArgumentException 
        ("Increment must be zero or greater: " + positionIncrement); 
    this.positionIncrement = positionIncrement; 
} 
 
public int getPositionIncrement() { return positionIncrement; } 
 
// 设置词条(Token)的内容 
public void setTermText(String text) { 
    termText = text; 
} 
 
public final String termText() { return termText; } 
 
// 返回该词条(Token)在一个文件(待建立索引的文件)中的起始位置 
public final int startOffset() { return startOffset; } 
 
   // 返回该词条(Token)在一个文件(待建立索引的文件)中的结束位置 
public final int endOffset() { return endOffset; } 
 
// 返回Token's lexical type 
public final String type() { return type; } 
 
   // Payload是一个元数据(metadata)对象,对每个检索的词条(Term)都设置相应的Payload,存储在index中,通过Payload可以获取一个词条(Term)的详细信息 
public void setPayload(Payload payload) { 
    this.payload = payload; 
} 
   
public Payload getPayload() { 
    return this.payload; 
} 
 
// 将一个词条(Token) 的信息,转换成字符串形式,在该字符串中,使用逗号作为每个属性值的间隔符 
 
public String toString() { 
    StringBuffer sb = new StringBuffer(); 
    sb.append("(" + termText + "," + startOffset + "," + endOffset); 
    if (!type.equals("word")) 
      sb.append(",type="+type); 
    if (positionIncrement != 1) 
      sb.append(",posIncr="+positionIncrement); 
    sb.append(")"); 
    return sb.toString(); 
} 
 
// 需要的时候,该Token对象 可以被克隆 
 
public Object clone() { 
    try { 
      return super.clone(); 
    } catch (CloneNotSupportedException e) { 
      throw new RuntimeException(e); // shouldn't happen since we implement Cloneable 
    } 
} 
} 


继承Tokenizer类的直接子类

Tokenizer类的直接子类有:

CharTokenizer(抽象类)、KeywordTokenizer、

org.apache.lucene.analysis.standard.StandardTokenizer、

org.apache.lucene.analysis.cn.ChineseTokenizer、

org.apache.lucene.analysis.ngram.NGramTokenizer、

org.apache.lucene.analysis.ngram.EdgeNGramTokenizer。

其中:

CharTokenizer是一个抽象类,它又有3个子类,如下:

org.apache.lucene.analysis.ru.RussianLetterTokenizer、

.WhitespaceTokenizer、LetterTokenizer(都和CharTokenizer类在包org.apache.lucene.analysis里)。

最后,LowerCaseTokenizer是最终类,又是LetterTokenizer类的子类。
分享到:
评论

相关推荐

    lucene学习资料收集

    【标题】:“Lucene学习资料收集” 【描述】:Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。这个资料集可能包含了关于如何理解和使用Lucene的各种资源,特别是通过博主huanglz19871030在iteye上的...

    Lucene的的学习资料及案例

    **Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...

    lucene学习

    5、查询索引库 6、分析器的分析过程 a) 测试分析器的分词效果 b) 第三方中文分析器 7、索引库的维护 a) 添加文档 b) 删除文档 c) 修改文档 Lucene的高级查询、solr入门 solr在项目中的应用及电商搜索实现

    lucene学习pdf2

    "lucene学习pdf2" 提供的文档,无疑是对Lucene深入理解的一把钥匙,它涵盖了Lucene的核心概念、操作流程以及高级特性。 首先,Lucene的基础知识是必不可少的。Lucene的核心在于索引和搜索,它将非结构化的文本数据...

    Lucene学习源码.rar

    本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...

    lucene学习资料

    《Lucene学习资料》 Lucene是一个开源的全文搜索引擎库,由Apache软件基金会维护。它提供了高级的文本分析和索引功能,使得开发者能够轻松地在应用程序中集成强大的搜索功能。这个资料包中的《Lucene in Action_2nd...

    Lucene-2.0学习文档

    本篇文章将围绕"Lucene-2.0学习文档"的主题,结合Indexer.java、MyScoreDocComparator.java和MySortComparatorSource.java这三个关键文件,深入探讨Lucene的核心概念和实际应用。 首先,我们来看`Indexer.java`。这...

    Lucene5学习之拼音搜索

    本文将围绕“Lucene5学习之拼音搜索”这一主题,详细介绍其拼音搜索的实现原理和实际应用。 首先,我们需要理解拼音搜索的重要性。在中文环境中,由于汉字的复杂性,用户往往习惯于通过输入词语的拼音来寻找信息。...

    Lucene3.3.0学习Demo

    **Lucene 3.3.0 学习Demo** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。在3.3.0版本中,Lucene提供了强大的文本搜索功能,包括分词、索引创建、查询解析和结果排序等。这个"Lucene3.3.0学习Demo...

    lucene学习-02

    【标题】:“Lucene学习-02” 在深入探讨“Lucene学习-02”这一主题之前,我们先来理解一下Lucene的核心概念。Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。...

    Lucene5学习之Facet(续)

    《Lucene5学习之Facet(续)》 在深入探讨Lucene5的Facet功能之前,我们先来了解一下什么是Faceting。Faceting是搜索引擎提供的一种功能,它允许用户通过分类或属性对搜索结果进行细分,帮助用户更精确地探索和理解...

    Lucene5学习之自定义Collector

    这篇博客“Lucene5学习之自定义Collector”显然聚焦于如何在Lucene 5版本中通过自定义Collector来优化搜索结果的收集过程。Collector是Lucene搜索框架中的一个重要组件,它负责在搜索过程中收集匹配的文档,并根据...

    Lucene5学习之排序-Sort

    “Lucene5学习之排序-Sort”这个标题表明了我们要探讨的是关于Apache Lucene 5版本中的排序功能。Lucene是一个高性能、全文检索库,它提供了强大的文本搜索能力。在这个主题中,我们将深入理解如何在Lucene 5中对...

    Lucene5学习之SpellCheck拼写纠错

    **标题:“Lucene5学习之SpellCheck拼写纠错”** 在深入探讨Lucene5的SpellCheck功能之前,首先需要理解Lucene是什么。Lucene是一个开源的全文检索库,由Apache软件基金会开发,它提供了高性能、可扩展的文本搜索...

    Lucene5学习之增量索引(Zoie)

    总结起来,Lucene5学习之增量索引(Zoie)涉及到的关键技术点包括: 1. 基于Lucene的增量索引解决方案:Zoie系统。 2. 主从复制架构:Index Provider和Index User的角色。 3. 数据变更追踪:通过变更日志实现增量索引...

    Lucene5学习之Group分组统计

    "Lucene5学习之Group分组统计" 这个标题指出我们要讨论的是关于Apache Lucene 5版本中的一个特定功能——Grouping。在信息检索领域,Lucene是一个高性能、全文搜索引擎库,而Grouping是它提供的一种功能,允许用户对...

    Lucene5学习之Highlighte关键字高亮

    《Lucene5学习之Highlighter关键字高亮》 在信息技术领域,搜索引擎的使用已经变得无处不在,而其中的关键技术之一就是如何有效地突出显示搜索结果中的关键字,这就是我们今天要探讨的主题——Lucene5中的...

    Lucene.net学习帮助文档

    **Lucene.net学习帮助文档** Lucene.net是一个开源全文搜索引擎库,它是Apache Lucene项目的一部分,专门针对.NET Framework进行了优化。这个压缩包包含了Lucene.net的源码和中文学习文档,旨在帮助开发者深入理解...

Global site tag (gtag.js) - Google Analytics