当前位置: 首页 > news >正文

【lucene】SegmentCoreReaders

`SegmentCoreReaders` 是 Lucene 内部的一个包级可见(package-private)工具类,位于

`org.apache.lucene.index` 包中。它的唯一职责是 一次性打开某个 segment 最核心、最常用的只读读柄(reader),然后把它们缓存起来供 `SegmentReader` 反复使用,避免重复打开文件句柄和重复解码元数据。

---

✅ 存在目的

任务 说明 

一次性打开底层文件 把 segment 中最常用的格式(postings、stored fields、doc values、term vectors …)对应的 Reader 全部打开并保存。 

避免重复 IO / 解码 这些 Reader 创建代价高(涉及文件头解析、内存映射、解压字典等),因此缓存起来可以极大提升查询效率。 

供 SegmentReader 使用 `SegmentReader` 的所有公开查询 API(`terms()`, `storedFields()`, `getNumericDocValues(...)` 等)最终都委托给 `SegmentCoreReaders` 里保存的实例。 

---

✅ 内部保存的核心 Reader

变量名 对应格式 文件名示例 

`fields` `FieldsProducer`(倒排索引) `.tim`, `.tip`, `.doc`, `.pos`, `.pay` 

`storedFieldsReader` `StoredFieldsReader` `.fdx`, `.fdt` 

`termVectorsReader` `TermVectorsReader` `.tvx`, `.tvd`, `.tvf` 

`normsProducer` `NormsProducer` `.nvd`, `.nvm` 

`docValuesProducer` `DocValuesProducer` `.dvd`, `.dvm` 

`pointsReader` `PointsReader` `.dii`, `.dim` 

`knnVectorsReader` `KnnVectorsReader` (>=8.0) `.vec`, `.veq`, `.vex` 

---

✅ 生命周期

1. 创建

   在 `SegmentReader` 构造函数里通过  

```java

   core = new SegmentCoreReaders(...);

   ```

   一次性打开所有文件句柄。

2. 使用

   `SegmentReader` 的所有公开方法(如 `storedFields()`, `getTermVector(...)`, `getNumericDocValues(...)`)都直接返回 `core` 中缓存的实例。

 

3. 关闭

 

   当 `SegmentReader.close()` 被调用时,会统一关闭 `SegmentCoreReaders` 中保存的所有底层 Reader,释放文件句柄和内存。

 

---

 

✅ 与外部 API 的关系

 

外部 API 内部实现 

`IndexReader.leafContexts()` → `LeafReader` 每个 `LeafReader` 就是 `SegmentReader`,其背后用 `SegmentCoreReaders`。 

`StoredFields#document(docID)` 最终调用 `core.storedFieldsReader.document(...)` 

`Terms terms(String field)` 最终调用 `core.fields.terms(field)` 

`NumericDocValues getNumericDocValues(String field)` 最终调用 `core.docValuesProducer.getNumeric(field)` 

 

---

 

✅ 总结一句话

 

> `SegmentCoreReaders` 是 Lucene 内部的一个“只读核心 Reader 缓存器”,它一次性打开 segment 中所有底层格式文件,供 `SegmentReader` 高效复用,屏蔽了复杂且昂贵的底层 IO 细节。

http://www.dtcms.com/a/304594.html

相关文章:

  • linux_前台,后台进程
  • LeetCode热题100——155. 最小栈
  • (LeetCode 面试经典 150 题) 150. 逆波兰表达式求值 (栈)
  • 电脑主机显示的python版本是3.8.6,但是我在控制面板没有找到,想删除不知道怎么操作怎么办
  • 《 java 随想录》| LeetCode链表高频考题
  • 【LeetCode】大厂面试算法真题回忆(111)--身高排序
  • 鱼皮项目简易版 RPC 框架开发(五)
  • 2.oracle保姆级安装教程
  • 逐渐走进Ai世界~
  • Django模型开发:模型字段、元数据与继承全方位讲解
  • Unity_SRP Batcher
  • 【WRF-Chem 实例1】namelist.input 详解- 模拟CO2
  • 基于AI代码疫苗技术的开源软件供应链安全治理
  • C# _列表(List<T>)_ 字典(Dictionary<TKey, TValue>)
  • 【dropdown组件填坑指南】—怎么实现下拉框的位置计算
  • 【机器学习深度学习】为什么需要分布式训练?
  • 从硬编码到自主智能体:营销AI的20年技术演进与未来展望
  • 前端开发为什么没有后端开发那么清除业务
  • sqLite 数据库 (2):
  • 摔倒识别误报率↓79%:陌讯动态时序融合算法实战解析
  • System V IPC机制:进程通信的统一设计
  • 单片机(STM32-WIFI模块)
  • 【JavaScript】手写 Object.prototype.toString()
  • Qt 移动应用常见问题与解决方案
  • React服务端渲染 Next 使用详解
  • 安卓模拟器 adb Frida hook 抓包
  • Ubuntu第一步——下载、网络、apt
  • 用系统架构思维,告别“意大利面条式”系统提示词
  • 艾利特机器人:光伏机器人如何重塑清洁能源制造新格局
  • 极光GPTBots亮相WAIC,并发布全新Multi-Agent平台