[Search Engine] Compression in Inverted Index
最近在学一些搜索引擎的内容,感觉挺费劲,所以就用博客当做自己的笔记,遇到一些需要整理的部分,就在这里整理一下。
今天的内容是对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的更多相关文章
- [IR] Inverted Index & Boolean retrieval
教材:<信息检索导论> 倒排索引 How to build Inverted Index? 1. Token sequence. 2. Sort by terms. 3. Dictiona ...
- Search Engine Hacking – Manual and Automation
Search Engine Hacking – Manual and Automation Ethical Hacking Boot Camp OUR MOST POPULAR COURSE! CLI ...
- 42 Bing Search Engine Hacks
42 Bing Search Engine Hacks November 13, 2010 By Ivan Remember Bing, the search engine Microsoft lau ...
- [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 ...
- [Search Engine] 搜索引擎技术之倒排索引
倒排索引是搜索引擎中最为核心的一项技术之一,可以说是搜索引擎的基石.可以说正是有了倒排索引技术,搜索引擎才能有效率的进行数据库查找.删除等操作. 1. 倒排索引的思想 倒排索引源于实际应用中需要根据属 ...
- [Search Engine] 搜索引擎分类和基础架构概述
大家一定不会多搜索引擎感到陌生,搜索引擎是互联网发展的最直接的产物,它可以帮助我们从海量的互联网资料中找到我们查询的内容,也是我们日常学习.工作和娱乐不可或缺的查询工具.之前本人也是经常使用Googl ...
- [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 ...
- 开源搜索 Iveely Search Engine 0.6.0 发布 -- 黎明前的娇嫩
快两年了,Iveely Search Engine已经走过了5个版本的岁月,虽出生“贫寒”,没有任何开源基金会的支持,没有优秀的“干爹.干妈”,它凭着它的爱好者的支持,0.6.0终于破壳而出,7年前, ...
- [0.0]Analysis of Baidu search engine
Rencently, my two teammates and I is doing a project, a simplified Chinese search engine for childre ...
随机推荐
- JavaScript 高级程序设计 第5章引用类型 笔记
第五章 引用类型 一.object类型 1.创建方法: 1.使用new 操作符创建 var person=new object() Person.name=”Nicholasa” Porson.age ...
- HTML5画布(变形)
坐标变换 案例1: <!DOCTYPE html><html><head lang="en"> <meta charset="U ...
- Jmeter实现WebSocket协议的接口和性能测试方法
WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). 浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一 ...
- uC/OS-II内核架构解析(1)---嵌入式RTOS(转)
uC/OS-II内核架构解析(1)---嵌入式RTOS 1. 嵌入式系统基本模型 2. RTOS设计原则 采用各种算法和策略,始终保持系统行为的可预测性.即在任何情况下,在系统运行的任何时刻,OS的资 ...
- Swift 可选链-备
在Swift程序表达式中会看到问号(?)和感叹号(!),它们代表什么含义呢?这些符号都与可选类型和可选链相关,下面来看看可选链. 可选链: 类图: 它们之间是典型的关联关系类图.这些类一般都是实体类, ...
- Activity切换效果(overridePendingTransition)
在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...
- SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
SQL 连接 JOIN 例解.(左连接,右连接,全连接,内连接,交叉连接,自连接) 最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连接的问题,回答不尽理想-现在在这写写关于它们的作用假设有 ...
- 【转】64位win7硬盘安装64位ubuntu 13.04
原文网址:http://www.cnblogs.com/jiangz/p/3751617.html 最近本来是准备通过升级的方式把ubuntu从12.04升级到12.10再升级到13.04的,但是升级 ...
- android Service简介及启动关闭方式
(1)Service是Android系统中的四大组件之一,和Activity是同一层次的组件:它是一种生命周期较长,没有可视化界面,运行于后台的一种服务:例如,我们听音乐可以使用Service,下载东 ...
- 一个跨域请求的XSS漏洞再续
上回提到,由于需要使用代理页面解决POST请求的跨域请求,需要在代理页面上执行传递的函数.所以我们做了白名单只有我们认可的回调函数才能在页面上执行,防止执行非法的JS方法,做脚本攻击. 我们所采用的方 ...