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

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

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

  1. Lucene 查询流程 = 先评分 & 排序,后可选地取回文档
  • IndexSearcher.search(...) 在内部先创建 `Weight`、`Scorer`,再交给 Collector 遍历倒排表。

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

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

  1. 获取 Document 不是必须的
  • 只有当你调用 `searcher.doc(docId)` 或 `IndexSearcher.doc(...)` 时,Lucene 才会根据 docId 去 stored fields 做随机读;

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

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

```java

TotalHitCountCollector c = new TotalHitCountCollector();

searcher.search(query, c);

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

```

  1. 小结

阶段 是否发生 是否必须

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

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

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

相关推荐
sniper_fandc10 天前
Elasticsearch从入门到进阶——搜索优化原理
elasticsearch·搜索引擎·lucene·1024程序员节
酥酥禾14 天前
C# LINQ常用语法
solr·lucene
cyh男23 天前
lucene中AutomatonQuery类的作用
lucene
cyh男23 天前
lucene中的PointRangeQuery和PointInSetQuery有什么区别
lucene
cyh男23 天前
为什么ES中不推荐使用wildcard查询
elasticsearch·lucene
渣渣盟25 天前
中文分词技术全解析
搜索引擎·全文检索·lucene
cyh男1 个月前
lucene 8.7.0 版本中的倒排索引、数字、DocValues三种类型的查询性能对比
lucene
cyh男1 个月前
Lucene 8.7.0 版本中dvd、dvm文件详解
lucene
是犹橐籥1 个月前
头歌Educoder答案 Lucene - 全文检索入门
搜索引擎·全文检索·lucene
cyh男1 个月前
Lucene 8.7.0 版本中docFreq、totalTermFreq、getDocCount等方法的含义
lucene