它们是"反序列化层的迭代器接口"。
它们的角色
接口/抽象类 属于什么 职责
TermsEnum 反序列化迭代器 遍历倒排词典中的词项
PostingsEnum 反序列化迭代器 遍历某个词项对应的文档列表
NumericDocValues 反序列化迭代器 按文档 ID 读取数值(随机访问)
SortedDocValues 反序列化迭代器 按文档 ID 读取序数,再查词典还原字符串
SortedSetDocValues 反序列化迭代器 遍历多值字符串的序数列表
BinaryDocValues 反序列化迭代器 按文档 ID 读取二进制值
PointValues 反序列化迭代器 intersect() 递归遍历 BKD 树
它们都是反序列化层的"游标"。你在上层通过它们来逐条读取数据,不需要关心底层文件格式。
它们的关系
```
反序列化层(SegmentCoreReaders)
├── 提供入口:FieldsProducer、DocValuesProducer、StoredFieldsReader...
│
└── 返回游标:TermsEnum、PostingsEnum、NumericDocValues...
↑
这些就是你问的"提供遍历方法的接口"
```
它们的共同特征
特征 说明
从磁盘读数据 内部持有 IndexInput,从 .doc、.dvd 等文件读字节
逐条暴露给上层 一次给一条,不一次性全加载
有状态 内部维护当前读到的位置(docID、ord、term 等)
上层不关心底层 上层只知道 nextDoc() 返回 int,不知道数据来自哪
生命周期短 用完就扔,不长期持有
它们的名字
命名模式 例子 说明
*Enum TermsEnum、PostingsEnum 传统的"枚举器",按顺序一个个取
*Values NumericDocValues、SortedDocValues 按文档 ID 取值的"值访问器"
*Reader StoredFieldsReader 读取器的顶层入口,返回 Enum/Values
一句话
这些接口和抽象类,是反序列化层的"迭代器协议"------它们定义了如何从磁盘数据中逐条读取信息,让上层可以用统一的方式访问不同类型的数据,而不需要关心底层文件格式。 🎯