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
    评论
在Angular中使用nvd3,可以首先安装nvd3和d3.js,可以使用npm或者yarn进行安装。 ``` npm install d3 --save npm install nvd3 --save ``` 或者 ``` yarn add d3 yarn add nvd3 ``` 安装完成后,可以在组件中引入nvd3和d3.js库: ```typescript import * as d3 from 'd3'; import 'nvd3'; ``` 在组件中,创建一个数据集,然后设置图表参数,并在ngOnInit函数中生成图表: ```typescript import { Component, OnInit } from '@angular/core'; import * as d3 from 'd3'; import 'nvd3'; @Component({ selector: 'app-nvd3-chart', template: '<nvd3 [options]="options" [data]="data"></nvd3>', }) export class Nvd3ChartComponent implements OnInit { data: any; options: any; ngOnInit(): void { this.data = [ { key: "Cumulative Return", values: [ { "label": "A", "value": 10 }, { "label": "B", "value": 20 }, { "label": "C", "value": 30 }, { "label": "D", "value": 40 }, { "label": "E", "value": 50 }, { "label": "F", "value": 60 }, { "label": "G", "value": 70 } ] } ]; this.options = { chart: { type: 'discreteBarChart', height: 450, margin : { top: 20, right: 20, bottom: 50, left: 55 }, x: function(d){return d.label;}, y: function(d){return d.value;}, showValues: true, valueFormat: function(d){ return d3.format(',.4f')(d); }, duration: 500, xAxis: { axisLabel: 'X Axis' }, yAxis: { axisLabel: 'Y Axis', axisLabelDistance: -10 } } }; } } ``` 最后,在模板文件中使用nvd3组件来显示图表,例如: ```html <nvd3 [options]="options" [data]="data"></nvd3> ``` 这样就可以在Angular中使用nvd3来生成图表了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值