参考:https://www.cnblogs.com/cjsblog/p/10327673.html
倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
正向索引和倒排索引,都是索引,方便快速查找;两者实现原理不一样,应用场景不一样。
正向索引是通过 key找到value
倒排索引是通过value找到key
倒排索引由以下几个部分组成:
term:分词器分析后,形成的一个个单词叫做term
term dictionary:单词字典,term的集合
term index:单词索引,可以快速找到这个单词,一般用B-Tree索引。
posting list:倒排项(posting)的集合,记录一个单词出现的所有文档ID和在文档中的位置。
倒排列表用来记录有哪些文档包含了某个单词。
一般在文档集合里会有很多文档包含某个单词,每个文档会记录文档编号(DocID),单词在这个文档中出现的次数(TF)及单词在文档中哪些位置出现过等信息,这样与一个文档相关的信息被称做倒排索引项(Posting),包含这个单词的一系列倒排索引项形成了列表结构,这就是某个单词对应的倒排列表。
在实际的搜索引擎系统中,并不存储倒排索引项中的实际文档编号,而是代之以文档编号差值(D-Gap)。文档编号差值是倒排列表中相邻的两个倒排索引项文档编号的差值,一般在索引构建过程中,可以保证倒排列表中后面出现的文档编号大于之前出现的文档编号,所以文档编号差值总是大于0的整数。如比如原始的 3个文档编号分别是187、196和199,通过编号差值计算,在实际存储的时候就转化成了:187、9、3。
之所以要对文档编号进行差值计算,主要原因是为了更好地对数据进行压缩,原始文档编号一般都是大数值,通过差值计算,就有效地将大数值转换为了小数值,而这有助于增加数据的压缩率。
ES 为每一个字段都建立倒排索引,通过term index可以找到term在term dictionary中的位置,进而得到posting list,通过posting可以得到文档记录。