在 Apache Lucene 6.3 中覆盖 Analyzer class 的方法时如何访问在 tokenStream 方法中传递的 reader

How to access the reader passed in the tokenStream method when overriding the methods of an Analyzer class in Apache Lucene 6.3

我正在使用 Apache Lucene 6.3,我需要扩展一个分析器 class。在旧版本中,将两个参数传递给 createComponent 方法,第一个参数表示调用分析器的字段名称,第二个参数表示包含主要输入文本的 reader。

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)函数输入中的reader来分析输入文本。

不要访问createComponents方法中的reader。在我看来,您发现了一个文档错误。 createComponents 设置分析链,为 TokenStreamComponents.setReader 提供的输入做准备。通常,Tokenizers 不再将 Readers 作为构造函数参数。

我相信这个例子中的分词器不应该有那个参数,应该是:

@Override
 protected TokenStreamComponents createComponents(String fieldName) {
   Tokenizer source = new FooTokenizer();
   TokenStream filter = new FooFilter(source);
   filter = new BarFilter(filter);
   return new TokenStreamComponents(source, filter);
 }