索引表加载策略

索引表加载策略配置

索引表的加载策略配置由多个索引文件的加载策略组成,每个策略描述了一组索引文件的具体加载方式。索引表在加载时,针对每个索引文件,从上到下依次匹配策略规则,优先使用第一个匹配的策略加载索引文件。

配置示例

{
    "load_config":[
        {
            "file_patterns":[
                "_ATTRIBUTE_",
                "/index/title/.*",
                "/index/body/dictionary"
            ],
            "load_strategy":"mmap",
            "lifecycle":"hot",
            "load_strategy_param":{
                "lock":true,
                "partial_lock":true,
                "advise_random":false,
                "slice":4194304,
                "interval":2
            },
            "remote" : false,
            "deploy" : true,
            "warmup_strategy":"sequential"
        },
        {
            "file_patterns":[
                "_SUMMARY_"
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false,
                "direct_io":true,
                "cache_size":4096
            },
            "remote" : true,
            "deploy" : false
        },
        {
            "warmup_strategy":"none",
            "file_patterns":[
                ".*"
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":false
            }
        }
    ]
}

参数详解

  • file_patterns:索引文件匹配模式,使用正则表达式。索引表的目录结构请参考索引文件目录结构,匹配模式是相对于segment目录的文件名的正则表示,比如要对倒排索引title设置独立的加载策略,title索引的匹配模式正则表示为"/index/title/.*"(索引名为title,所以在index目录中存在title索引目录,对其下的所有文件都需要匹配使用.*表示)。系统提供了一些内置的宏定义来简化索引文件匹配的设置:

    • _ATTRIBUTE_:等价于"/attribute/.*",表示所有的正排索引。

    • _INDEX_:等价于"/index/.*",表示所有的倒排索引。

    • _SUMMARY_:等价于"/summary/",表示所有的摘要索引。

  • load_strategy:加载策略,主要有mmap、cache两种模式。

  • load_strategy_param:加载策略参数。

    • mmap加载策略参数

      • lock:mmap是否采用lock模式,默认为false。lock模式会将索引加载到内存不会换出,查询性能较好,但是内存开销较大。

      • partial_lock:是否对倒排索引采用部分lock,默认为false。部分lock会将倒排的一级词典lock进内存,二级词典不lock,以节省内存。

      • advise_random:mmap时会减少对磁盘的预读行为,默认为false。对于索引过大,并不能全部load进内存的场景,查询时磁盘IO往往会成为性能瓶颈,配置 true 该项后能显著减少对磁盘的读取量,提升查询性能。

      • slice和interval:控制预热加载索引的速度,每读取 slice 大小就sleep interval 大小的时间,slice单位:B,interval 单位:ms。slice 和 interval 必须同时配置。slice默认 4MB,interval 默认 0(不限速)。

    • cache加载策略参数

      • direct_io: 是否使用DirectIO方式读取文件,默认 false。DirectIO模式读取ssd盘中的数据,性能更好。

      • global_cache: 是否使用全局的BlockCache,默认 false。全局的BlockCache的大小是通过环境变量进行设置,目前还未开放,建议设置为false。

      • cache_size: global_cache为false时有效,配置BlockCache大小,单位:MB,默认 1MB。

      • block_size: 配置 Block 大小,单位:B,默认 4096B。

  • remote:与file_patterns匹配的索引文件是否从远端分布式存储系统中读取,true/false。只有need_read_remote_index设置为true时,remote才会起作用,need_read_remote_index设置为false时,remote会强制设置为false。

  • deploy:与file_patterns匹配的索引文件是否需要分发到本地,true/false。只有need_deploy_index设置为true时,deploy才会起作用,need_deploy_index设置为false时,deploy会强制设置为false。

  • warmup_strategy:预热策略,目前仅对 mmap 加载策略有效,默认为none(不预热)。如果需要预热请设置为sequential,表示顺序读取预热。

使用示例

mmap策略示例

{
    "load_config":[
        {
            "file_patterns":[
                "/attribute/price/.*",  #属性字段price
                "/index/title/.*", #倒排索引title
                "/index/body/dictionary", #倒排索引body的词典
                "/index/vector/aitheta.*" #向量索引vector
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":true,  #mmap lock模式
                "partial_lock":true, #部分lock,倒排索引词典只lock一级词典
                "slice":4194304, #预热时,一次读取4M,每次间隔2ms
                "interval":2
            },
            "remote" : false, #不访问远端
            "deploy" : true, #索引下发到本地
            "warmup_strategy":"sequential" #顺序预热
        },
        {
            "file_patterns":[
                "/attribute/tags", #属性字段tag
                "/index/倒排索引description/.*"  #倒排索引description
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":false,
            },
            "remote" : false,
            "deploy" : true,
            "warmup_strategy":"none"
        }
    ]
}

cache策略示例

{
    "load_config":[
        {
            "file_patterns":[
                "_ATTRIBUTE_" #所有属性字段
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false, #不使用全局cache
                "direct_io":true, #DirectIO方式读取文件
                "cache_size":20480 #cache大小为20G
            },
            "remote" : false, #不访问远端
            "deploy" : true #索引下发到本地
        },
        {
            "file_patterns":[
                "/summary/data"  #摘要索引的data文件
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false,
                "direct_io":true,
                "cache_size":4096
            },
            "remote" : false,
            "deploy" : true
        },
        {
            "warmup_strategy":"none",
            "file_patterns":[
                ".*"
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":false
            }
        }
    ]
}

存储计算分离

#存储计算分离需要设置need_read_remote_index为true
{
    "load_config":[
        {
            "file_patterns":[
                "/index/title/.*" #倒排索引title
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":true,  #mmap lock模式
                "partial_lock":true, #部分lock,倒排索引词典只lock一级词典
                "slice":4194304, #预热时,一次读取4M,每次间隔2ms
                "interval":2
            },
            "remote" : false, #不访问远端
            "deploy" : true, #索引下发到本地
            "warmup_strategy":"sequential" #顺序预热
        },
        {
            "file_patterns":[
                "_ATTRIBUTE_" #所有属性字段
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false, #不使用全局cache
                "direct_io":true, #DirectIO方式读取文件
                "cache_size":20480 #cache大小为20G
            },
            "remote" : true, #访问远端存储
            "deploy" : false #索引不用下发到本地
        },
        {
            "file_patterns":[
                "/summary/data"  #摘要索引的data文件
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false,
                "direct_io":true,
                "cache_size":4096
            },
            "remote" : true, #访问远端存储
            "deploy" : false #索引不用下发到本地
        },
        {
            "warmup_strategy":"none",
            "file_patterns":[
                ".*"
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":false
            }
        }
    ]
}

索引文件目录结构

  |-- generation_0
      |-- partition_0_65535
          |-- index_format_version
          |-- index_partition_meta
          |-- schema.json
          |-- segment_0
              |-- attribute
                  `--attribute_name
                     `--data   
              |-- deletionmap
              |-- deploy_index
              |-- index
                 `--index_name
                    |-- bitmap_dictionary
                    |-- bitmap_posting
                    |-- dictionary
                    `-- posting
                  `--vector_index_name
                    |-- aitheta.index
                  	|-- aitheta.index.addr
              |-- summary
                	|-- data
                	|-- offset
              `-- segment_info
          |-- adaptive_bitmap__meta
              |--deploy_index
              |--dictionary_name
          |-- truncate_meta
              |-- deploy_index
              `-- truncate_meta_file 
          `-- version.0

名称

说明

generation

generation_x是引擎区分不同版本全量索引的标识。

partition

partition是searcher加载索引的基本单位。如果一个partition中数据过多,会导致searcher性能降低。线上数据一般通过划分多个partition的方式来保证每个searcher的检索效率。

segment

segment是索引组成的基本单位。segment中包含了文档的倒排和正排结构。index builder每次dump都会生成一个segment。多个segment可以通过merge策略进行合并。一个partition中可用的segment在version文件中指明。

index

倒排索引的基本单位。

attribute

正排索引的基本单位。

deletionmap

删除的doc记录。

index_format_version

索引的版本信息。用于检查索引文件是否符合binary要求。

index_partition_meta

存储了全局排序的信息。包括排序字段和升降序。

schema.json

索引配置文件。主要记录fields,index, attribute 和summary等信息。引擎通过该文件来加载索引。

version.0

version文件。主要记录当前partition中引擎需要加载的segment和最新doc的时间戳。在实时build中,引擎会根据增量version的时间戳过滤旧的原始文档。

segment_info

segment信息摘要。记录了当前segment中文档数目,当前segment是否merge过,locator信息和最新doc时间戳信息。

dictionary

倒排索引的词典

posting

倒排索引的倒排链文件

bitmap_dictionary

如果开启了bitmap高频词功能,该文件表示bitmap高频词词典。

bitmap_posting

如果开启了bitmap高频词功能,该文件表示bitmap高频词对应的倒排链。

aitheta.index

向量索引文件

aitheta.index.addr

向量索引meta信息