Lucene parse导致令牌流契约冲突
我继承了一个使用Lucene 4.4.0的项目,我正在尝试将其更新为使用Lucene 4.6.1 当调用我的类的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
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.1parser.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
您能发布一个精简到基本的、自包含的示例来演示这个问题吗?