Analyizer是用来分析文本的核心抽象类。它的返回是TokenStream,用来遍历所有的Token。该类的抽象核心方法是
TokenStream tokenStream(String field,Reader reader){
1.利用依赖的Tokenizer对象获得最初的TokenStream。
2.利用TokenFilter层层过滤初始TokenStream并返回。
}
Lucene封装了几个Analyzer实现类。当然用户可以根据自己的应用程序去定制Analyzer。Lucene内置的几个现成的类中,最有用的是StantAnalyzer和StopAnalyzer。其它的几个象WhiteSpaceAnalyzer以及SimpleAnalyzer都是用来单元测试的。没有实际的使用价值。
自定义的场景比如自己根据应用提供了停用词集合。而不是默认的StopFilter包含的那些this, that,at等停用词。
TokenFilter的顺序还是比较重要的
1.顺序错误,影响的结果一个是Filter可能不起使用了。
LowerCaseToTokenizer=LowerCaseFilter+ LetterTokenizer , 前者效率更高,在分词的时候就做了小写转换。
StopFilter->LowerCaseFilter->LetterTokenizer 对于字符串" The day come" 过滤的结果是day come
而LowerCaseFilter->StopFilter->LetterTokenizer 的结果是the day come。注意到the变成了小写返回,并没有过滤,原因就是Filter的顺序打乱后,StopFilter由于是大小写敏感,所以无法过滤The导致。
2.顺序另一个影响是性能。
比如StopFilter+同义词写入与同义词写入+StopFilter的性能是完全不同的。先通过StopFilter做一些减法会让TokenStream的集合变小。更利于同义词写入。