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

今天的内容是对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]做减法。

整理完毕

[Search Engine] Compression in Inverted Index的更多相关文章

  1. [IR] Inverted Index & Boolean retrieval

    教材:<信息检索导论> 倒排索引 How to build Inverted Index? 1. Token sequence. 2. Sort by terms. 3. Dictiona ...

  2. Search Engine Hacking – Manual and Automation

    Search Engine Hacking – Manual and Automation Ethical Hacking Boot Camp OUR MOST POPULAR COURSE! CLI ...

  3. 42 Bing Search Engine Hacks

    42 Bing Search Engine Hacks November 13, 2010 By Ivan Remember Bing, the search engine Microsoft lau ...

  4. [DataMining]WEEK1 - text-retrieval and search engine

    What does a computer have to do in order to understand a natural language sentence? What is ambiguit ...

  5. [Search Engine] 搜索引擎技术之倒排索引

    倒排索引是搜索引擎中最为核心的一项技术之一,可以说是搜索引擎的基石.可以说正是有了倒排索引技术,搜索引擎才能有效率的进行数据库查找.删除等操作. 1. 倒排索引的思想 倒排索引源于实际应用中需要根据属 ...

  6. [Search Engine] 搜索引擎分类和基础架构概述

    大家一定不会多搜索引擎感到陌生,搜索引擎是互联网发展的最直接的产物,它可以帮助我们从海量的互联网资料中找到我们查询的内容,也是我们日常学习.工作和娱乐不可或缺的查询工具.之前本人也是经常使用Googl ...

  7. [CareerCup] 10.7 Simplified Search Engine 简单的搜索引擎

    10.7 Imagine a web server for a simplified search engine. This system has 100 machines to respond to ...

  8. 开源搜索 Iveely Search Engine 0.6.0 发布 -- 黎明前的娇嫩

    快两年了,Iveely Search Engine已经走过了5个版本的岁月,虽出生“贫寒”,没有任何开源基金会的支持,没有优秀的“干爹.干妈”,它凭着它的爱好者的支持,0.6.0终于破壳而出,7年前, ...

  9. [0.0]Analysis of Baidu search engine

    Rencently, my two teammates and I is doing a project, a simplified Chinese search engine for childre ...

随机推荐

  1. DOM 之Range(范围)

    -------<javascript高级程序设计>  12.4 范围  笔记------- DOM2级在Document类型中定义了createRange()方法,在兼容DOM的浏览器中, ...

  2. 前端技术-svg简介与snap.svg.js开源项目的使用

    前言-为什么学习snap.svg.js 前阵子webAPP的技术群里有人感觉到svg+animate的形式感觉很炫,矢量图任意放大且不需要下载图片,并且在手机端效果流畅. (矢量图与位图最大的区别是, ...

  3. CSS XHTML规范化命名参考

    CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:l ...

  4. android应用开发之Window,View和WindowManager .

    ViewManager  vm = a.getWindowManager(); vm.add(view,l); window :一个抽象的窗口基类,控制顶层窗口的外观和行为.作为顶层窗口,可控制窗口背 ...

  5. cf C. Valera and Elections

    http://codeforces.com/contest/369/problem/C 先见边,然后dfs,在回溯的过程中,如果在这个点之后有多条有问题的边,就不选这个点,如果没有而且连接这个点的边还 ...

  6. FJ省队集训DAY3 T1

    思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的 ...

  7. Codeforces 540D Bad Luck Island

    http://codeforces.com/problemset/problem/540/D 题目大意: 会出石头.剪刀.布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人 ...

  8. Qt浅谈之二十App自动重启及关闭子窗口

    一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...

  9. 【Xamarin开发 Android 系列 8】 创建一个Json读取数据应用(上)

    后续将内容贴上来...........

  10. coursera上的软件安全课程的课后阅读补充

    在coursera选修了一门软件安全的课程.下面是教授列出来的阅读: Week 1 Readings Required reading The only required reading this w ...