最近在学一些搜索引擎的内容,感觉挺费劲,所以就用博客当做自己的笔记,遇到一些需要整理的部分,就在这里整理一下。

今天的内容是对inverted index进行压缩。核心思想,用我自己的话来总结,就是“量体裁衣”。

量谁的体,又怎么裁呢?

我们要量的是“整数”的体。对于整数,int型的,默认是占用4或8个字节(bytes)。可是要知道,4bytes = 4 * 8 bits = 32 bits, 2^32 可是非常大的数啊,换句话说,对于那些很小的数,4,10,甚至是10000,我们根本用不上32个bit来存,太浪费了,所以我们要相应裁衣,你是小的数字就给你你需要的字节数。

具体裁法,按照微观到宏观的顺序有三种,分别是bit-level的Elias code, byte-level的V-byte,和int级别的delta。

1. Bit-align:

以2为底做瑜伽,前1后2把0夹,前后位数要相等,要想再压指数掐。

1.1) Elias-gamma encode:

     15 => 111 0 111

   这是怎么变出来的呢?15 = 2^3 + 7 (可以理解成2进制下的科学计数法),以2为底,指数为:3 = floor(log215), 再加上剩下的余数7,

   前1后2把0夹: 用一个0放在中间作为指数部分和余数部分的delimiter,指数部分1进制,后面的余数是2进制的。 

     前后位数要相等:指数部分有多少位,余数部分就要有多少位,不足的部分用0填充。

1.2) Elias-delta encode: 要想再压指数掐。

     经过上面的变换之后,如果指数还是很大的话,还是会非常占地方,我们对指数再来一次科学计数法的变换。

      但是要特别注意: dd = floor(log2(d+1)); dr  = d - 2dd + 1, 对数里面是(d+1)而不是d,是因为d有可能为0,如果是0, 那么log(d)就无意义了。dr 后面还有个+1是为了让dr一直是>=0。
   15 => 23 + 7 = 2 2^2 + 1 - 1  + 7 => 11 0 01 111

2. Byte-align: v-byte

但是实际情况是很多机器都是按byte读取的,那么我们要怎么适应这个情况呢?很简单,实报实销,用几个字节就给几个字节,比如4这个数字,1个byte就足够,我们就给你1个byte,而不是4bytes。

可是问题也来了,现在数字的字节数不固定了,那怎么知道从哪儿到哪儿是一个数字呢?我们再次启用indicator.把每个字节的第一位用作indicator, 剩下的7位来存数字。所以如果第一位是1,说明当前数字就在这个字节结束之后结束;如果是0,那么当前数字在当前字节结束之后还没有结束。

0 0000001 1 0000000 = 01 80 (hex) = 128

3. Integer level: delta

如果仔细观察前两个解压方法的话,我们可以发现,如果数字很小,就太棒了,如果都是127以为的话,全部可以用1个byte来表示。如果数字很大的话,就还是很麻烦。那怎么才能保持数字很小呢?那就是做减法。记录的数字不再是实际数字而是和上次的差。

例子:

  fish: (1, 2, [2,4]), (2, 3, [7, 18, 23])      # (1, 2, [2, 4])是说在第一篇文章中出现了2次,位置分别是2和4

=> fish:(1, 2, [2, 2]), (1, 3, [7, 11, 5])

注意:docid和根据之前的docid做减法;occurrence_count没有变(这位不能根据之前的count做减法,不然,如果count较前面的小话,会出现负数),occurrence_list是根据list[0]做减法。

整理完毕

最新文章

  1. Paxos
  2. 准备 KVM 实验环境 - 每天5分钟玩转 OpenStack(3)
  3. IIS报错:Exception from HRESULT: 0x8007000B解决方法
  4. NY-字符串替换
  5. 【Uploadify】远程上传图片到【七牛云存储】
  6. 轻松学习Linux之认识Shell
  7. 遍历并remove HashMap中的元素时,遇到ConcurrentModificationException
  8. jQuery在html有效,在jsp无效的原因
  9. 从零开始学习前端开发 — 11、CSS3选择器
  10. <3>Centos系统完整安装python流程
  11. elasticsearch补全功能之只补全筛选后的部分数据context suggester
  12. [三]JavaIO之IO体系类整体设计思路 流的概念以及四大基础分类
  13. 如何使用 IDEA 创建项目并且上传到 GitHub
  14. vue的渐进式理解
  15. 0. General-purpose tools (通用工具 8个)
  16. java开发师笔试面试每日12题(1)
  17. Fastreport.net 如何在开发MVC应用程序时使用报表
  18. Windows平台分布式架构实践 - 负载均衡(转载)
  19. iuplua test on luaforwindows
  20. 使用filezilla连接树莓派失败

热门文章

  1. tomcat启动报错总结
  2. 关于升级到win10后的网络问题
  3. ROBOTS.TXT屏蔽笔记、代码、示例大全
  4. Activiti工作流学习-----基于5.19.0版本(4)
  5. Git学习笔记01--初始化设置
  6. 关于取url或者微信中参数的js
  7. ios如何判断键盘是否已经显示
  8. Itext 中的文本信息绝对定位
  9. KEIL简单实例
  10. 转:ASP.Net MVC:校验、AJAX与过滤器