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

今天的内容是对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. 面试题,自己写写dome总是好的

    1.完成如下图所示的布局 <html> <head> <meta http-equiv="Content-Type" content="te ...

  2. jquery的.detach()方法

    .detach()就是从DOM中删除所有匹配的元素. 与.remove()方法不同的是, 这个方法不会把匹配的元素从jQuery对象中删除,所有绑定的事件.附加的数据等都会保留下来,因而可以在将来再使 ...

  3. JS模拟键盘事件 -- 原理及小例子

    提问: 键盘默认事件,比如tab切换,alt+f4关闭,ctrl+t新建等,如果不想通过键盘而是一些按钮点击来触发这些功能,该咋办呢? 例子: 先以tab为例上一个小例子: <!DOCTYPE ...

  4. MVC 4.0 Razor模板引擎 @Html.RenderPartial 与 @Html.RenderAction 区别

    近来在学习MVC 4.0,设置布局全局网页的页脚,使用了Razor语法 @{ Html.RenderPartial("Footer", Model.FooterData); } 但 ...

  5. MySQL常用时间函数

    官方文档:Date and Time Functions Name Description ADDDATE() Add time values (intervals) to a date value ...

  6. Js树型控件Dtree使用

    dtree地址:http://destroydrop.com/javascripts/tree/ Key features Unlimited number of levels 无限级 Can be ...

  7. BZOJ3016: [Usaco2012 Nov]Clumsy Cows

    3016: [Usaco2012 Nov]Clumsy Cows Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 52[Submi ...

  8. java进阶计划

    鉴于自己在java 的学习过程中,像是无头苍蝇一样,东扎一把,西戳一下,没有一个明确的方向,也没有一个比较明确的方面,所以有了这个大致的计划. 计划的目标: 1. java本身的目标 对线程(thre ...

  9. Oracle insert update 时间处理

    24小时表示方法:to_date(’ ::’,’yyyy-mm-dd hh24:mi:ss’) 12小时表示方法:to_date(’ ::’,’yyyy-mm-dd hh:mi:ss’) ','S75 ...

  10. UGUI 全方位了解

    随着 unity3d 4.6 ~ 5.x + 新 UI 系统最终与大家见面了.这篇文章将不会介绍怎样使用button.滚动栏之类的UI控件.这些内容能够參考Unity Manual:这篇文章的重点是. ...