ComboAnalyzer - 在 AttributeSource 中找不到 AttributeImpl

ComboAnalyzer - AttributeImpl not found in AttributeSource

基于 OpenNLPTokenizer 的分析器 OpenNLPAnalyzerthis 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.