`

Lucene-2.2.0 源代码阅读学习(7)

阅读更多

CharTokenizer是一个抽象类,它主要是对西文字符进行分词处理的。常见的英文中,是以空格、标点为分隔符号的,在分词的时候,就是以这些分隔符作为分词的间隔符的

package org.apache.lucene.analysis;

import java.io.IOException;
import java.io.Reader;

// CharTokenizer 是一个抽象类
public abstract class CharTokenizer extends Tokenizer {
public CharTokenizer(Reader input) {
    super(input);
}

private int offset = 0, bufferIndex = 0, dataLen = 0;
private static final int MAX_WORD_LEN = 255;
private static final int IO_BUFFER_SIZE = 1024;
private final char[] buffer = new char[MAX_WORD_LEN];
private final char[] ioBuffer = new char[IO_BUFFER_SIZE];

protected abstract boolean isTokenChar(char c);

// 对字符进行处理,可以在CharTokenizer 的子类中实现
protected char normalize(char c) {
    return c;
}

// 这个是核心部分,返回分词后的词条
public final Token next() throws IOException {
    int length = 0;
    int start = offset;
    while (true) {
      final char c;

      offset++;
      if (bufferIndex >= dataLen) {
        dataLen = input.read(ioBuffer);
        bufferIndex = 0;
      }
      ;
      if (dataLen == -1) {
        if (length > 0)
          break;
        else
          return null;
      } else
        c = ioBuffer[bufferIndex++];

      if (isTokenChar(c)) {               // if it's a token char

        if (length == 0)              // start of token
          start = offset - 1;

        buffer[length++] = normalize(c); // buffer it, normalized

        if (length == MAX_WORD_LEN)     // buffer overflow!
          break;

      } else if (length > 0)             // at non-Letter w/ chars
        break;                           // return 'em

    }

    return new Token(new String(buffer, 0, length), start, start + length);
}
}

实现CharTokenizer的具体类有3个,分别为:LetterTokenizer、RussianLetterTokenizer、WhitespaceTokenizer。

先看看LetterTokenizer类,其它的2个都是基于CharTokenizer的,而核心又是next() 方法:

package org.apache.lucene.analysis;

import java.io.Reader;

// 只要读取到非字符的符号,就分词

public class LetterTokenizer extends CharTokenizer {

public LetterTokenizer(Reader in) {
    super(in);
}

  
protected boolean isTokenChar(char c) {
    return Character.isLetter(c);
}
}

做个测试就可以看到:

package org.shirdrn.lucene;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import org.apache.lucene.analysis.LetterTokenizer;

public class LetterTokenizerTest {

public static void main(String[] args) {
   Reader reader = new StringReader("That's a world,I wonder why.");
   LetterTokenizer ct = new LetterTokenizer(reader);
   try {
    System.out.println(ct.next());
   } catch (IOException e) {
    e.printStackTrace();
   }
}

}

运行结果如下:

(That,0,4)

在分词过程中,遇到了单引号,就把单引号之前的作为一个词条返回。

可以验证一下,把构造的Reader改成下面的形式:

Reader reader = new StringReader("ThatisaworldIwonderwhy.");

输出结果为:

(ThatisaworldIwonderwhy,0,22)

没有非字符的英文字母串就可以作为一个词条,一个词条长度的限制为255个字符,可以在CharTokenizer抽象类中看到定义:

private static final int MAX_WORD_LEN = 255;

分享到:
评论

相关推荐

    lucene-analyzers-2.2.0.jar

    lucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-2.2.0.jarlucene-analyzers-...

    lucene-2.2.0-src

    《深入剖析Lucene 2.2.0源代码》 Lucene是一款强大的开源全文搜索引擎库,由Apache软件基金会开发并维护。它为Java开发者提供了一种高性能、可扩展的文本检索核心工具。本文将深入探讨Lucene 2.2.0版本的源代码,...

    基于JAVA的搜索引擎 lucene-2.2.0

    在前面Lucene-2.2.0 源代码阅读学习(1)中,根据Lucene提供的一个Demo,详细分析研究一下索引器org.apache.lucene.index.IndexWriter类,看看它是如果定义的,掌握它建立索引的机制。 通过IndexWriter类的实现源代码...

    lucene使用流程

    2. **Tomcat 安装**: Tomcat 是一个免费的开放源代码的 Web 应用服务器,文中提到使用的是 Tomcat 5.0 版本。同样地,当前的 Tomcat 版本已经更新到了更高的版本,例如 Tomcat 9 或者 10。安装完成后,需要配置 ...

    Atlas2.2.0编译、安装及使用(集成ElasticSearch,导入Hive数据).doc

    安装过程可以分为两步:首先下载 Atlas2.2.0 的源代码,然后使用 Maven 编译和打包 Atlas2.2.0。 Atlas2.2.0 的配置 Atlas2.2.0 的配置主要包括两个部分:元数据管理层的配置和数据访问层的配置。元数据管理层的...

    巴巴运动网项目jar包完整版

    3. **Compass** (compass-2.2.0.jar): Compass 是一个基于Lucene的搜索引擎库,它使得在Java应用中集成全文搜索引擎变得更加简单。Compass 提供了ORM级别的搜索引擎功能,可以自动同步数据到索引,使得实时搜索成为...

    SidekickNotes-开源

    这款软件的开发遵循开源软件的原则,意味着其源代码对公众开放,允许用户查看、修改和分发,促进社区的协作与改进。 在提供的压缩包文件中,我们可以看到以下组件: 1. `makejar.bat`:这是一个批处理文件,通常...

Global site tag (gtag.js) - Google Analytics