我在 Lucene 中有特殊的分析需求,但我想继续使用 StandardAnalyzer 机制的部分内容。
特别是,我想要字符串
“ - 苹果 - 胡萝卜 - 西红柿?”
要标记为:
(用 - 包围的字符串被视为单独的标记)
为了达到这个目的,我必须自定义分析器和标记器。但我是否必须从头开始重写它?例如,我不想告诉tokenizer(或令牌过滤器)它应该省略“apple?”中的问号。
有没有办法只修改现有的分析仪?
答案 0 :(得分:3)
基本上,您无法扩展StandardAnalyzer,因为它是最终类。但你可以用自己的标记器做同样的技巧,而且很简单。你也无法改变现有的,因为这是一个坏主意。
我可以想象这样的事情:
public class CustomAnalyzer extends Analyzer {
protected TokenStreamComponents createComponents(String s) {
// provide your own tokenizer, that will split input string as you want it
final Tokenizer standardTokenizer = new MyStandardTokenizer();
TokenStream tok = new StandardFilter(standardTokenizer);
// make everything lowercase, remove if not needed
tok = new LowerCaseFilter(tok);
//provide stopwords if you want them
tok = new StopFilter(tok, stopwords);
return new TokenStreamComponents(standardTokenizer, tok);
}
private class MyStandardTokenizer extends Tokenizer {
public boolean incrementToken() throws IOException {
//mimic the logic of standard analyzer and add your rules
return false;
}
}
}
我将所有内容都放在一个课程中,只是为了便于在此发布。一般来说,你需要在 MyStandardTokenizer 中使用自己的逻辑(例如,你可以从 StandardAnalyzer 复制代码(它是最终的,所以不再延伸),然后在 incrementToken < / strong>用破折号为你的逻辑添加所需的东西。希望它能帮到你。