Inverted Index, 也就是反向索引(倒排索引)。反向索引结构是典型的搜索引擎算法重要的部分。

常规的索引是文档到关键词的映射,但是这样的话检索关键词会比较慢,需要遍历一个又一个的文档。反向索引是从关键词到文档,这样可以根据关键词找到它在哪个文档里出现。

一个未经处理的数据库中,一般是以文档ID作为索引,以文档内容作为记录。而Inverted index 指的是将单词或记录作为索引,将文档ID作为记录,这样便可以方便地通过单词或记录查找到其所在的文档吗。

以英文为例,下面是要被索引的文本:

T0 = "it is what it is"
T1 = "what is it"
T2 = "it is a banana"

可以得到下列的反向文件索引:

"a": {2}
"banana": {2}
"it": {0, 1, 2}
"is": {0, 1, 2}
"what": {0, 1}

还可以在反向索引里面加上单词出现的位置,比如"banana": {(2, 3)}表示banana出现在第三个文本的第四个位置。

反向索引在ElasticSearch里面也被使用到(Lucene)。假设有2个文档,文档的content域包含下列内容:

  1. The quick brown fox jumped over the lazy dog
  2. Quick brown foxes leap over lazy dogs in summer

为了创建反向索引,首先将每个文档的content拆分成词(称为词条token),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。如下所示:

Term Doc_1 Doc_2
Quick X
The X
brown X X
dog X
dogs X
fox X
foxes X
in X
jumped X
lazy X X
leap X
over X X
quick X
summer X
the X

如果我们想搜索quick brown,我们只需要查找包含每个词条的文档:

Term Doc_1 Doc_2
brown X X
quick X
Total 2 1

两个文档都匹配,但是第一个文档比第二个匹配度更高。当然了,上面的反向索引存在点问题,比如Quickquickdogsdog,可以作为相同词根进行索引,但还是不够的,需要进一步分析

参考

维基百科
ElasticSearch文档