zoukankan      html  css  js  c++  java
  • lucene正向索引(续)——每次commit会形成一个新的段,段"_1"的域和词向量信息可能存在"_0.fdt"和"_0.fdx”中

      • DocStoreOffset
      • DocStoreSegment
      • DocStoreIsCompoundFile
        • 对于域(Stored Field)和词向量(Term Vector)的存储可以有不同的方式,即可以每个段(Segment)单独存储自己的域和词向量信息,也可以多个段共享域和词向量,把它们存储到一个段中去。
        • 如果DocStoreOffset为-1,则此段单独存储自己的域和词向量,从存储文件上来看,如果此段段名为XXX,则此段有自己的XXX.fdt,XXX.fdx,XXX.tvf,XXX.tvd,XXX.tvx文件。DocStoreSegment和DocStoreIsCompoundFile在此处不被保存。
        • 如果DocStoreOffset不为-1,则DocStoreSegment保存了共享的段的名字,比如为YYY,DocStoreOffset则为此段的域及词向量信息在共享段中的偏移量。则此段没有自己的XXX.fdt,XXX.fdx,XXX.tvf,XXX.tvd,XXX.tvx文件,而是将信息存放在共享段的YYY.fdt,YYY.fdx,YYY.tvf,YYY.tvd,YYY.tvx文件中。
        • 好在共享域和词向量存储并不是经常被使用到,实现也或有缺陷,暂且解释到此。

          IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR), new StandardAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED); 
          writer.setUseCompoundFile(false);

        
          indexDocs(writer, docDir); 
          writer.flush();

    //flush生成segment "_0",并且flush函数中,flushDocStores设为false,也即下个段将同本段共享域和词向量信息,这时DocumentsWriter中的docStoreSegment= "_0"。

          indexDocs(writer, docDir); 
          writer.commit();

    //commit生成segment "_1",由于上次flushDocStores设为false,于是段"_1"的域以及词向量信息是保存在"_0"中的,在这个时刻,段"_1"并不生成自己的"_1.fdx"和"_1.fdt"。然而在commit函数中,flushDocStores设为true,也即下个段将单独使用新的段来存储域和词向量信息。然而这时,DocumentsWriter中的docStoreSegment= "_1",也即当段"_2"存储其域和词向量信息的时候,是存在"_1.fdx"和"_1.fdt"中的,而段"_1"的域和词向量信息却是存在"_0.fdt"和"_0.fdx"中的,这一点非常令人困惑。 如图writer.commit的时候,_1.fdt和_1.fdx并没有形成。

    image

          indexDocs(writer, docDir); 
          writer.flush();

    //段"_2"形成,由于上次flushDocStores设为true,其域和词向量信息是新创建一个段保存的,却是保存在_1.fdt和_1.fdx中的,这时候才产生了此二文件。

    image

          indexDocs(writer, docDir); 
          writer.flush();

    //段"_3"形成,由于上次flushDocStores设为false,其域和词向量信息是共享一个段保存的,也是是保存在_1.fdt和_1.fdx中的

          indexDocs(writer, docDir); 
          writer.commit();

    //段"_4"形成,由于上次flushDocStores设为false,其域和词向量信息是共享一个段保存的,也是是保存在_1.fdt和_1.fdx中的。然而函数commit中flushDocStores设为true,也意味着下一个段将新创建一个段保存域和词向量信息,此时DocumentsWriter中docStoreSegment= "_4",也表明了虽然段"_4"的域和词向量信息保存在了段"_1"中,将来的域和词向量信息却要保存在段"_4"中。此时"_4.fdx"和"_4.fdt"尚未产生。   

    image

          indexDocs(writer, docDir); 
          writer.flush();

    //段"_5"形成,由于上次flushDocStores设为true,其域和词向量信息是新创建一个段保存的,却是保存在_4.fdt和_4.fdx中的,这时候才产生了此二文件。

    image

          indexDocs(writer, docDir); 
          writer.commit(); 
          writer.close();

    //段"_6"形成,由于上次flushDocStores设为false,其域和词向量信息是共享一个段保存的,也是是保存在_4.fdt和_4.fdx中

    image

    •  
      • HasSingleNormFile
        • 在搜索的过程中,标准化因子(Normalization Factor)会影响文档最后的评分
        • 不同的文档重要性不同,不同的域重要性也不同。因而每个文档的每个域都可以有自己的标准化因子。
        • 如果HasSingleNormFile为1,则所有的标准化因子都是存在.nrm文件中的。
        • 如果HasSingleNormFile不是1,则每个域都有自己的标准化因子文件.fN
      • NumField
        • 域的数量
      • NormGen
        • 如果每个域有自己的标准化因子文件,则此数组描述了每个标准化因子文件的版本号,也即.fN的N。
      • IsCompoundFile
        • 是否保存为复合文件,也即把同一个段中的文件按照一定格式,保存在一个文件当中,这样可以减少每次打开文件的个数。
        • 是否为复合文件,由接口IndexWriter.setUseCompoundFile(boolean)设定。 
        • 非符合文件同符合文件的对比如下图:
    非复合文件: 
    image
    复合文件: 
    image
    •  
      • DeletionCount
        • 记录了此段中删除的文档的数目。
      • HasProx
        • 如果至少有一个段omitTf为false,也即词频(term freqency)需要被保存,则HasProx为1,否则为0。
      • Diagnostics
        • 调试信息。
    • User map data
      • 保存了用户从字符串到字符串的映射Map
    • CheckSum
      • 此文件segment_N的校验和。

    读取此文件格式参考SegmentInfos.read(Directory directory, String segmentFileName):

    • int format = input.readInt();
    • version = input.readLong(); // read version
    • counter = input.readInt(); // read counter
    • for (int i = input.readInt(); i > 0; i--) // read segmentInfos
      • add(new SegmentInfo(directory, format, input));
        • name = input.readString();
        • docCount = input.readInt();
        • delGen = input.readLong();
        • docStoreOffset = input.readInt();
        • docStoreSegment = input.readString();
        • docStoreIsCompoundFile = (1 == input.readByte());
        • hasSingleNormFile = (1 == input.readByte());
        • int numNormGen = input.readInt();
        • normGen = new long[numNormGen];
        • for(int j=0;j
        • normGen[j] = input.readLong();
      • isCompoundFile = input.readByte();
      • delCount = input.readInt();
      • hasProx = input.readByte() == 1;
      • diagnostics = input.readStringStringMap();
    • userData = input.readStringStringMap();
    • final long checksumNow = input.getChecksum();
    • final long checksumThen = input.readLong();
  • 相关阅读:
    【转】shell脚本常用命令
    【转】应该知道的Linux技巧
    背景颜色变成豆沙绿色~
    缓冲区溢出攻击
    恶意代码简介
    atitit.  web组件化原理与设计
    Atitit.vod 视频播放系统 影吧系统的架构图 架构体系 解决方案
    Atitit.跨语言异常转换机制 java c# php到js的异常转换
    atitit.React   优缺点 相比angular react是最靠谱的web ui组件化方案了
    Atiti。流量提升软件设计大纲规划 v1 q45
  • 原文地址:https://www.cnblogs.com/bonelee/p/6394132.html
Copyright © 2011-2022 走看看