我尝试在自定义分析器中的TokenStream上应用多个过滤器。以下是代码:
public class CustomizeAnalyzer extends Analyzer {
//code omitted
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer source = new LetterTokenizer(Version.LUCENE_44, reader);
TokenStream filter = new LowerCaseFilter(Version.LUCENE_44, source);
filter = new StopFilter(Version.LUCENE_44, filter, stopWords);
return new TokenStreamComponents(source, new PorterStemFilter(source));
}
}
然而,LowerCaseFilter不会被使用。我按照文档here进行操作。 有人可以解释一下如何让它发挥作用吗?
非常感谢,
答案 0 :(得分:6)
你的问题在最后一行。您创建了一个过滤器链,然后通过返回new PorterStemFilter(source)
(它是直接位于标记器上的干式过滤器)而不是链中较早的过滤器,在return语句中将其短路。这应该是:
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer source = new LetterTokenizer(Version.LUCENE_44, reader);
TokenStream filter = new LowerCaseFilter(Version.LUCENE_44, source);
filter = new StopFilter(Version.LUCENE_44, filter, stopWords);
filter = new PorterStemFilter(filter);
return new TokenStreamComponents(source, filter);
}