Lucene parse导致令牌流契约冲突

Lucene parse导致令牌流契约冲突,lucene,Lucene,我继承了一个使用Lucene 4.4.0的项目,我正在尝试将其更新为使用Lucene 4.6.1 当调用我的类的parse方法时,它调用Lucene的org.apache.Lucene.queryparser.classic.queryparser上的parse。我的班级看起来有点像这样: public class SomeClass { String field; Analyzer analyzer; // omitted for brevity... p

我继承了一个使用Lucene 4.4.0的项目,我正在尝试将其更新为使用Lucene 4.6.1

当调用我的类的
parse
方法时,它调用Lucene的
org.apache.Lucene.queryparser.classic.queryparser
上的parse。我的班级看起来有点像这样:

public class SomeClass {

    String field;
    Analyzer analyzer;

    // omitted for brevity...

    public Query parse(String query) throws ParseException {
        QueryParserBase parser = new QueryParser(Version.LUCENE_46, field, analyzer);
        parser.parse(query);
    }
}
java.lang.IllegalStateException: TokenStream contract violation: close() call missing
    at org.apache.lucene.analysis.Tokenizer.setReader(Tokenizer.java:89)
    at org.apache.lucene.analysis.Analyzer$TokenStreamComponents.setReader(Analyzer.java:307)
    at org.apache.lucene.analysis.standard.StandardAnalyzer$1.setReader(StandardAnalyzer.java:120)
    at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:183)
    at org.apache.lucene.util.QueryBuilder.createFieldQuery(QueryBuilder.java:207)
    at org.apache.lucene.queryparser.classic.QueryParserBase.newFieldQuery(QueryParserBase.java:470)
    at org.apache.lucene.queryparser.classic.QueryParserBase.getFieldQuery(QueryParserBase.java:462)
    at org.apache.lucene.queryparser.classic.QueryParserBase.handleBareTokenQuery(QueryParserBase.java:842)
    at org.apache.lucene.queryparser.classic.QueryParser.Term(QueryParser.java:358)
    at org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:257)
    at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:181)
    at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:170)
    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:120)
因为升级到4.6.1
parser.parse(query)
会导致如下异常:

public class SomeClass {

    String field;
    Analyzer analyzer;

    // omitted for brevity...

    public Query parse(String query) throws ParseException {
        QueryParserBase parser = new QueryParser(Version.LUCENE_46, field, analyzer);
        parser.parse(query);
    }
}
java.lang.IllegalStateException: TokenStream contract violation: close() call missing
    at org.apache.lucene.analysis.Tokenizer.setReader(Tokenizer.java:89)
    at org.apache.lucene.analysis.Analyzer$TokenStreamComponents.setReader(Analyzer.java:307)
    at org.apache.lucene.analysis.standard.StandardAnalyzer$1.setReader(StandardAnalyzer.java:120)
    at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:183)
    at org.apache.lucene.util.QueryBuilder.createFieldQuery(QueryBuilder.java:207)
    at org.apache.lucene.queryparser.classic.QueryParserBase.newFieldQuery(QueryParserBase.java:470)
    at org.apache.lucene.queryparser.classic.QueryParserBase.getFieldQuery(QueryParserBase.java:462)
    at org.apache.lucene.queryparser.classic.QueryParserBase.handleBareTokenQuery(QueryParserBase.java:842)
    at org.apache.lucene.queryparser.classic.QueryParser.Term(QueryParser.java:358)
    at org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:257)
    at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:181)
    at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:170)
    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:120)
我不熟悉Lucene最近的API更改,但是我似乎无法访问
TokenStream
来调用
close()
reset()


那么,我该如何解决这个问题呢?

您是否将所有Lucene罐子更新为新版本?我猜您的类路径中有一个v4.4 analyzer common或queryparser jar。是的,我已经更新了所有jar,我的依赖项由Ivy管理。您必须使用自定义analyzer和/或标记器。请发布相关代码。
analyzer
是类
org.apache.lucene.analysis.standard.StandardAnalyzer
的实例。将对象与调试器交互,我可以看到它的重用策略设置为
Analyzer.globalreusestragey
,并且它似乎正在使用
org.apache.lucene.analysis.standard.StandardTokenizer
您能发布一个精简到基本的、自包含的示例来演示这个问题吗?