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

最佳答案

您不使用createComponents方法访问阅读器。在我看来,您已经找到一个文档错误。 createComponents设置分析链,以准备TokenStreamComponents.setReader提供的输入。通常,分词器不再将Reader作为构造器参数。

我相信此示例中的令牌生成器不应具有该参数,而应为:

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

10-06 05:29
查看更多