我正在使用Apache Lucene 6.3,我需要扩展Analyzer类。在旧版本中,两个参数传递给createComponent方法,第一个参数表示调用分析器的字段名称,第二个参数表示包含主输入文本的阅读器。
Analyzer analyzer = new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer source = new FooTokenizer(reader);
TokenStream filter = new FooFilter(source);
filter = new BarFilter(filter);
return new TokenStreamComponents(source, filter);
}
};
但是在较新版本中,只有字段名称作为函数参数。
Analyzer analyzer = new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer source = new FooTokenizer(reader);
TokenStream filter = new FooFilter(source);
filter = new BarFilter(filter);
return new TokenStreamComponents(source, filter);
}
@Override
protected TokenStream normalize(TokenStream in) {
// Assuming FooFilter is about normalization and BarFilter is about
// stemming, only FooFilter should be applied
return new FooFilter(in);
}
};
我的问题是如何在analyzer.tokenStream(fieldName,reader)
函数的输入中访问阅读器以分析输入文本。
答案 0 :(得分:1)
您没有以createComponents
方式访问阅读器。在我看来,你发现了一个文档错误。 createComponents
设置分析链,为TokenStreamComponents.setReader
提供的输入做准备。通常,Tokenizers不再将Readers作为构造函数参数。
我相信这个例子中的tokenizer不应该有这个参数,应该是:
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer source = new FooTokenizer();
TokenStream filter = new FooFilter(source);
filter = new BarFilter(filter);
return new TokenStreamComponents(source, filter);
}