ComboAnalyzer - 在 AttributeSource 中找不到 AttributeImpl
ComboAnalyzer - AttributeImpl not found in AttributeSource
基于 OpenNLPTokenizer
的分析器 OpenNLPAnalyzer
在 this blog post 中 Lucene 附带的 opennlp 包中按承诺工作。我现在正尝试通过以下方式在 ComboAnalyzer
(ES 插件的一部分以组合多个分析器;参见下面的 link)中使用它:
ComboAnalyzer analyzer = new ComboAnalyzer(new EnglishAnalyzer(), new OpenNLPAnalyzer());
TokenStream stream = analyzer.tokenStream("fieldname", new StringReader(text));
stream
是一个 ComboTokenStream
。在调用 stream.incrementToken()
时,我在 line 105 here 处得到以下异常:
Exception in thread "main": State contains AttributeImpl of type org.apache.lucene.analysis.tokenattributes.OffsetAttributeImpl that is not in in this AttributeSource
Here 是调用方法 restoreState
所做的。
public final void restoreState(State state) {
if (state == null) return;
do {
AttributeImpl targetImpl = attributeImpls.get(state.attribute.getClass());
if (targetImpl == null) {
throw new IllegalArgumentException("State contains AttributeImpl of type " +
state.attribute.getClass().getName() + " that is not in in this AttributeSource");
}
state.attribute.copyTo(targetImpl);
state = state.next;
} while (state != null);
}
这暗示 TokenStream
之一有一个 OffsetAttribute
但另一个没有。有没有一种干净的方法来解决这个问题?
我试图在同一文件 here 中添加行 addAttribute(OffsetAttribute.class)
。我仍然遇到同样的异常。
问题出在这里:
Tokenizer source = new OpenNLPTokenizer(
AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY, sentenceDetectorOp, tokenizerOp);
解决方法是传入 TokenStream.DEFAULT_TOKEN_ATTRIBUTE_FACTORY
而不是 AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY
。前者使用 PackedTokenAttributeImpl
来实现 OffsetAttribute
(以及许多其他属性),后者选择 OffsetAttributeImpl
.
基于 OpenNLPTokenizer
的分析器 OpenNLPAnalyzer
在 this blog post 中 Lucene 附带的 opennlp 包中按承诺工作。我现在正尝试通过以下方式在 ComboAnalyzer
(ES 插件的一部分以组合多个分析器;参见下面的 link)中使用它:
ComboAnalyzer analyzer = new ComboAnalyzer(new EnglishAnalyzer(), new OpenNLPAnalyzer());
TokenStream stream = analyzer.tokenStream("fieldname", new StringReader(text));
stream
是一个 ComboTokenStream
。在调用 stream.incrementToken()
时,我在 line 105 here 处得到以下异常:
Exception in thread "main": State contains AttributeImpl of type org.apache.lucene.analysis.tokenattributes.OffsetAttributeImpl that is not in in this AttributeSource
Here 是调用方法 restoreState
所做的。
public final void restoreState(State state) {
if (state == null) return;
do {
AttributeImpl targetImpl = attributeImpls.get(state.attribute.getClass());
if (targetImpl == null) {
throw new IllegalArgumentException("State contains AttributeImpl of type " +
state.attribute.getClass().getName() + " that is not in in this AttributeSource");
}
state.attribute.copyTo(targetImpl);
state = state.next;
} while (state != null);
}
这暗示 TokenStream
之一有一个 OffsetAttribute
但另一个没有。有没有一种干净的方法来解决这个问题?
我试图在同一文件 here 中添加行 addAttribute(OffsetAttribute.class)
。我仍然遇到同样的异常。
问题出在这里:
Tokenizer source = new OpenNLPTokenizer(
AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY, sentenceDetectorOp, tokenizerOp);
解决方法是传入 TokenStream.DEFAULT_TOKEN_ATTRIBUTE_FACTORY
而不是 AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY
。前者使用 PackedTokenAttributeImpl
来实现 OffsetAttribute
(以及许多其他属性),后者选择 OffsetAttributeImpl
.