• ES中个别字段属性说明


    DEFAULT_NO_CFS_RATIO

    DEFAULT_NO_CFS_RATIO这个用于判断生成新段的时候,是否使用复合文件, 复合文件(Compound File)是将多个索引文件合并为一个单一的文件组合,以减少文件数量和提高性能。

    ​ 在 Lucene 中,复合文件主要由两个部分组成:

    .cfs: 它包含多种索引文件(比如nvd,fdt,dvm等)的内容。

    .cfe: 它则主要记录了每种索引文件在cfs中的offset和length信息,方便快速定位到具体的内容。

    DEFAULT_NO_CFS_RATIO 默认为0.1, 如果合并段的大小小于或者等于 DEFAULT_NO_CFS_RATIO * 所有段的总大小,那么就使用复合文件,否则就不使用。

    MERGE_TYPE 合并类型

    ​ 1、NATURAL。是正常索引维护过程(文档增删改查)中,根据合并策略自动触发的 merge

    ​ 2、FORCE_MERGE_DELETES。只对那些包含了删除文档(占10%,由变量forceMergeDeletesPctAllowed控制 )的段进行合并。当 ES 调用forcemerge 指定only_expunge_deletes, 则会进行这种类型的merge。

    ​ 3、FORCE_MERGE。实际上在 lucene 中没有地方使用到这个枚举值,ES 源码中也没有。

    其他属性

    **maxMergeAtOnce。**在NATURAL情况下,同时合并的最大段数,默认10

    **maxMergedSegmentBytes。**在NATURAL情况下,最大允许生产的合并后段的大小,默认5G

    **maxMergeAtOnceExplicit。**在forcemerge和forcemergeDeletes情况下,同时合并的最大段数,默认无限。

    **floorSegmentBytes。**段大小小于这个floorSegmentBytes大小,则都认定他们的SegmentSize都是这个大小, 默认2M

    **segsPerTier。**这个越少会带来更多的合并,设置每层需要包含segsPerTier个段才被允许合并, 默认为10

    **deletesPctAllowed。**表示允许索引中的删除文档占总文档数的最大百分比。较低的值会使索引更加节省空间,但可能会增加 CPU 和 I/O 活动。默认值是 33。

    段合并流程

    ​ 在org.apache.lucene.index.TieredMergePolicy#findMerges 中实现的

    1)初始化。

    ​ 先获取正在合并的段列表,通过调用 getSortedBySegmentSize 方法,根据段的大小从大到小对 infos 中的段进行排序,得到排序后的列表 sortedInfos。

    2)统计合并信息和过滤。

    ​ 遍历统计 sortedInfos 中的段中的信息:

      1. 如果段正在合并,则将其大小累加到 mergingBytes 中,并从列表中移除,同时更新 totalMaxDoc(累计存活的文档数)。
      2. 否则,统计删除文档数和总最大文档数,并更新 minSegmentBytes为当前段大小的最小值。
      3. 累计总索引字节数 totIndexBytes (用于后续分层)。

    3)计算删除文档比例。

    ​ 计算所有段的删除文档的比例,超出这比例的段或者索引一定会被合并。

    4)计算索引允许的删除文档数。

    ​ 根据索引内的删除文档比例和设置的 deletesPctAllowed(默认为 33%)计算出允许的删除文档数 allowedDelCount。

    5)移出过大的段。

    移除的前提是段的大小大于maxMergedSegmentBytes(默认5G)的一半大小,其次需要满足如下两个条件之一:

      1. 段的删除文档数小于阈值。
      2. 索引的删除文档数小于阈值。

    6)不断分层,计算index中允许的segment数。

    ​ 索引允许的段数为每层的总和,最终和segsPerTier比较去最大值。当计算出的allowedSegCount 大于segsPerTier,就会去判断floorSegmentBytes

      • floorSegmentBytes 太小,会导致allowedSegCount 很大,这会导致存在大量的小段。
      • floorSegmentBytes 太大,会导致合并的段越大,段越少,但是有maxMergedSegmentBytes控制。

    7)调用doFineMerges。

    总而言之,就是为了得到可以合并的段列表、每次合并的最大段数、索引允许的段数、允许删除的文档数、是否有超出大的合并(合并的字节总数大于maxMergedSegmentBytes),而这些作为参数进而调用doFindMerges函数。

  • 相关阅读:
    C++:中的继承关系:单继承,多继承,菱形继承的详细介绍
    C语言 -- 零基础入门详解
    最简单的el-cascadert省市区三级/二级联动
    Java之spring新手教程(包教包会)
    独家 | 2022 年十项突破性技术
    Android项目集成flutter模块
    redis基础数据结构
    python入门篇03 基础案例 python版与java版 语法不同之处
    关于STM32时钟系统的理解
    c# 程序发布
  • 原文地址:https://blog.csdn.net/qq_36010886/article/details/133755150