索引
首先我们先介绍下索引(Index)。索引本质上是一种记录信息的信息,它本身占较小的体积,但记录了关键字在整个系统中出现的位置。日常生活中,我们也有很多使用索引的例子,比如一本图书,它的目录就是一个索引文件,每条索引记录了章节所在页码,能使读者快速翻阅至所需章节。网页被抓取并经过分析系统分析后,索引系统便会给网页一个唯一的ID,并将网页ID和位置记录在索引文件中。
需要注意的是,由于网页是海量的,为了存储和计算考虑,网页ID会尽可能的短,并且最好是长整数而不是字符串。因为字符串在排序、查找时的性能远远不如整数,并且字符串字节数多,造成存储和内存压力加大。通常情况下会把URL映射成64位或128位的二进制数。
正排索引
正排索引是从网页到关键字的映射,一般含有网页ID、关键字(或关键字ID)、关键字出现次数、关键字出现位置等几个重要参数。例如给定两篇文档“中国人民爱中国”和“中国历史悠久”,经分词后创建的一个典型的正排索引如下所示:
其中,Hits代表了关键字在文档中出现次数,List代表了关键字出现在文档中的位置。
因此正排索引是通过网页来寻找关键字,可以知道一个网页中是否包含了某个关键字、关键字出现了几次以及关键字出现的位置。但是网页检索是通过关键字来找文档,因此需要把正排索引转换为倒排索引,才能满足实际的需求。
倒排索引
倒排索引是从关键字到文档的映射,可以分为两个部分。
第一部分为索引文件,记录了关键字(或关键字ID)、出现在多少文档中以及这些文档在文档库中的偏移量。
第二部分为文档文件,记录了文档ID、关键字出现次数以及关键字在文档中出现的位置。
例如:词“中国”在两篇文档中均出现,则nDocs=2,Offset分别为两篇文档的偏移地址。根据两个地址分别找到DocID为000001和000002的文档。“中国”在第一篇文档中出现了2次,偏移量分别为0,3,在第二篇文档中出现了1次,偏移量为0。
这样输入任意一个关键字,通过搜索索引文件,就能找到对应的文档地址,再根据文档地址在文档文件中查找,就能找到相关文档并能显示关键字在各文档中的位置。