Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何扩展Lucene';s StandardAnalyzer用于定制特殊字符处理?_Java_Lucene - Fatal编程技术网

Java 如何扩展Lucene';s StandardAnalyzer用于定制特殊字符处理?

Java 如何扩展Lucene';s StandardAnalyzer用于定制特殊字符处理?,java,lucene,Java,Lucene,我正在使用Lucene的StandardAnalyzer处理特定的索引属性。 由于像这样的特殊字符没有按预期编制索引,我想替换这些字符: a->a é->e è->e ä->ae ö->oe ü->ue 扩展org.apache.lucene.analysis.standard.StandardAnalyzer类的最佳方法是什么 我一直在寻找一种方法,标准解析器迭代所有标记(单词),我可以逐字检索,并在那里发挥神奇的作用 谢谢您的提示。我建议使用MappingCharFilter,它将允许使

我正在使用Lucene的StandardAnalyzer处理特定的索引属性。 由于像
这样的特殊字符没有按预期编制索引,我想替换这些字符:

  • a->a
  • é->e
  • è->e
  • ä->ae
  • ö->oe
  • ü->ue
扩展
org.apache.lucene.analysis.standard.StandardAnalyzer
类的最佳方法是什么

我一直在寻找一种方法,标准解析器迭代所有标记(单词),我可以逐字检索,并在那里发挥神奇的作用


谢谢您的提示。

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

一些附加信息-

您不会扩展
StandardAnalyzer
,因为analyzer的实现是最终的。analyzer实现的核心是
createComponents
方法,您无论如何都必须重写该方法,因此无论如何扩展它都不会有什么好处

相反,您可以复制StandardAnalyzer源代码,并修改
createComponents
方法。对于您所要求的,我建议添加,它将尝试将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;
  }
}

如果您展示了您从
StandardAnalyzer
调用的所有方法,那么将更容易为您提供帮助。(仅供参考,由于课程是最终课程,因此您无法扩展它)。这就是说,它看起来像是
StandardAnalyzer
有一个构造函数,它接受
读取器
。您可能会利用这一点,并将其传递给自定义阅读器?