Java 如何扩展Lucene';s StandardAnalyzer用于定制特殊字符处理?
我正在使用Lucene的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,它将允许使
这样的特殊字符没有按预期编制索引,我想替换这些字符:
- 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
有一个构造函数,它接受读取器
。您可能会利用这一点,并将其传递给自定义阅读器?