Lucene 4.0中ReuseStrategy修改问题:自定义分析器无法更改策略
解决基于StopWordAnalyzerBase自定义分析器修改ReuseStrategy的问题
- 既然StopWordAnalyzerBase没开放修改ReuseStrategy的接口,直接继承它并覆盖
getReuseStrategy()方法就行,这是最直接的解决方式。 - Lucene 3.0里的ReuseStrategy逻辑是每个线程单独维护一个TokenStreamComponents实例,对应的就是
PerThreadReuseStrategy(要是不确定版本对应关系,翻下Lucene 3.0的源码确认即可,大概率就是这个实现)。 - 给你个代码示例参考:
public class CustomStopAnalyzer extends StopWordAnalyzerBase { private final ReuseStrategy reuseStrategy; public CustomStopAnalyzer(Version matchVersion, Set<?> stopWords) { super(matchVersion, stopWords); // 初始化对应Lucene3.0的复用策略 this.reuseStrategy = new PerThreadReuseStrategy(); } @Override protected ReuseStrategy getReuseStrategy() { return this.reuseStrategy; } // 重写createComponents实现你的自定义分析逻辑 @Override protected TokenStreamComponents createComponents(String fieldName, Reader reader) { Tokenizer source = new StandardTokenizer(matchVersion, reader); TokenStream filter = new StandardFilter(matchVersion, source); filter = new LowerCaseFilter(matchVersion, filter); filter = new StopFilter(matchVersion, filter, stopWords); return new TokenStreamComponents(source, filter); } }
- 额外注意:一定要传入Lucene 3.0对应的Version常量,不然版本兼容问题会导致行为不对齐。要是发现PerThreadReuseStrategy和3.0的逻辑有出入,直接去翻3.0的Analyzer源码,把当时的ReuseStrategy实现抄过来用也可以。
内容的提问来源于stack exchange,提问作者WalterFox
相关产品推荐
相关产品推荐

