1. 倒排索引概念
下面我们已书本为例讲解正排索引和倒排索引的概念,如下图可以通过书本目录及其页面检索每个章节,书本目录相当于正排索引。
假设我们需要快速检索“benchmarking”所在的页面,可以通过书本附录来检索该单词所在章节及其页面,如下图。这种附录索引页可以理解为简单的倒排索引结构。
将图书和搜索引擎类比来看,其中图书的目录页即为正排索引,索引页即为倒排索引。同比,搜索引擎中文档ID到文档内容和单词的关联即为正排索引,而单词到文档ID的关系即为倒排索引。
2. 倒排索引数据结构
如下图,左边为索引文档,右边为对应的倒排索引结构。倒排索引将文档内容的单词依次排列,以单词“ElasticSearch”为例,Count 列代表该词出现的次数,1:1, 2:0, 3:0
分别表示该词的文档ID和位置信息,例如 1:1
即表示 ElasticSearch
出现在文档ID为1的文档中,该词位于第 1 位。
在 ElasticSearh 搜索引擎中,倒排索引包含如下两个部分:
- 单词词典(Term Dictionary),记录所有文档的单词,记录单词到倒排索引列表的关联关系
- 单词词典一般比较大,可以通过 B+ 树或者哈希链表法实现,以满足高性能的插入与查询
- 倒排列表(Posting List),记录了单词对应的文档结合,由倒排索引项(Posting)组成:
- 文档 ID
- 词频 TF,该单词在中文档中出现的次数,用于相关性评分
- 位置 Position,该单词在文档中分词的位置,用于语句搜索(phrase query)
- 偏移 Offset,记录单词的开始结束位置,实现高亮显示
下图是单词 ElasticSearch
在搜索引擎中的倒排索引结构:
需要说明的是,ElasticSearch 的 JSON 文档中的每个字段都有自己的倒排索引,其中 ElasticSearch 也支持对某些字段不做索引,这样可以节省存储空间,但是缺点是该字段将无法被检索,