一 分清概念:
1 TokenStream是用来走访Token的iterator(迭代器) ,
Tokenizer继承自TokenStream,其输入为Reader 。
TokenFilter继承自TokenStream,其作用是用来完成对TokenStream的过滤操作,譬如 去StopWords,将Token变为小写等。
TokenStream:分词流,即将对象分词后所得的Token在内存中以流的方式存在,也说是说如果在取得Token必须从TokenStream中获取,而分词对象可以是文档文本,也可以是查询文本。
2 Token:如果一个字段被token化,这表示它经过了一个可将内容转化为tokens串的分析程序。 Token是建立索引的基本单位,表示每个被编入索引的字符。 在token化的过程中,分析程序会在使用任何转换逻辑(例如去掉 "a” 或 "the" 这类停用词,执行词干搜寻,将无大小写区分的所有文字转换成小写等)的同时,抽取应被编入索引的文本内容。由于和字段相关的内容减少到只剩核心元素,因此,索引作为与某个字段相关的文字内容,它的规模也被缩小了。只有被token化的字段也将被编入索引的情况下才有意义。
3 Analyzer就是一个TokenStream工厂 ,如下为其源码:
public abstract class Analyzer {
public TokenStream tokenStream(String fieldName, Reader reader){
return tokenStream(reader);
}
public TokenStream tokenStream(Reader reader){
return tokenStream(null, reader);
}
}
二 具体细节
1.1 分词流程
在Lucene3.0中,对分词主要依靠Analyzer类解析实现。Analyzer内部主要通过TokenStream类实现。Tonkenizer类、TokenFilter类是TokenStream的两个子类。Tokenizer处理单个字符组成的字符流,读取Reader对象中的数据,处理后转换成词汇单元。TokneFilter完成文本过滤器的功能,但在使用过程中必须注意不同的过滤器的使用的顺序。
1.2 分词扩展具体流程
1.2.1 Analyzer类分析
(1)所有的分词器都需要继承于Analyzer抽象类,它定义了tokenStream抽象方法。
public abstract class Analyzer {
public abstract TokenStream tokenStream(String fieldName, Reader reader);
public TokenStream reusableTokenStream(String fieldName, Reader reader){}
}
该抽象类规定了Analyzer需要实现的一些方法。
(2)public abstract TokenStream tokenStream(String fieldName, Reader reader);
该方法需要自定义的分词器去实现,并返回TokenStream,即将对象以Reader的方式输入分词为f