词典压缩
词典中一般包含三部分信息,原词,df,及倒排索引指针.其中要压缩的是原词,存在不规则性
如果都去开辟最大那个原词的字节空间,那么整个字典树将有非常大的空间浪费.
将单词单独抽取出来放在一个单独的存储区内,原词的位置存放指向该词语的指针.
再次优化可以将指针在某个范围内仅仅保存一个指针,在单词存储区保存原词及词长.
倒排列表压缩算法
评价索引压缩算法的指标:压缩率,压缩速度,解压速度,先对搜索引擎而言解压速度更加重要(响应查询)
一元编码:对于整数X,使用X-1个二进制数字1和末尾0来表示.如 4 表示为 1110
二进制编码:根据不同数字采用不同比特宽度来编码 如 1 <1> 3<11> 9 <1001>
Elias Gamma 和 Elias Delta 算法
Elias Gamma将数字按照如下函数拆解: x =2
ⁿ +d
对n+1采用一元编码,d采用二进制编码bit的宽度为n
12 ---> 1110:100
Elias Delta 相当于两次Elias Gamma算法,第二次对 n +1 再次进行一次 Elias Gamma
12 ---> 110:00:100
Golomb 算法 与 Rice 算法
这两个算法采用的因子解析式相同,如下:
因子1 = (X-1)/b
因子2 = (X-1)mod b
不同在于对b的选取上:
Golomb 算法 : b = 0.69 * avg
Rice 算法: b 为小于avg的最大2的次幂
因子1采用 一元编码 因子2 采用 二进制编码 bit宽度为 log2(b)
变长字节算法:
一个字节为8bit 最大只能存储的数为 256,如果再大的话,需要增长字节.
再字节的首位存一个标识符,标识出,是否为该数字表示的最后一个字节,来完成多个字节的组合表示数字(一个字节有效bit为7位)
simpleX系列算法:
将四个个字节划分为两个区域,一个为类型指示(4bit),一个为数据存储,不断的循环查询一个数据储存列表,直到满足指定的储存类型,将数据存入,
PForDelta算法
解压最快的
一次性读取K个数值,取出其中一定比例的最大数,当做异常数据倒序存在数据存储区尾端,将其余的数据统计得出需要采用多少个bit来压缩存储.在原来的异常数据位置存上指针.指向下一个异常数据.
文档编号重排序
倒排列表中存储的文档id是计算差值后的存储,如果能将文档相似度高的文档分在一个分类中,再赋予文档id,那么该文档中term后跟的文档id的差值将会大大降低.从而提高压缩率
其中需要对文档进行聚类.来进行类别的划分