正排索引压缩

多值排重

默认情况下,多值 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压缩