2013-10-08 68 views
0

我试图在我的自定义分析器上应用TokenStream上的多个过滤器。以下是代码:如何在Lucene分析器上使用多个过滤器(Lucene 4.4)

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。 有人可以请解释我如何使其工作?

非常感谢,

回答

6

您的问题是在最后一行。您创建一个过滤器链,然后通过传回new PorterStemFilter(source)(这是一个直接位于标记器上的干过滤器)而不是链中较早的过滤器来将其短路回去。这应该是:

@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); 
} 
+0

这是一个很好的结果。我不敢相信我犯了这个错误:(我想我现在需要休息一下,非常感谢你,femtoRgon。 – chepukha