一、正排索引(前向索引)

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

(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,因此一个标记结束符的字段有效地压缩了正排索引的大小。

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

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

二、倒排索引

倒排索引是一种以关键字和文档编号结合,并以关键字作为主键的索引结构。倒排索引分为两个部分。

(1)第1个部分:由不同索引词(index term)组成的索引表,称为"词典"(lexicon)。其中保存了各种中文词汇,以及这些词汇的一些统计信息(例如出现频率nDocs),这些统计信息用于各种排名算法(Ranking Algorithm) [Salton 1989;Witten 1994]

(2)第2个部分:由每个索引词出现过的文档集合,以及命中位置等信息构成,也称为"记录表"(posting file)或"记录列表"(posting list)。如图4-6所示。

 
(点击查看大图)图4-6  倒排索引

左边的表结构(词典)记录索引词Id号、匹配该索引词的文档数量,并匹配文档在记录文件内的偏移量,通过这个偏移量就可以读取记录文件对应区域的信息。例如在图4-6中,通过读取T1的偏移量x,读取在记录文件中T1命中的相关文档Doc1、Doc2和Doc3的相关信息。

右边的表结构(记录表)记录文档编号(DocId)、索引词在该文档的命中个数(NHits),以及命中域的列表(HitList)。例如在图4-6中,记录文件显示了T2关键词在Doc1中出现了3次。

图4-6所示的倒排索引示例中,以索引词T2为例,T2在两个文档中出现。通过偏移量在记录文件中找到了存放与T2有关的信息,即T2匹配的Doc1和Doc2两个文档,并且在Doc1中出现了3次,位置分别为3、5和7(图中3、2和2表示为差分序列后的实际值,即3、5-3和7-5)。

注意到这种按照索引词组织文档的方式,在索引词WordId一边,其Id号不会重复;而在DocId一边,由于每个文档都可能包含多个索引词,DocId的重复非常普遍,因此对DocId就需要进行大规模的压缩。

压缩编码也采用Variable Byte Coding编码方法进行压缩,首先对DocId排序,接下来将DocId的递增序列为差分序列,最后用Variable Byte Coding编码方法进行压缩编码。例如这样的DocId序列(22,5,9,1),通过排序得到(1,5,9,22),变差分序列得到(1,4,4,13),压缩编码后得到(2,8,8,26),对于小于128的数进行压缩编码,相当于乘2(详细参见本章第三节中的相关内容)。

最后,在倒排索引中,按照何种顺序存放DocId更加有利于检索呢?在图4-6中,T1这个词有Doc1、Doc2、Doc3与之相匹配,也就是在这些文档中都出现了T1,那么在倒排索引的记录表中,哪个文档编号先存放,哪个文档编号后存放呢?这种存放顺序的策略大致有如下3种。

(1)按照DocId升序存放。

(2)按照索引词在文档中出现次数降序存放。

(3)记录表分块存放,块内按DocId升序存放,块间按PageRank值降序存放。

对于方案1来说,它有助于在多关键词查询中,得到相同的DocId(在第六章中介绍查询系统时,会提到因为DocId有序而为查询带来的好处)。并且能够对DocId进行压缩编码,同时降低磁盘I/O的开销。

对于方案2来说,按照索引词Id在文档中出现的次数降序排序,因为索引词出现次数多的文档与查询关键词的相关性越好(这里,索引词和关键词是同一个词,在索引系统中称为"索引词",在查询系统中称为"关键词"或"查询词"),这是很自然的,检索就是检索哪些与查询词相关性高的文档。文献[S. Brin 1998]阐述了一种折中的设计方案,即不同的索引词命中区分对待,对于索引词在标题或者锚文本(Anchor)命中的文档,以及命中信息存放在一个记录表中,不妨称为"表A",表内数据按DocId排序;命中其他位置的文档及其命中信息存放在另一个记录表中,称为"表B",同样表内数据也是按照DocId排序。这样对于每个索引词的查询,优先在表A中查询。只有当结果数不够时,再到表B中查询。这样既照顾到了压缩存储的需要,也照顾到了相关性,通常标题中的词大多在正文中会多次出现。当然这种折中的方法有时也不够合理,它过分倚重于锚文本的关键词,常常被针对这种算法作弊的网页设计者利用。

对于方案3来说,一方面照顾到了方案1的索引压缩功能(文档按序存储);另一方面照顾了重要的文档在检索过程中优先被检索的需要,而且防止了方案2中由网页设计者作弊可能带来的麻烦。有些网页设计者在网页中正文,锚文本中堆砌大量经常被查询的重要关键词,因此方案2在设计上不可避免的缺陷容易被利用。当然PageRank算法也会被作弊者利用,然而PageRank的作弊较为困难,所以方案3是较为理想的解决方案。

最后,总结一下正排索引和倒排索引的关系。本质上说,存在这样两个空间,一个称为"索引词空间",一个称为"文档空间"。正排索引可以理解成一个定义在文档空间到索引词组空间的一个映射,任意一个文档对应唯一的一组索引词;而倒排索引可以理解成一个定义在索引词空间到文档组空间的一个映射。任意一个索引词对应唯一的一组该索引词其命中的文档。因此从文档到正排索引,进而从正排索引到倒排索引就是理顺这种关系的过程。使得给出一个索引词,就能通过倒排索引能够找到其命中的文档,以及位置信息。

原文链接:http://book.51cto.com/art/201105/262903.htm

正排索引(forward index)与倒排索引(inverted index) (转)的更多相关文章

  1. 正排索引(forward index)与倒排索引(inverted index)

    正常的索引一般是指关系型数据库里的索引. 把不同的数据存放到不同的字段中.如果要实现baidu或google那种搜索,就需要与一条记录的多个字段进行比对,需要 全表扫描,如果数据量比较大的话,性能就很 ...

  2. 后端程序员之路 35、Index搜索引擎实现分析4-最终的正排索引与倒排索引

    # index_box 提供搜索功能的实现- 持有std::vector<ITEM> _buffer; 存储所有文章信息- 持有ForwardIndex _forward_index;  ...

  3. es倒排索引和正排索引

    搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values.在建立索引的时候,一方面会建立倒排索引, ...

  4. Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据

    相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...

  5. 16 doc values 【正排索引】

    搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values 在建立索引的时候,一方面会建立倒排索引, ...

  6. 52.基于doc value正排索引的聚合内部原理

    主要知识点: 本节没有太懂,以后复习时补上       聚合分析的内部原理是什么????aggs,term,metric avg max,执行一个聚合操作的时候,内部原理是怎样的呢?用了什么样的数据结 ...

  7. Elasticsearch的索引模块(正排索引、倒排索引、索引分析模块Analyzer、索引和搜索、停用词、中文分词器)

    正向索引的结构如下: “文档1”的ID > 单词1:出现次数,出现位置列表:单词2:出现次数,出现位置列表:…………. “文档2”的ID > 此文档出现的关键词列表. 一般是通过key,去 ...

  8. ElasticSearch(二十一)正排和倒排索引

    1.区别 搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values 在建立索引的时候,一方面会建立 ...

  9. ES系列七、ES-倒排索引详解

    1.单词——文档矩阵 单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,图3-1展示了其含义.图3-1的每列代表一个文档,每行代表一个单词,打对勾的位置代表包含关系. 图3-1 单词-文档矩 ...

随机推荐

  1. BZOJ4975 区间翻转

    这个范围给的很像区间dp之类的,想了半天没一点思路,滚去看了一眼status被吓傻了.然后瞎猜了一发结论就过掉了. 求出逆序对数,判断是否为奇数即可.因为翻转区间会把将这段区间的逆序对取反,而长度为4 ...

  2. 我是一个CPU:这个世界慢!死!了!

    最近小编看到一篇十分有意思的文章,多方位.无死角的讲解了CPU关于处理速度的理解,看完之后真是豁然开朗.IOT时代,随着科技的发展CPU芯片的处理能力越来越强,强大的程度已经超乎了我们的想象.今天就把 ...

  3. BZOJ2006:[NOI2010]超级钢琴——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2006 https://www.luogu.org/problemnew/show/P2048#su ...

  4. CentOS 7网络故障

    By francis_hao    Nov 2,2017   在像往常一样打开了虚拟机后,打开xshell准备连接到centos,可是连不上,发现连接的网卡没有启动,使用systemctl启动netw ...

  5. maven私服Nexus3.2的使用

    maven搭建私服的步骤: 分三步: 第一步:下载maven的安装包,然后配置好maven的环境变量. 第二步:将maven的私服Nexus安装好,修改maven的配置文件setting.xml问,在 ...

  6. 【题解】Points, Lines and Ready-made Titles Codeforces 871C 图论

    Prelude 真是一道好题,然而比赛的时候花了太多时间在B题上,没时间想这个了QAQ. 题目链接:萌萌哒传送门(.^▽^) Solution 观察样例和样例解释,我们发现,假如有四个点,恰好占据在某 ...

  7. JAX-WS搭建WebService和客户端访问程序

    开发环境:myeclipse8.6+jdk1.6.0_29+tomcat6.0.37 XFire搭建webservice: http://www.cnblogs.com/gavinYang/p/352 ...

  8. 理解PV操作和信号量

    对于信号量,可以认为是一个仓库,有两个概念,容量和当前的货物个数. P操作从仓库拿货,如果仓库中没有货,线程一直等待,直到V操作,往仓库里添加了货物,为了避免P操作一直等待下去,会有一个超时时间. V ...

  9. 2017北京国庆刷题Day5 afternoon

    期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...

  10. JQuery之validate入门

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...