Lucene中TopDocs.totalHits与search方法参数'n'的关联疑问
Lucene 4.3.1中totalHits与search参数n的关系解答
嘿,我来帮你把这个问题掰扯清楚~在Lucene 4.3.1这个版本里,IndexSearcher.search(Query query, int n)的参数n和返回的TopDocs.totalHits其实是两个完全独立的东西,咱们一步步说:
核心逻辑拆解
- 首先,参数
n的作用是控制返回的TopDocs里包含多少个得分最高的文档(也就是scoreDocs数组的长度),简单说就是“我要取前n个匹配结果”。 - 而
totalHits字段返回的是Lucene统计到的、完全匹配查询条件的所有文档总数,不管你设置的n是多少,它都会如实返回真实的总命中数。
你的测试场景解释
你设置n=1时得到totalHits=29,这完全正常——因为你的查询确实匹配了29个文档,n=1只是让Lucene只返回得分最高的那1个文档,但它还是会告诉你总共有29个匹配项。同理,如果实际匹配的文档有10000个,哪怕你设置n=1000,totalHits也会返回10000,而不是被限制在1000以内。
更高效的总命中数统计方式
如果你的需求只是获取总命中数,而不需要具体的文档数据,那用search(query, n)其实有点浪费性能(因为Lucene还是会去计算前n个文档的得分)。Lucene 4.3.1提供了专门的TotalHitCountCollector来干这个事,代码示例如下:
// 创建专门统计总命中数的Collector TotalHitCountCollector hitCountCollector = new TotalHitCountCollector(); // 执行查询,只统计数量 indexSearcher.search(yourQuery, hitCountCollector); // 获取真实总命中数 int totalHits = hitCountCollector.getTotalHits();
这种方式不需要处理文档排序和得分,性能会比search(query, n)高很多,尤其是当匹配文档量很大的时候。
总结一下
search(query, n)中的n不影响totalHits的数值,它只控制返回的top N文档数量- 4.3.1版本的
totalHits就是实际匹配查询的总文档数,和n无关 - 仅需统计数量时,优先用
TotalHitCountCollector
内容的提问来源于stack exchange,提问作者nantitv
相关产品推荐
相关产品推荐

