这是一篇copy 的文章就不标原创了
1)基本概念
文档
泛指一切以文本形式存在的存储对象,包括html、xml、word、pdf等等。
文档集合
多个文档组成的集合。
文档编号
在搜索引擎内部,为文档集合中的每个文档赋予的内部唯一编号,并以此作为唯一标识。
单词编号
在搜索引擎内部,为单词赋予的唯一表征。
倒排索引
一种单词-文档矩阵的具体实现形式,通过倒排索引,可以根据单词快速地定位包含单词的文档。倒排索引由单词词典和倒排文件组成。
单词词典
搜索引擎通常的索引单位是单词,单词词典是由文档中所有出现过的单词构成的字符串的集合,单词词典内每条索引项记录了单词本身的信息以及和指向倒排列表的指针。所以在用户进行查询时,搜索引擎会根据用户输入的查询词从单词词典中获取对应的倒排列表,再做之后的排序。
可见单词词典的查找效率直接影响搜索引擎的效率,常见的数据结构有哈希加链表结构和树形词典结构。
倒排列表
记录了某个单词出现的所有的文档的文档列表,以及该单词在文档中所处位置的信息,每条记录称为一个倒排项。根据倒排列表即可获知哪些文档包含某个单词。
倒排文件
所有单词的倒排列表往往顺序地存储在磁盘的某个文件中,这个文件即称为倒排文件,倒排文件是存储倒排索引的物理文件。
单词-文档矩阵
如图:
这里可以把文档理解为语句,当某单词在某文档中出现了,即在该坐标打钩。
单词的集合组成了词典,每个单词与文档的组合组成了倒排索引,倒排索引的结汇组成了倒排列表,倒排列表组成了倒排文件。
实例
如上图所示,我们已经有了文档并赋予了它们文档编号。
如图所示,我们在第一列赋予每个单词以单词编号,第二列为单词,第三列记录了单词在哪些语句中出现是为倒排列表。但是太过简单,所以我们再加入其出现的频率。
但即便这样,依然不足以满足我们搜索的预期,因此可以再在其上加上文档频率——表明多少文档包含这类单词。
例如在上图中< N >即表明了该单词在该文档中出现的位置。
以上即为一个完整的倒排索引系统。
2)索引的存储结构
上文中已经说过了,单词词典是倒排索引的一个重要组成部分,通过它可以找到单词的倒排列表在倒排文件中的位置。
Hash的存储方式
在建立索引的过程中,词典结构也会相应地被构建出来。比如在解析一个新文档的时候,对于某个在文档中出现的单词 T,首先利用哈希函数获得其哈希值,之后根据哈希值对应的哈希表项读取其中保存的指针,就找到了对应的冲突链表。如果冲突链表里已经存在这个单词,说明单词在之前解析的文档里已经出现过。如果在冲突链表里没有发现这个单词,说明该单词是首次碰到,则将其加入冲突链表里。这样的存储方式很类似于 Java 中 HashMap 解决 hash 冲突的方式。
树形结构
B 树(或者 B + 树的)存储方式,这点很类似于 Mysql 的 Innodb 的存储引擎中采用 B + 树的方式来存储索引,由于采用了 B 树的结构,即索引存储在是一个平衡树,避免了查询极端的情况,由于有序,所以能根据字典项需要的大小顺序来构建索引,这样在检索中可以快速通过字典项比较大小,最终确定叶子结点中词汇的存储地址信息。(由于 B 树的构建复杂,这里就不过多的讲解,向深入了解,可以翻翻上学那会儿的《数据结构》那本书喔)
参考文献:
倒排索引——搜索引擎入门