Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数,而TokenFilter则是一个类似的拦截器,其参数可以是TokenStream、Tokenizer。
TokenFilter的类结构图:
TokenFilter各类介绍:
1.TokenFilter
输入参数为另一个TokerStream的TokerStream,其子类必须覆盖incrementToken()函数。
2.LowerCaseFilter
将Token分词转换为小写。
3.FilteringTokenFilter
TokenFilters的一个抽象类,可能会删除分词。如果当前分词要保存,则需要实现accept()方法
并返回一个boolean值。incrementToken()方法将调用accept()方法来决定是否将当前的分词返回
给调用者。
4.StopFilter
从token stream中移除停止词(stop words).
protected boolean accept() {
return !stopWords.contains(termAtt.buffer(), 0, termAtt.length());//返回不是stop word的分词
}
5.TypeTokenFilter
从token stream中移除指定类型的分词。
protected boolean accept() {
return useWhiteList == stopTypes.contains(typeAttribute.type());
}
StopAnalyzer测试实例:
public class StopAnalyzerTest {
public static void main(String[] args) {
String content="No news is good news!";
try {
StopAnalyzer analyzer=new StopAnalyzer(Version.LUCENE_43);
TokenStream tokenStream=analyzer.tokenStream("", new StringReader(content));
tokenStream.reset();
while (tokenStream.incrementToken()) {
CharTermAttribute attribute=tokenStream.getAttribute(CharTermAttribute.class);
System.out.println(attribute.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28624388/viewspace-765894/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28624388/viewspace-765894/