Lucene中TopDocs totalHits类型转换报错问题求助
解决Lucene中TotalHits类型转换报错的问题
我来帮你搞定这个Lucene搜索示例的类型转换问题!
问题根源
你遇到的报错是因为Lucene版本的API变更:在Lucene 7.0及以后的版本里,TopDocs.totalHits不再是基础的long数值类型,而是变成了一个TotalHits对象——它包含了两个核心信息:匹配结果的总数(value字段)和计数模式(比如是否是精确计数)。这就是为啥你直接把results.totalHits转long或int都会报错,本质是你在试图把对象转成数值类型。
具体解决步骤
只需要访问TotalHits对象的value属性拿到实际的匹配总数,再做类型转换就行:
TopDocs results = searcher.search(query, 5); ScoreDoc[] hits = results.scoreDocs; // 先获取TotalHits对象里的数值,再安全转成int int numTotalHits = Math.toIntExact(results.totalHits.value);
补充说明
results.totalHits.value本身是long类型,用Math.toIntExact()转换是最稳妥的方式——如果搜索结果总数超过了int的最大值(2147483647),它会抛出ArithmeticException,能帮你及时发现溢出问题。- 要是你百分百确定结果总数不会超出int范围,也可以直接强转,但这种方式有溢出风险,不推荐:
int numTotalHits = (int) results.totalHits.value;
版本适配提醒
如果是从Lucene 6.x及更早版本的示例代码迁移过来的,就会碰到这个API差异——旧版本里TopDocs.totalHits确实是long类型,直接转int就能用,但新版本必须通过value属性获取数值。
内容的提问来源于stack exchange,提问作者little marshmallow
相关产品推荐
相关产品推荐

