在Apache Lucene 6.3中覆盖Analyzer类的方法时,如何访问在tokenStream方法中传入的阅读器

时间:2016-12-15 20:04:20

标签: java apache lucene analyzer

我正在使用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)函数的输入中访问阅读器以分析输入文本。

1 个答案:

答案 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);
 }