【lucene】currentFrame与staticFrame

`currentFrame` 是 `SegmentTermsEnum`(`TermsEnum` 的一个具体实现)里 "当前正在扫描的那个 block" 的 状态容器。

它对应的类型是 `SegmentTermsEnumFrame`,可以理解为 "在 BlockTree 字典里的一层节点解析器"。


✅ 一句话解释

`currentFrame` 负责 把 `.tim` 文件里的一个压缩 block 解包到内存,然后提供 在该 block 里顺序/二分查找 term 的能力,并且在找到目标 term 后,把指向 `.doc/.pos/.pay` 的指针解析出来。


✅ 主要职能拆成 4 步

步骤 方法 说明

1 `loadBlock()` 根据 `.tip` 给出的文件指针,把 `.tim` 文件里对应的 block 读进来并解压,得到 term 列表、统计信息、倒排指针等。

2 `scanToTerm(target)` 在上一步加载的 block 里 顺序或二分查找 是否包含目标 term,返回 FOUND / NOT_FOUND / END。

3 `decodeMetaData()` 找到 term 后,把 docFreq、docFP、posFP、payFP、skipFP 等指针解析成 `TermState`,供 `postings()` 使用。

4 `next()` / `nextLeaf()` 如果没命中或需要遍历,继续在同一个 block 里 顺序跳到下一个 term;block 用完就 弹栈 / 进栈 新的 `currentFrame`。


✅ 形象比喻

  • 把 BlockTree 看成 一本多级目录的词典,`.tip` 是 目录页,`.tim` 是 词条页。

  • `SegmentTermsEnum` 就像 翻书的人。

  • `currentFrame` 就是 他手里当前摊开的这一页,上面记录着:

  • 这一页的范围(prefix)

  • 这一页里有多少词条(后缀数组)

  • 每个词条的详细解释在哪一页(倒排指针)

只有 `currentFrame` 把这一页 真正摊开(loadBlock),后面的 `nextDoc()` 才能根据页码去 `.doc/.pos/.pay` 里拿 文档列表。

`staticFrame` 是 `SegmentTermsEnum` 里的一个 "永远指向 BlockTree 根节点"的只读 Frame,

它跟 `currentFrame` 不同:

  • 只读:`staticFrame` 本身不随扫描过程移动,它永远保存整棵字典的根 block的元数据。

  • 作用:

  1. 在 `seekExact()/seekCeil()` 之前,先把 `currentFrame = staticFrame` 复位,表示"回到根节点,重新开始"。

  2. 提供根节点的前缀长度、后缀起始地址等常量,供后面 push 新帧时计算偏移量。

  3. 避免每次 new 一个空 Frame,省一次对象分配。

一句话:

`staticFrame` 是 SegmentTermsEnum 的"树根锚点",用来快速回到字典起点,而 `currentFrame` 才是随遍历或二分不断切换的"工作节点"。

相关推荐
sniper_fandc10 天前
Elasticsearch从入门到进阶——搜索优化原理
elasticsearch·搜索引擎·lucene·1024程序员节
酥酥禾14 天前
C# LINQ常用语法
solr·lucene
cyh男22 天前
lucene中AutomatonQuery类的作用
lucene
cyh男22 天前
lucene中的PointRangeQuery和PointInSetQuery有什么区别
lucene
cyh男22 天前
为什么ES中不推荐使用wildcard查询
elasticsearch·lucene
渣渣盟24 天前
中文分词技术全解析
搜索引擎·全文检索·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