倒排索引(Inverted index),顾名思义,是一种反向的索引。首先我们先来看一下索引的概念,索引好比书的目录,通过目录可以快速找到想要的章节。而倒排索引就相当于知道章节的内容,就可以找到目录的信息。可能这样子类比还不是很清楚,那么我们就举一个简单的例子来说明一下。
假设我们有三句话:
T[0] = "it is what it is"
T[1] = "what is it"
T[2] = "it is a banana"
在这里,我们的索引是建立在位置(position)和单词(word)之间建立。
常规索引是指通过位置找到相应的单词,比如:T[0]的第一个单词是it,可以记为 (0,0) : "it",再如 (2,1) : "is"。
倒排索引则是反过来,通过单词获取位置,比如:"it" 这个单词出现的位置有 (0,0) (0,3) (1,2) (2,0),这样可以记为 "it" :{(0,0) (0,3) (1,2) (2,0)}。通过对上述三句话建立倒排索引可以得到:
"a" : {(2,2)}
"banana" : {(2,3)}
"is" : {(0,1) (0,4) (1,1) (2,1)}
"it" : {(0,0) (0,3) (1,2) (2,0)}。
"what" : {(0,2) (1,0)}
通过构建好的倒排索引,使得我们可以很方便的实现对语句的检索,比如: 需要检索包含"what" "is" "it"三个单词的语句,忽略倒排表中的第二位(单词在每句中的位置),可以得到 {0 1}∩{ 0 1 2}∩{0 1 2} = {0 1},因此我们断定T[0]和T[1]满足条件。在检索 "what is it"这个词组的时候还需要考虑到单词的具体位置,因此我们只能够获取到 T[1] 满足条件{(1,0) (1,1) (1,2)}。
总结,上面的分析可以告诉我们,单词或语句的检索在构建好倒排索引之后可以转化成一个集合求解的问题,而不用逐行逐字的扫描,这使得检索效率得到大大地提高,这也就是为什么倒排索引在搜索领域如此重要的原因。同样有个问题摆在面前,建立倒排索引是非常耗时的。所幸的是这个过程可以离线完成。
更多的资料信息请参考百度维基百科,百度百科,以及相关论文等等