如何扩展Lucene的StandardAnalyzer以进行自定义特殊字符处理?

时间:2017-02-02 15:01:02

标签: java lucene

我正在使用Lucene的StandardAnalyzer来获取特定的索引属性。 由于像àéèäöü这样的特殊字符没有按预期编制索引,我想替换这些字符:

  • à - >一个
  • é - > ë
  • è - > ë
  • ä - > AE
  • ö - > OE
  • ü - > UE

扩展org.apache.lucene.analysis.standard.StandardAnalyzer类的最佳方法是什么?

我一直在寻找标准解析器迭代所有标记(单词)的方法,我可以逐字检索并在那里做魔术。

感谢任何提示。

2 个答案:

答案 0 :(得分:3)

我建议使用MappingCharFilter,这将允许有一个将被字符串替换的字符串映射,因此它将完全符合您的要求。

其他一些信息 - https://lucene.apache.org/core/6_0_0/analyzers-common/org/apache/lucene/analysis/charfilter/MappingCharFilter.html

答案 1 :(得分:0)

您不会扩展 StandardAnalyzer,因为分析器实现是最终的。分析器实现的核心是createComponents方法,无论如何你都必须覆盖它,所以无论如何你都不会得到太大的扩展。

相反,您可以复制StandardAnalyzer源,并修改createComponents方法。对于您要求的内容,我建议添加org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory,它将尝试将UTF字符(例如重音字母)转换为ASCII等效字符。所以你可以创建一个像这样的分析器:

Analyzer analyzer = new Analyzer() {
  @Override
  protected TokenStreamComponents createComponents(final String fieldName) {
    final StandardTokenizer src = new StandardTokenizer();
    src.setMaxTokenLength(maxTokenLength);
    TokenStream tok = new StandardFilter(src);
    tok = new LowerCaseFilter(tok);
    tok = new ASCIIFoldingFilter(tok); /*Adding it before the StopFilter would probably be most helpful.*/
    tok = new StopFilter(tok, StandardAnalyzer.ENGLISH_STOP_WORDS_SET);
    return new TokenStreamComponents(src, tok) {
      @Override
      protected void setReader(final Reader reader) {
        src.setMaxTokenLength(StandardAnalyzer.DEFAULT_MAX_TOKEN_LENGTH);
        super.setReader(reader);
      }
    };
  }

  @Override
  protected TokenStream normalize(String fieldName, TokenStream in) {
    TokenStream result = new StandardFilter(in);
    result = new LowerCaseFilter(result);
    tok = new ASCIIFoldingFilter(tok);
    return result;
  }
}