Lucene 5.3.1中QueryParser报‘short cannot be dereferenced’错误求助
解决Lucene 5.3.1中QueryParser的‘short cannot be dereferenced’错误
刚接触Java和Lucene确实容易踩这些小坑,我来帮你一步步排查并修复问题:
错误原因拆解
- 导入了错误的Version类:你导入的
sun.rmi.transport.TransportConstants.Version是Java RMI的内部枚举,和Lucene完全无关。更关键的是,Lucene 5.x版本的QueryParser已经移除了Version参数,根本不需要再传入Version枚举! - 错误的Query类导入:你导入的
javax.management.Query是JMX管理用的Query,不是Lucene检索需要的org.apache.lucene.search.Query,这会直接导致类型不匹配问题。 - 重复冗余的导入:代码里重复导入了
sun.rmi.transport.TransportConstants.Version,属于无效代码。 - 未定义变量引用:代码里用了
q2,但你只定义了q,这会触发编译错误。 - 字段值获取方式不够简洁:Lucene 5.x中获取文档字段值更推荐使用
document.get("字段名"),比getField().stringValue()更直观简洁。
修正后的完整代码
import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; // 导入正确的Lucene Query类 import org.apache.lucene.search.Query; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.core.KeywordAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; public class Searcher { public static void main(String args[]) throws Exception { // 声明抛出Exception,覆盖parse的ParseException String queryStr = "computer science"; Analyzer analyzer = new KeywordAnalyzer(); // Lucene 5.x的QueryParser无需Version参数,直接传默认字段名和Analyzer Query q = new QueryParser("W", analyzer).parse(queryStr); Path indexPath = Paths.get("MonIndex"); Directory directory = FSDirectory.open(indexPath); DirectoryReader reader = DirectoryReader.open(directory); IndexSearcher iSearcher = new IndexSearcher(reader); // 使用正确的变量q,而非未定义的q2 TopDocs topdocs = iSearcher.search(q, 100); ScoreDoc[] resultsList = topdocs.scoreDocs; for(int i = 0; i < resultsList.length; i++){ Document book = iSearcher.doc(resultsList[i].doc); // 用简洁的get方法获取字段值 System.out.println(book.get("I")); } // 手动关闭资源,避免泄漏 reader.close(); directory.close(); } }
额外优化建议
- 更安全的资源管理:推荐使用Java 7+的try-with-resources语法,自动关闭
Directory和DirectoryReader,无需手动调用close:
try (Directory directory = FSDirectory.open(indexPath); DirectoryReader reader = DirectoryReader.open(directory)) { // 所有检索逻辑放在这里 } catch (Exception e) { e.printStackTrace(); }
- 异常精细化处理:如果不想直接抛出
Exception,可以单独捕获ParseException和IOException,让代码的异常处理更清晰。
内容的提问来源于stack exchange,提问作者Ares
相关产品推荐
相关产品推荐

