正排索引
索引介绍
什么是正排索引
正排索引,也叫attribute索引或者profile索引,是存储doc某特定字段(正排字段)对应值的索引,用来进行过滤,统计,排序或者算分使用。正排索引中“正"指的是从doc-->doc fieldInfo的过程 。
正排索引的类型
目前引擎支持的正排字段的基本类型为:
attribute类型 | 描述 | 单值 | 多值 |
INT8 | 8位有符号数字类型 | id=-27 | id=-27]26]33 |
UINT8 | 8位无符号数字类型 | id=56 | id=27]222]32 |
INT16 | 16位有符号数字类型 | id=-2724 | id=-1217^]236 |
UINT16 | 16位无符号数字类型 | id=65531 | id=-65531]22236]0^]1 |
INTEGER | 32位有符号数字类型 | id=-655312 | id=-2714442]2344126]33441 |
UINT32 | 32位无符号数字类型 | id=65537 | id=4011341512]26]33 |
INT64 | 64位有符号数字类型 | id=-551533527 | id=-2416664447]236]133 |
UINT64 | 64位无符号数字类型 | id=23545114533527 | id=12416664447]121436]2 |
FLOAT | float类型(32位)的浮点 | id=3.14 | id=3.25]3.50]3.75 |
DOUBLE | double类型(64位)的浮点 | id=3.1415926 | id=-3.1415926]26.1444]55.1441 |
STRING | 字符串类型 | id=abc | id=abc]def]dgg^]dd |
索引特性
多值排重
可以在schema配置中,将多值正排字段配置为去重正排索引,引擎会通过将doc的正排字段取值进行Hash的方式,将值相同的doc对应的值存储在同一地址,从而达到共用存储空间,存储去重的目的。去重的效果依赖于字段的取值情况。
单值正排和多值正排(offset)等值压缩
可以在schema配置中,将单值正排字段或者多值正排字段配置为等值压缩索引个数,引擎会将N个(2^n)连续文档的单值value(或者多值offset)进行等值压缩存储,即N个文档全相同则只存储一份,如果N个文档存在不同值则存储最小值和每个值与最小值的delta压缩值,从而达到存储空间的目的。多值正排offset的压缩效果在等值压缩效果好的前提下会有更好的压缩表现。
多值正排索引的可更新
对于多值正排索引默认为不可更新,可以显示配置为可更新。对于多值更新场景,在离线索引和在线索引的场景会有更新方式的区别。
在线场景下:对于配置为可更新的多值正排字段,会在内存中开辟一个可扩展的分片内存区域用来存储更新的value值,同时会将原先value对应的offset指向新的扩展分片地址,从而实现实时多值更新的功能。
离线场景下:对于配置为可更新的多值正排字段,会将更新的value通过patch文件的方式进行存储,在线加载patch文件并拷贝到扩展分片地址中,用来进行更新数据的读取。
pack attribute存储方式
可以将同一个文档的一组attribute进行打包按行存储。
在attribute数据使用过程中,由于紧密的存储对cpu数据缓存更加友好(减少cache miss),对一篇文档中的打包存储的attribute字段数据连续读取在性能表现上明显优于字段按列存储的方式。
索引压缩
多值排重
默认情况下,多值 Attribute 的值是按照文档顺序依次排列的(offset 是递增的)。实际应用中发现,多值存在着大量的重复,即很多个文档具有相同的 Attribute 值。打开多值排重功能,可以去除索引中重复值,从而缩小最终产出的索引大小。
此功能,除多值 Attribute 和单值 String 外,还适用于 Section Attribute。
由于排重的过程,需要引入排重词典的等辅助数据结构,会增加 Build 和 Merge 的内存开销,所以,如果字段重复度很低时,不建议配置。
等值压缩
实际应用中,单值 attribute 和多值 attribute 的 offset 值在按照某个字段全局排序后,相等的值经常连续出现,如果对连续出现的相等值数组进行压缩能够获得较大的存储空间收益。等值压缩就是通过用更少的 Bit 位来代表这些重复值,来压缩索引的。
此功能,适用于单值和多值 Attribute 的 Offset 文件。对于多值 Attribute (包括单值 String) 和 Section Attribute 可以同时使用多值排重和等值压缩。
自适应Offset
由于每个多值 Attribute 都是单独存储的,Schema 中多少多值 Attribute 就要产生多少 Offset 文件,如果每个 Offset 都使用 8Bit 长度,将是一种极大的浪费。因此,我们支持了一种叫做自适应 Offset 的功能,当产生的 Data 文件长度不足 4GB 时,使用 4Bit 存储。无需配置。
配置样例
{
...
"fields":[
{
"field_name":"category",
"field_type":"INTEGER",
"multi_value":true,
"compress_type":"uniq|equal"
},
{
"field_name":"price",
"field_type":"INTEGER",
"user_defined_param":{
"key":"hello"
}
}
]
...
}
multi_value:true/false,默认为false,表示字段是否为多值。
compress_type: 指定该字段作为attribute字段存储时的压缩方法,默认值为空字符串(不压缩)。可选项:
值排重:uniq
等值压缩:equal
patch 文件压缩:patch_compress
可同时配置多项,使用 | 分隔,如:uniq | equal
多值float压缩:支持 block_fp,fp16,int8#N(N表示一个数值,表示float的值在-N和+N之间)
单值float压缩:支持 fp16,int8#N;注意配了单值float压缩就不支持再配置uniq | equal压缩