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
域包含下列内容:
- The quick brown fox jumped over the lazy dog
- 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 |
两个文档都匹配,但是第一个文档比第二个匹配度更高。当然了,上面的反向索引存在点问题,比如Quick
和quick
,dogs
和dog
,可以作为相同词根进行索引,但还是不够的,需要进一步分析。