我正在使用Lucene的StandardAnalyzer来获取特定的索引属性。
由于像àéèäöü
这样的特殊字符没有按预期编制索引,我想替换这些字符:
扩展org.apache.lucene.analysis.standard.StandardAnalyzer
类的最佳方法是什么?
我一直在寻找标准解析器迭代所有标记(单词)的方法,我可以逐字检索并在那里做魔术。
感谢任何提示。
答案 0 :(得分:3)
我建议使用MappingCharFilter
,这将允许有一个将被字符串替换的字符串映射,因此它将完全符合您的要求。
答案 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;
}
}