nvd、nvm索引文件的生成


nvd, nvm文件主要描述的是索引阶段每个 Field的域标准化值。


核心类图

图1(核心类图)
norms写入相关类
1⃣️NormsFormat主要负责生成NormsProducerNormsConsumer
2⃣️NormsConsumer主要负责对每个Field生成normsValue,最终生成索引文件nvdnvm
3⃣️NormsProducer主要负责生成normsValue,可以是读取索引文件nvd,nvm;也可以是通过其他方式,可以看NormsProducer在源码中的多个实现类。
4⃣️在索引阶段,主要是通过NormValuesWriter类的flush方法来触发最终生成nvd,nvm文件。

写入过程

图2(写入过程)
在这里插入图片描述
org.apache.lucene.index.DefaultIndexingChain#writeNorms

  private void writeNorms(SegmentWriteState state, Sorter.DocMap sortMap) throws IOException {
    boolean success = false;
    NormsConsumer normsConsumer = null;
    try {
      if (state.fieldInfos.hasNorms()) {
        NormsFormat normsFormat = state.segmentInfo.getCodec().normsFormat();
        assert normsFormat != null;
        normsConsumer = normsFormat.normsConsumer(state);

        for (FieldInfo fi : state.fieldInfos) {
          PerField perField = getPerField(fi.name);
          assert perField != null;

          // we must check the final value of omitNorms for the fieldinfo: it could have 
          // changed for this field since the first time we added it.
          if (fi.omitsNorms() == false && fi.getIndexOptions() != IndexOptions.NONE) {
            assert perField.norms != null: "field=" + fi.name;
            perField.norms.finish(state.segmentInfo.maxDoc());
            //依次处理每一个Field的norm value 信息
            perField.norms.flush(state, sortMap, normsConsumer);
          }
        }
      }
      success = true;
    } finally {
      if (success) {
        IOUtils.close(normsConsumer);
      } else {
        IOUtils.closeWhileHandlingException(normsConsumer);
      }
    }

索引文件

nvd

nvd可能是norm value data的简写。
nvd, nvm索引结构在nvd&&nvm这篇文章中解释的已经很详细了,这里仅做些补充。


Header主要由6部分组成, 固定使用43个字节。

1⃣️ int CODEC_MAGIC 表示header的开始,表示为4个字节
63, -41, 108, 23
2⃣️ string codec 固定字符串, “Lucene80NormsData”,表示为18个字节
17, 76, 117, 99, 101, 110, 101, 56, 48, 78, 111, 114, 109, 115, 68, 97, 116, 97
3⃣️int version = 表示为4个字节0, 0, 0, 0
4⃣️byte[] id 文件唯一标识符,16个字节,不固定
5⃣️segmentSuffixLength segment文件的后缀,因为没有后缀,长度为0,所以写入一个字节0
6⃣️segmentSuffix segment文件的后缀,因为没有后缀,所以这里不写入内容


nvm

个人认为是 norm values meta的简写。
配合nvd文件来存储norm values信息。


参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值