加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

正排表与倒排表的合并

(2013-07-10 14:07:08)
分类: 技术

1.  涉及存储规模的一些计算

前面提到对于索引目前100亿中文网页进行倒排索引需要TB级的存储空间,这么大规模的数据如何生成?在生成后如何存储?存储后如何支持高效的检索?这一连串的问题将在本节解答。

1.1  正排表与倒排表的合并

下载系统将抓取网页存放在网页库中,分析系统在分析后得到网页对象发送给索引系统,因此索引不停地得到这样的网页对象。由于网页对象在分析系统中进行了分词计算,最终分析的结果发往索引系统。

在索引系统中,通过计算不难得到如图4-10所示的正排表。在实际操作中,正排表不写入文件,而是保存在内存中。可以理解为内存中存储的正排索引,是正排索引的一种具体表现形式,同理,倒排表也是内存中存储的倒排索引,也是倒排索引的一种具体表现形式。

http://images.51cto.com/files/uploadimg/20110518/234804842.jpg 
图4-10  正排表
图4-11所示是一个倒排表,它们如何合并呢?
http://images.51cto.com/files/uploadimg/20110518/234817438.jpg 
图4-11  倒排表
正排表与倒排表合并的结果如图4-12所示。
http://images.51cto.com/files/uploadimg/20110518/234841910.jpg 
图4-12  正排表与倒排表合并的结果
如图4-12所示,T1是文档Docx的一个词汇。在左边的词典中找到T1的位置,然后通过其Doclist位置域存放的DocList位置信息找到记录表。并将文档编号(DocId)、在文档命中的次数(NHits),以及命中的位置列表(HitList)作为倒排表中的记录表中的一个记录。可以认为正排表和倒排表合并的过程,就是正排表中的数据追加倒排表的数据过程。追加后,正排表并不保留。而倒排表在内存中存储一定的记录后,成批顺序地写入磁盘,成为临时倒排文件(本章约定,在提到正排表时,表示其存放在内存中;而特指倒排文件时,表示其存放在磁盘中),如图4-13所示。
http://images.51cto.com/files/uploadimg/20110518/234903763.jpg 
图4-13  临时倒排文件

众所周知,由于磁盘的存储特性,所以很难在较大文件的中间追加数据。追加数据就不得不进行大量的数据移动,这种开销是极大的。回到这个例子中来,如图4-13所示的临时倒排文件中无法再追加有关T1的记录。

综上所述,生成倒排文件之前,倒排表(图4-12)由于存放在内存中,因此可以任意追加数据。在顺序写入磁盘成为倒排文件后,倒排文件不再变化。但由于不断有新的数据需要进行索引,所以这样的临时倒排文件数量不可避免地还会不断增加。在导入全部需要作索引的数据后,索引系统会有多个这样的临时倒排文件,不妨假设共有64个这样的临时倒排文件。

出于性能上的考虑,在一次检索时只需要读取一个倒排文件即可得到全部与检索词相关的索引信息。而不是依次读取全部64个临时倒排文件,然后进行结果组合。因此必须将这64个临时倒排文件归并成一个更大的倒排文件,称为"最终倒排文件",其大小略小于64个临时倒排文件之和。因为在这64个临时倒排文件中分别保留了词典信息,所以这部分冗余的数据在归并成最终倒排文件后只需要保留一份词典即可。

在具体实现上,还有一种合并方法,简单说来就是将一个正排表(包含多个DocId的记录)通过对索引词排序的方法,然后一次性或者分批次地写入倒排表中。在第七节中会提到这个方法,我们这里先通过一个例子理解这个方法。首先正排表的结构需要进行调整,如图4-14所示。

http://images.51cto.com/files/uploadimg/20110518/234957784.jpg 
图4-14  支持排序的正排表

这里的正排表和前面介绍的稍有不同,可以看到LId被冗余地存放。

在内存中保留一块这样的区域存放正排表,每增加一个需要索引的文档,就在正排表中追加一条记录。当追加足够多的记录后,正排表足够大,并符合批量做倒排表的条件后,按照关键词编号(WordId)进行一次稳定排序(稳定排序可以参考有关数据结构的书籍,例如归并排序就是一种稳定排序),得到如图4-15所示的排序后的正排表,这里认为T1

http://images.51cto.com/files/uploadimg/20110518/235027205.jpg 
图4-15  排序后的正排表
在图4-15中,全部正排表记录按照WordId排序。由于采用稳定的排序,所以LId的顺序没有被破坏,图中T2 关键词对应的LId依然是1,2,3。由于在倒排表中WordId是顺序存放的,因此排序后的正排表可以依序逐个写入倒排表中,如图4-16所示。
http://images.51cto.com/files/uploadimg/20110518/235041447.jpg 
图4-16  排序后的正排表逐个写入倒排表中
通过估计,每个临时倒排文件的大小大约为100 MB,因此甚至可以不需要写入倒排表,而直接顺序写入磁盘中的临时倒排文件。这样就形成了内存中存放正排表,磁盘中放临时倒排文件的结果。



更多关于搜索引擎的知识可以查看http://book.51cto.com/art/201105/262872.htm

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有