从图中可以看出,倒排索引一般分为三个模块(有些因为倒排列表k、v对中v的值太大,也会建立四个模块,比如我厂的索引☺)。这三个模块分别为:词典列表、倒排列表、倒排数据。图中描述的是把词典列表放入内存,其他放入硬盘,但目前我接触到的倒排索引是将这三个模块都读入内存,在服务器资源充足的情况下,这样也能提升索引速度。
简单来说就是以词为key,该词在倒排列表的位置index以及文章数量len为v,建立map结构。v定位的是包含该词的所有文章在倒排列表的起始位置index,以及文章数量len,即只要遍历倒排列表中以index起始,长度为len的数据,就可以得到所有需要的文章。其中key可以用词的MD5,减少空间。
倒排列表可以为一个数组结构,k即文章的index(对于每一个文章是自加的),v为文章在倒排数据中的实际寻址地址(可以理解为虚地址的实际地址)。这样,对应一个词,即可以寻址到其实际存储地址。
倒排数据即是最后需要查找的文章的内容了,通过倒排列表的实际地址得到,其可以是一个char结构,在制作倒排数据的时候,手动对每一个文章末尾添加’\0’。
以上就是一个简单的倒排索引的数据以及寻址方式了,当然在复杂的搜索环境中,倒排数据中会增加一些统计方面的工作(比如词在文章的第几个位置,TF·IDF信息等,也有通过生成另外一份数据来存储文章的相关信息,k为文章,v为需要的信息),下面说一下生成倒排索引的算法逻辑。
分词、停用词、英文去词根之类的就不谈了,这里假设已经有了对文章分好词的数据N,即每一行有两列,第一列为词W的集合,第二列为包含该词的文章T的集合,有:
参考: 《这就是搜索引擎》