CharTokenizer 是一个抽象类,它主要是对西文字符进行分词处理的。常见的英文中,是以空格、标点为分隔符号的,在分词的时候,就是以这些分隔符作为分词的间隔符的。
- package org.apache.lucene.analysis;
- import java.io.IOException;
- import java.io.Reader;
- import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
- import org.apache.lucene.analysis.tokenattributes.TermAttribute;
- import org.apache.lucene.util.AttributeSource;
- //CharTokenizer是一个抽象类,貌似只有
- // CharTokenizer token5 = new LetterTokenizer(input); 去实例化?
- public abstract class CharTokenizer extends Tokenizer {
- public CharTokenizer(Reader input) {
- super(input);
- offsetAtt = addAttribute(OffsetAttribute.class);
- termAtt = addAttribute(TermAttribute.class);
- }
- public CharTokenizer(AttributeSource source, Reader input) {
- super(source, input);
- offsetAtt = addAttribute(OffsetAttribute.class);
- termAtt = addAttribute(TermAttribute.class);
- }
- public CharTokenizer(AttributeFactory factory, Reader input) {
- super(factory, input);
- offsetAtt = addAttribute(OffsetAttribute.class);
- termAtt = addAttribute(TermAttribute.class);
- }
- private int offset = 0, bufferIndex = 0, dataLen = 0;
- private static final int MAX_WORD_LEN = 255;
- private static final int IO_BUFFER_SIZE = 4096;
- private final char[] ioBuffer = new char[IO_BUFFER_SIZE];
- private TermAttribute termAtt;
- private OffsetAttribute offsetAtt;
- protected abstract boolean isTokenChar(char c);
- // 对字符进行处理,可以在CharTokenizer 的子类中实现
- protected char normalize(char c) {
- return c;
- }
- @Override
- public final boolean incrementToken() throws IOException {
- clearAttributes();
- int length = 0;
- int start = bufferIndex;
- char[] buffer = termAtt.termBuffer();
- while (true) {
- if (bufferIndex >= dataLen) {
- offset += dataLen;
- dataLen = input.read(ioBuffer);
- if (dataLen == -1) {
- dataLen = 0; // so next offset += dataLen won't decrement offset
- if (length > 0)
- break;
- else
- return false;
- }
- bufferIndex = 0;
- }
- final char c = ioBuffer[bufferIndex++];
- if (isTokenChar(c)) { // if it's a token char
- if (length == 0) // start of token
- start = offset + bufferIndex - 1;
- else if (length == buffer.length)
- buffer = termAtt.resizeTermBuffer(1+length);
- 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
- }
- termAtt.setTermLength(length);
- offsetAtt.setOffset(correctOffset(start), correctOffset(start+length));
- return true;
- }
- @Override
- public final void end() {
- // set final offset
- int finalOffset = correctOffset(offset);
- offsetAtt.setOffset(finalOffset, finalOffset);
- }
- @Override
- public void reset(Reader input) throws IOException {
- super.reset(input);
- bufferIndex = 0;
- offset = 0;
- dataLen = 0;
- }
- }
实现 CharTokenizer 的具体类有 1 个,分别为: LetterTokenizer( 仅在核心包 ) 、
看看 LetterTokenizer 类:
- 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 com.fpi.lucene.studying.test;
- import java.io.IOException;
- import java.io.Reader;
- import java.io.StringReader;
- import org.apache.lucene.analysis.CharTokenizer;
- import org.apache.lucene.analysis.LetterTokenizer;
- import org.apache.lucene.analysis.Tokenizer;
- import org.apache.lucene.analysis.cjk.CJKTokenizer;
- import org.apache.lucene.analysis.cn.ChineseTokenizer;
- public class JustTest {
- public static void main(String[] args) {
- Reader read = new StringReader("what are you doing,man?It's none of your business!");
- LetterTokenizer token5 = new LetterTokenizer(read);
- try {
- while(token5.incrementToken()){
- System.out.println(token5.toString());
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
运行结果如下:
(startOffset=0,endOffset=4,term=what)
(startOffset=5,endOffset=8,term=are)
(startOffset=9,endOffset=12,term=you)
(startOffset=13,endOffset=18,term=doing)
(startOffset=19,endOffset=22,term=man)
(startOffset=23,endOffset=25,term=It)
(startOffset=26,endOffset=27,term=s)
(startOffset=28,endOffset=32,term=none)
(startOffset=33,endOffset=35,term=of)
(startOffset=36,endOffset=40,term=your)
(startOffset=41,endOffset=49,term=business)
看到了吗?不但逗号和问号被分开,而且连 It’s 这个也被分解为 It 和 s 了。
没有非字符的英文字母串就可以作为一个词条,一个词条长度的限制为 255 个字符,可以在 CharTokenizer 抽象类中看到定义:
private static final int MAX_WORD_LEN = 255
相关推荐
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
lucene 3.0 API中文帮助,学习的人懂得的
【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...
【Lucene3.0 使用教程】是针对Java开发者的一个指南,旨在教授如何利用Apache Lucene 3.0.1版本实现全文检索功能。Lucene是一个高性能、可伸缩的开源全文检索库,它提供了文本分析、索引创建、文档检索等核心功能。...
lucene3.0 中文分词器, 庖丁解牛
《Lucene 3.0 原理与代码分析完整版》是一本深入解析Lucene 3.0搜索引擎库的专业书籍。Lucene是Apache软件基金会的开源项目,它为Java开发者提供了一个高性能、全文检索的工具包,广泛应用于各种信息检索系统。这...
这里的"lucene3.0核心jar包"是 Lucene 的一个重要版本,发布于2009年,为当时的开发人员提供了构建全文搜索引擎的基础框架。 在 Lucene 3.0 中,以下几个关键知识点值得关注: 1. **索引结构**:Lucene 使用倒排...
**Lucene 3.0 全文信息检索** Lucene 是一个由Apache软件基金会4 Jakarta项目组开发的开源全文检索引擎工具包。自1999年发布以来,Lucene 已经发展成为Java世界中最为广泛使用的全文检索库,为开发者提供了构建高...
这里我们主要聚焦于`lucene3.0`版本,该版本在当时是Lucene的一个重要里程碑,引入了许多改进和新特性。 1. **索引构建**: 在Lucene3.0中,索引是数据检索的基础。它通过将文本数据转换为倒排索引来实现快速查询...
在 Lucene 3.0 版本中,虽然已经相对较旧,但仍然包含了基本的搜索引擎功能,适用于简单或特定场景的搜索需求。在这个实例中,我们将探讨如何在 JDK 1.5 和 Lucene 3.0 的环境下构建和运行一个简单的搜索引擎。 ...
《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene3.0版本,结合“庖丁解...
在本文中,我们将深入探讨Lucene 3.0版本,了解其核心概念、功能特性,并通过实例来展示如何使用这个强大的工具。 ### 1. Lucene 3.0核心概念 #### 1.1 文档与字段 在Lucene中,数据是以文档(Document)的形式...
lucene3.0-highlighter.jar lucene3.0的高亮jar包,从lucene3.0源码中导出来的
**Lucene 3.0 全文检索入门实例** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。它提供了一个高级、灵活的搜索功能框架,允许开发者在自己的应用中轻松地集成全文检索功能。本文将重点介绍如何使用 ...
lucene升级了,分词也得升级哦! 在使用lucene3与paoding集成的时候可能会出现以下错误: Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z ...
Lucene3.0分词系统的核心在于理解和应用其分词原理,无论是对于英文还是中文文本,这一过程都是构建高效搜索引擎的基础。以下是对Lucene3.0分词系统中涉及的关键知识点的深入解析。 ### 英文分词原理 英文分词相较...
**Lucene 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...
**Lucene 3.0 入门实例** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询解析、排序以及高级的文本分析能力。在 Lucene 3.0 版本中,开发者可以利用其强大...