`

LUCENE3.0 自学吧 7 CharTokenizer

 
阅读更多

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

 

 

[java] view plaincopy
 
  1. package org.apache.lucene.analysis;  
  2.    
  3. import java.io.IOException;  
  4. import java.io.Reader;  
  5.    
  6. import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;  
  7. import org.apache.lucene.analysis.tokenattributes.TermAttribute;  
  8. import org.apache.lucene.util.AttributeSource;  
  9.    
  10. //CharTokenizer是一个抽象类,貌似只有  
  11. // CharTokenizer token5 = new LetterTokenizer(input); 去实例化?  
  12. public abstract class CharTokenizer extends Tokenizer {  
  13.   public CharTokenizer(Reader input) {  
  14.     super(input);  
  15.     offsetAtt = addAttribute(OffsetAttribute.class);  
  16.     termAtt = addAttribute(TermAttribute.class);  
  17.   }  
  18.    
  19.   public CharTokenizer(AttributeSource source, Reader input) {  
  20.     super(source, input);  
  21.     offsetAtt = addAttribute(OffsetAttribute.class);  
  22.     termAtt = addAttribute(TermAttribute.class);  
  23.   }  
  24.    
  25.   public CharTokenizer(AttributeFactory factory, Reader input) {  
  26.     super(factory, input);  
  27.     offsetAtt = addAttribute(OffsetAttribute.class);  
  28.     termAtt = addAttribute(TermAttribute.class);  
  29.   }  
  30.    
  31.   private int offset = 0, bufferIndex = 0, dataLen = 0;  
  32.   private static final int MAX_WORD_LEN = 255;  
  33.   private static final int IO_BUFFER_SIZE = 4096;  
  34.   private final char[] ioBuffer = new char[IO_BUFFER_SIZE];  
  35.    
  36.   private TermAttribute termAtt;  
  37.   private OffsetAttribute offsetAtt;  
  38.    
  39.   protected abstract boolean isTokenChar(char c);  
  40. // 对字符进行处理,可以在CharTokenizer 的子类中实现  
  41.   protected char normalize(char c) {  
  42.     return c;  
  43.   }  
  44.    
  45.   @Override  
  46.   public final boolean incrementToken() throws IOException {  
  47.     clearAttributes();  
  48.     int length = 0;  
  49.     int start = bufferIndex;  
  50.     char[] buffer = termAtt.termBuffer();  
  51.     while (true) {  
  52.    
  53.       if (bufferIndex >= dataLen) {  
  54.         offset += dataLen;  
  55.         dataLen = input.read(ioBuffer);  
  56.         if (dataLen == -1) {  
  57.           dataLen = 0;                            // so next offset += dataLen won't decrement offset  
  58.           if (length > 0)  
  59.             break;  
  60.           else  
  61.             return false;  
  62.         }  
  63.         bufferIndex = 0;  
  64.       }  
  65.    
  66.       final char c = ioBuffer[bufferIndex++];  
  67.    
  68.       if (isTokenChar(c)) {               // if it's a token char  
  69.    
  70.         if (length == 0)                 // start of token  
  71.           start = offset + bufferIndex - 1;  
  72.         else if (length == buffer.length)  
  73.           buffer = termAtt.resizeTermBuffer(1+length);  
  74.    
  75.         buffer[length++] = normalize(c); // buffer it, normalized  
  76.    
  77.         if (length == MAX_WORD_LEN)      // buffer overflow!  
  78.           break;  
  79.    
  80.       } else if (length > 0)             // at non-Letter w/ chars  
  81.         break;                           // return 'em  
  82.     }  
  83.    
  84.     termAtt.setTermLength(length);  
  85.     offsetAtt.setOffset(correctOffset(start), correctOffset(start+length));  
  86.     return true;  
  87.   }  
  88.    
  89.   @Override  
  90.   public final void end() {  
  91.     // set final offset  
  92.     int finalOffset = correctOffset(offset);  
  93.     offsetAtt.setOffset(finalOffset, finalOffset);  
  94.   }  
  95.    
  96.   @Override  
  97.   public void reset(Reader input) throws IOException {  
  98.     super.reset(input);  
  99.     bufferIndex = 0;  
  100.     offset = 0;  
  101.     dataLen = 0;  
  102.   }  
  103. }  

 

实现 CharTokenizer 的具体类有 1 个,分别为: LetterTokenizer( 仅在核心包 ) 、

 

看看 LetterTokenizer 类:

 

 

[java] view plaincopy
 
  1. package org.apache.lucene.analysis;  
  2.    
  3. import java.io.Reader;  
  4.    
  5. // 只要读取到非字符的符号,就分词  
  6.    
  7. public class LetterTokenizer extends CharTokenizer {  
  8.    
  9. public LetterTokenizer(Reader in) {  
  10.     super(in);  
  11. }  
  12.    
  13.    
  14. protected boolean isTokenChar(char c) {  
  15.     return Character.isLetter(c);  
  16. }  
  17. }  
  18.    

 

做个测试就可以看到:

 

 

[java] view plaincopy
 
  1. package com.fpi.lucene.studying.test;  
  2.    
  3. import java.io.IOException;  
  4. import java.io.Reader;  
  5. import java.io.StringReader;  
  6.    
  7. import org.apache.lucene.analysis.CharTokenizer;  
  8. import org.apache.lucene.analysis.LetterTokenizer;  
  9. import org.apache.lucene.analysis.Tokenizer;  
  10. import org.apache.lucene.analysis.cjk.CJKTokenizer;  
  11. import org.apache.lucene.analysis.cn.ChineseTokenizer;  
  12.    
  13. public class JustTest {  
  14.        public static void main(String[] args) {  
  15.          Reader read = new StringReader("what are you doing,man?It's none of your business!");  
  16.        LetterTokenizer token5 = new LetterTokenizer(read);  
  17.        try {  
  18.                      while(token5.incrementToken()){  
  19.                              System.out.println(token5.toString());  
  20.                       }  
  21.               } catch (IOException e) {  
  22.                      // TODO Auto-generated catch block  
  23.                      e.printStackTrace();  
  24.               }  
  25.        }  
  26. }  

 

运行结果如下:

(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 lucene3.0 lucene3.0

    lucene 3.0 API 中文帮助文档 chm

    lucene 3.0 API中文帮助,学习的人懂得的

    Lucene3.0之查询类型详解

    【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...

    lucene3.0 分词器

    lucene3.0 中文分词器, 庖丁解牛

    Lucene 3.0 原理与代码分析完整版

    《Lucene 3.0 原理与代码分析完整版》是一本深入解析Lucene 3.0搜索引擎库的专业书籍。Lucene是Apache软件基金会的开源项目,它为Java开发者提供了一个高性能、全文检索的工具包,广泛应用于各种信息检索系统。这...

    lucene3.0核心jar包

    这里的"lucene3.0核心jar包"是 Lucene 的一个重要版本,发布于2009年,为当时的开发人员提供了构建全文搜索引擎的基础框架。 在 Lucene 3.0 中,以下几个关键知识点值得关注: 1. **索引结构**:Lucene 使用倒排...

    Lucene3.0特性,Lucene3.0特性

    ### Lucene 3.0 特性详析 #### 概述 Lucene 3.0,于2009年11月25日正式发布,标志着Lucene发展历程中的一个重大里程碑。相较于之前的版本,3.0进行了大幅度的革新与升级,不仅在API层面进行了诸多调整,还全面拥抱...

    Lucene3.0全文信息检索

    **Lucene 3.0 全文信息检索** Lucene 是一个由Apache软件基金会4 Jakarta项目组开发的开源全文检索引擎工具包。自1999年发布以来,Lucene 已经发展成为Java世界中最为广泛使用的全文检索库,为开发者提供了构建高...

    lucene3.0资料包

    这里我们主要聚焦于`lucene3.0`版本,该版本在当时是Lucene的一个重要里程碑,引入了许多改进和新特性。 1. **索引构建**: 在Lucene3.0中,索引是数据检索的基础。它通过将文本数据转换为倒排索引来实现快速查询...

    lucene3.0 实例

    在 Lucene 3.0 版本中,虽然已经相对较旧,但仍然包含了基本的搜索引擎功能,适用于简单或特定场景的搜索需求。在这个实例中,我们将探讨如何在 JDK 1.5 和 Lucene 3.0 的环境下构建和运行一个简单的搜索引擎。 ...

    lucene3.0庖丁+索引搜索程序

    《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene3.0版本,结合“庖丁解...

    lucene3.0使用介绍及实例

    在本文中,我们将深入探讨Lucene 3.0版本,了解其核心概念、功能特性,并通过实例来展示如何使用这个强大的工具。 ### 1. Lucene 3.0核心概念 #### 1.1 文档与字段 在Lucene中,数据是以文档(Document)的形式...

    lucene3.0-highlighter.jar

    lucene3.0-highlighter.jar lucene3.0的高亮jar包,从lucene3.0源码中导出来的

    lucene3.0全文检索入门实例

    **Lucene 3.0 全文检索入门实例** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。它提供了一个高级、灵活的搜索功能框架,允许开发者在自己的应用中轻松地集成全文检索功能。本文将重点介绍如何使用 ...

    与lucene3.0兼容的庖丁jar包

    lucene升级了,分词也得升级哦! 在使用lucene3与paoding集成的时候可能会出现以下错误: Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z ...

    Lucene3.0分词系统.doc

    Lucene3.0分词系统的核心在于理解和应用其分词原理,无论是对于英文还是中文文本,这一过程都是构建高效搜索引擎的基础。以下是对Lucene3.0分词系统中涉及的关键知识点的深入解析。 ### 英文分词原理 英文分词相较...

    lucene 2.0 api以及lucene 3.0 api

    **Lucene 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...

    lucene 3.0 入门实例

    **Lucene 3.0 入门实例** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询解析、排序以及高级的文本分析能力。在 Lucene 3.0 版本中,开发者可以利用其强大...

Global site tag (gtag.js) - Google Analytics