Lucene 带词干的标准分析器

Lucene 带词干的标准分析器,lucene,stemming,porter-stemmer,Lucene,Stemming,Porter Stemmer,有没有办法将PorterStemFilter集成到Lucene中的StandardAnalyzer中,或者我必须复制/粘贴StandardAnalyzer源代码并添加过滤器,因为StandardAnalyzer被定义为最终类。有没有更聪明的办法 也是,如果我不想考虑数字,我怎么才能做到呢? 谢谢如果您想将此组合用于英语文本分析,那么您应该使用Lucene的英语分析工具。否则,您可以创建一个新的分析器,扩展分析器包装器,如下所示 import java.io.IOException; import

有没有办法将
PorterStemFilter
集成到Lucene中的
StandardAnalyzer
中,或者我必须复制/粘贴
StandardAnalyzer
源代码并添加过滤器,因为
StandardAnalyzer
被定义为最终类。有没有更聪明的办法

也是,如果我不想考虑数字,我怎么才能做到呢?


谢谢

如果您想将此组合用于英语文本分析,那么您应该使用Lucene的
英语分析工具
。否则,您可以创建一个新的
分析器
,扩展
分析器包装器
,如下所示

import java.io.IOException;
import java.io.StringReader;
import java.util.HashSet;
import java.util.Set;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.AnalyzerWrapper;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.TypeTokenFilter;
import org.apache.lucene.analysis.en.PorterStemFilter;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;


public class PorterAnalyzer extends AnalyzerWrapper {

  private Analyzer baseAnalyzer;

  public PorterAnalyzer(Analyzer baseAnalyzer) {
      this.baseAnalyzer = baseAnalyzer;
  }

  @Override
  public void close() {
      baseAnalyzer.close();
      super.close();
  }

  @Override
  protected Analyzer getWrappedAnalyzer(String fieldName)
  {
      return baseAnalyzer;
  }

  @Override
  protected TokenStreamComponents wrapComponents(String fieldName, TokenStreamComponents components)
  {
      TokenStream ts = components.getTokenStream();
      Set<String> filteredTypes = new HashSet<>();
      filteredTypes.add("<NUM>");
      TypeTokenFilter numberFilter = new TypeTokenFilter(Version.LUCENE_46,ts, filteredTypes);

      PorterStemFilter porterStem = new PorterStemFilter(numberFilter);
      return new TokenStreamComponents(components.getTokenizer(), porterStem);
  }

  public static void main(String[] args) throws IOException
  {

      //Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);
      PorterAnalyzer analyzer = new PorterAnalyzer(new StandardAnalyzer(Version.LUCENE_46));
      String text = "This is a testing example. It should tests the Porter stemmer version 111";

      TokenStream ts = analyzer.tokenStream("fieldName", new StringReader(text));
      ts.reset();

      while (ts.incrementToken()){
          CharTermAttribute ca = ts.getAttribute(CharTermAttribute.class);

          System.out.println(ca.toString());
      }
      analyzer.close();
  }

}
import java.io.IOException;
导入java.io.StringReader;
导入java.util.HashSet;
导入java.util.Set;
导入org.apache.lucene.analysis.Analyzer;
导入org.apache.lucene.analysis.AnalyzerWrapper;
导入org.apache.lucene.analysis.TokenStream;
导入org.apache.lucene.analysis.core.TypeTokenFilter;
导入org.apache.lucene.analysis.en.PorterStemFilter;
导入org.apache.lucene.analysis.standard.StandardAnalyzer;
导入org.apache.lucene.analysis.tokenattributes.CharterMatAttribute;
导入org.apache.lucene.util.Version;
公共类PorterAnalyzer扩展AnalyzerWrapper{
专用分析仪;
公共波特兰分析仪(Analyzer baseAnalyzer){
this.baseAnalyzer=baseAnalyzer;
}
@凌驾
公众假期结束(){
baseAnalyzer.close();
super.close();
}
@凌驾
受保护的分析器getWrappedAnalyzer(字符串字段名)
{
回程基线分析仪;
}
@凌驾
受保护的TokenStreamComponents wrapComponents(字符串字段名、TokenStreamComponents)
{
TokenStream ts=components.getTokenStream();
Set filteredTypes=new HashSet();
filteredTypes.add(“”);
TypeTokenFilter numberFilter=新的TypeTokenFilter(Version.LUCENE_46,ts,filteredTypes);
PorterStemFilter porterStem=新PorterStemFilter(numberFilter);
返回新的TokenStreamComponents(components.getTokenizer(),porterStem);
}
公共静态void main(字符串[]args)引发IOException
{
//Analyzer Analyzer=新标准分析仪(版本:LUCENE_46);
波特兰分析仪=新波特兰分析仪(新标准分析仪(LUCENE_46版));
String text=“这是一个测试示例。它应该测试Porter stemmer版本111”;
TokenStream ts=analyzer.TokenStream(“字段名”,新的StringReader(文本));
ts.reset();
while(ts.incrementToken()){
CharterMattAttribute ca=ts.getAttribute(charterMattAttribute.class);
System.out.println(ca.toString());
}
analyzer.close();
}
}
上面的代码基于此。主要工作是通过wrapComponents方法实现的。首先从包装的分析器中获取TokenStream对象,然后应用类型过滤器忽略数字标记。最后,应用波特词干分析器过滤器。我希望这是清楚的