【发布时间】:2014-07-18 19:06:18
【问题描述】:
我有几个像这样的自定义分析器:
private static class ModelAnalyzer extends Analyzer
{
@Override
protected TokenStreamComponents createComponents(String string, Reader reader)
{
return new TokenStreamComponents(
new StandardTokenizer(Version.LUCENE_4_9, reader),
new LowerCaseFilter(Version.LUCENE_4_9,
new NGramTokenFilter(Version.LUCENE_4_9,
new CharTokenizer(Version.LUCENE_4_9, reader)
{
@Override
protected boolean isTokenChar(int c)
{
return Character.isLetterOrDigit(c);
}
}, 3, 20)));
}
}
它们被添加到 PerFieldAnalyzerWrapper 并添加到我的 IndexWriterConfig。当我尝试重建索引时,将第二个文档添加到索引时总是出现错误:
java.lang.IllegalStateException: TokenStream contract violation: reset()/close() call missing, reset() called multiple times, or subclass does not call super.reset(). Please see Javadocs of TokenStream class for more information about the correct consuming workflow.
我所做的只是将文档添加到我的 IndexWriter。我没有以任何方式接触这些过滤器或标记器,因此我没有干净的方法可以在它们上调用 reset()。没有我的帮助,IndexWriter 不应该遵循“正确的消费工作流程”吗?
在网上阅读了 8 小时后,我放弃了,只是将 Version.LUCENE_4_5 传递给我的每个标记器和过滤器,以便不运行烦人的状态机检查(我理解是在 4_6 中添加的)。这已经解决了这个问题,但我不知道使用 4.9 进行这项工作的正确方法。我不得不假设我的分析器出错了或其他什么,但我看不出我可以如何做不同的事情,而且它在早期版本中工作得很好。
【问题讨论】: