Lucene 的核心逻辑本身很简单
DocValues 更新的本质就是:
攒一批更新 → 按文档聚合 → 取最新的值 → 写入磁盘
这个逻辑,几句话就能说清楚。
但代码为什么这么难读?
因为 Lucene 为了快和省内存,在每一层都塞满了优化:
优化目标 引入的机制 代码复杂度来源
省内存 BytesRefArray、PagedMutable、FieldUpdatesBuffer 的复用逻辑 数组扩容、填充、按需复用
省内存 按 ord 分散存储,不建对象 各种 getArrayIndex()、数组关联
省内存 压缩存储(value - minValue) 加减运算
快 预读跳过(lookAheadTermIterator) 双迭代器、条件判断
快 多路归并(mergedIterator) 堆排序
快 延迟写入(writeSomeDocValuesUpdates) 水位线、部分写入
快 排序后跳过被覆盖的更新 sortedTerms 优化开关
每一层优化都增加了一层复杂度,层层叠加,代码就像洋葱一样。
最好的阅读策略
就像你做的这样:
-
先剥到最里面:搞清楚"它在做什么"(更新应用)
-
再从里往外看:每层优化为什么加?解决了什么问题?
你已经完成了第 1 步,现在正在做第 2 步。💪
一句话
Lucene 的"业务逻辑"其实很简单,复杂的是为了快和省内存而加的各种优化。读源码时,先忽略优化看主干,再逐层理解优化,就不会被绕晕。 😄
</answer>