索引表加载策略配置
索引表的加载策略配置由多个索引文件的加载策略组成,每个策略描述了一组索引文件的具体加载方式。索引表在加载时,针对每个索引文件,从上到下依次匹配策略规则,优先使用第一个匹配的策略加载索引文件。
配置示例
{
"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信息 |