lucene TokenStream类学习

TokenStream抽象类

TokenStream主要包含以下几个方法:

 

boolean incrementToken()用于得到下一个Token。

public void reset() 使得此TokenStrean可以重新开始返回各个分词。 

和原来的TokenStream返回一个Token对象不同,Lucene 3.0的TokenStream已经不返回Token对象了,那么如何保存下一个Token的信息呢。

 

在Lucene 3.0中,TokenStream是继承于AttributeSource,其包含Map,保存从class到对象的映射,从而可以保存不同类型的对象的值。

 

在TokenStream中,经常用到的对象是TermAttributeImpl,用来保存Token字符串;PositionIncrementAttributeImpl用来保存位置信息;OffsetAttributeImpl用来保存偏移量信息。

 

所以当生成TokenStream的时候,往往调用AttributeImpl tokenAtt = (AttributeImpl) addAttribute(TermAttribute.class)将TermAttributeImpl添加到Map中,并保存一个成员变量。

 

在incrementToken()中,将下一个Token的信息写入当前的tokenAtt,然后使用TermAttributeImpl.term()得到Token的字符串。

 

TokenStream有两个不同的子类:Tokenizer 和 TokenFilter。

Tokenizer : 用于处理单个字符(原始数据流),将Reader对象中的数据切分成语汇单元。

TokenFilter : 用于处理单词,允许多个TokenStream对象连在一起,这个强大机制使其成为名副其实的流过滤器。一个TokenStream对象传递到TokenFilter中,并在传递过程中,由于过滤器对其进行添加、删除、或更改操作等。

 

分词功能

将文档分成一个一个单词,去除标点符号,去除停止词(一些修饰词,例如and ,to,for等等),去除过滤词,经过分词处理后即得到token。

lucene自带的分词机制

StopAnalyzer分词:利用空格和各种符号进行单词切分,同时会去除停止词。停止词包括 is,are,in,on,the等无实际意义的词。

StandardAnalyzer分词:混合切分,包括去除停止词,并且可以支持中文,对于中文支持的效果很差。

WhitespaceAnalyzer分词:利用空格进行单词切分。

SimpleAnalyzer分词:利用空格以及各种符号进行单词切分。

KeyWordAnalyzer分词:主要用于处理类似身份证,邮编,产品编码,订单编码等关键信息。

 

 

 

 StopAnalyzer,StandardAnalyze,WhitespaceAnalyzer,SimpleAnalyzer,KeyWordAnalyzer都继承自父类Analyzer。

因此只要实现父类的虚方法tokenStream 就可以实现分析。

分词的切分算法由继承自父类Tokenizer的方法

public final boolean incrementToken() throws IOException 来实现。

因此自定义继承类Tokenizer并实现其incrementToken算法就可以实现自定义的分词

猜你喜欢

转载自hbiao68.iteye.com/blog/2113904