搜索引擎之正排索引

转载出处:http://book.51cto.com/art/201105/262902.htm

正排索引也称为"前向索引"。它是创建倒排索引的基础,具有以下字段。

(1)LocalId字段(表中简称"Lid"):表示一个文档的局部编号。

(2)WordId字段:表示文档分词后的编号,也可称为"索引词编号"。

(3)NHits字段:表示某个索引词在文档中出现的次数。

(4)HitList变长字段:表示某个索引词在文档中出现的位置,即相对于正文的偏移量。

由于一篇文章中的某些词可能出现多次,而且位置不同,而全文检索的本质要求是把这些位置标识出来,因此HitList中的每个命中都表示索引词在文档的某个位置中出现了一次,这个序列为单调递增序列。基于游程编码的方法,变升序序列为差分序列,采用前文提到的Variable Byte Coding方法编码可以大大压缩正排索引的HitList字段。

在正排索引中LocalId采用升序序列编号(假定编号采用自增1的方式递增),这为下面的计算创造条件。进行倒排索引的转化时,由于正排索引中Lid天然的有序性,因此在正排索引转化为倒排索引的创建过程中,自然可以保证倒排索引中每个词汇对应的文档编号也是有序的,倒排索引将在下一节中介绍。

这样,正排索引如图4-3所示。

 
图4-3  正排索引
通过一个例子来了解正排索引的创建过程。假定存在这样一个编号为1的文档,其全文为"走进搜索引擎,学习搜索引擎",分词的结果为"走进/搜索引擎/学习/搜索引擎"。不妨为"走进"编号为"T1","搜索引擎"编号为"T2","学习"编号为"T3"。通过计算得到"走进"出现1次,出现位置为1;"搜索引擎"出现两次,出现位置为3和9(图中存放的为未压缩的差分序列3和6);"学习"出现1次,出现位置为7。创建的正排索引如图4-4所示。
 
图4-4  正排索引示例

HitList是变长的,因此需要NHits这个字段标记其长度,这样才能读出全部的正排索引数据。假定每个域都是一个字节大小,而HitList变长。在上面这个例子中,假定这个正排索引依次存放在一个数组Array中,则当读取到Array[2]时,读取的内容为T1的NHits,读出的结果为1。由于T1出现了1次,因此在T1的HitList中仅存放了一个位置信息。这样在读取Array[3]后,接下来读取Array[4]则能够判断为下一个索引词T2。正是由于NHits的这种表示长度的作用,全部的数据才能被有效地读取。

最后用NULL表示为一个结束符的这种设计是很巧妙的;否则,正排索引可能是这样,如图4-5所示。

 
图4-5  冗余存放DocId的正排索引

在图4-5中,为了结构化数据的需要,在去掉表示结束符的NULL后,正排索引必须冗余地存放DocId,因此一个标记结束符的字段有效地压缩了正排索引的大小。

本质上说,正排索引以文档编号为视角看待索引词,也就是通过文档编号去找索引词。任给一个文档编号,能够知道它包含了哪些索引词、这些索引词分别出现的次数,以及索引词出现的位置。然而全文索引是通过关键词来检索,而不是通过文档编号来检索,因此正排索引不能满足全文检索的要求。

虽然正排索引不能满足全文检索的需要,但是正排索引为创建倒排索引创造了有利条件,是计算倒排索引的不可缺少的一环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值