【Lucene】lucene的searcher.search查询机制

lucene查询的时候也是先评分排序,最后才获取文档 甚至获取文档都不是必须的?

是的,你的理解完全正确。

1. Lucene 查询流程 = 先评分 & 排序,后可选地取回文档

- IndexSearcher.search(...) 在内部先创建 `Weight`、`Scorer`,再交给 Collector 遍历倒排表。  

- Collector(如 TopScoreDocCollector) 一边遍历一边实时计算 score 并维护一个优先队列(PriorityQueue),因此“打分 → 排序”发生在遍历倒排表阶段。  

- TopDocs 返回的只是 “docId + score” 的堆顶列表;真正的 `Document` 对象此时并未加载。

 

2. 获取 Document 不是必须的

- 只有当你调用 `searcher.doc(docId)` 或 `IndexSearcher.doc(...)` 时,Lucene 才会根据 docId 去 stored fields 做随机读;  

- 如果你只需要 命中数、聚合、统计、自定义 Collector 计算,完全可以不取回 Document,从而节省大量 IO。

 

3. 代码示例:只统计命中数,不加载文档

 

```java

TotalHitCountCollector c = new TotalHitCountCollector();

searcher.search(query, c);

System.out.println("命中:" + c.getTotalHits()); // 无 Document 加载

```

 

4. 小结

 

阶段 是否发生 是否必须 

倒排表遍历 + 打分 + 排序 ✅ ✅ 

加载 stored fields 取 Document ✅ ❌(按需) 

 

因此,Lucene 可以在完全不取回 Document 的情况下完成一次查询,这正是它高性能的关键之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值