ES倒排索引介绍

Inverted Index

倒排索引(Inverted Index)是实现单词-文档矩阵的一种具体存储形式,在全文检索的场景中,可以实现快速的搜索需求,其由两部分构成,分别是 Term Dictionary、Posting List。

Term Dictionary

如下三个文档,文档ID分别是001和002,每个文档中有一个字段,用来存储一段文本。

ID title
001 金都嘉怡假日酒店
002 金都欣欣酒店

使用分词器对 title 进行分词,分词结果可能是这样

ID title 分词结果
001 金都嘉怡假日酒店 金都,嘉怡,假日,酒店
002 金都欣欣酒店 金都,欣欣,酒店

去重分词结果,得到一个词语集合:[金都,嘉怡,欣欣,假日,酒店],这个词语集合称之为词典,Term Dictionary 可以简单的认为就是这个词典。

词典是倒排索引中非常重要的组成部分,它用来维护文档集合中所有的词语集合,同时记录某个单词对应的倒排列表倒排文件(存储倒排列表的文件)中的位置信息等。在支持搜索时,根据用户的查询词,去词典里查询,就可以获得对应的倒排列表,并以此作为后续的排序的基础。

实际的应用场景中,Term Dictionary 是非常大的,搜索引擎需要实现快速查找才能满足现实中的需求,那么就需要能够快速的从词典中找到一个词语。为了能够满足快速查找的需求,Term Dictionary 一般使用 B+ 树结构或者哈希 + 链表结构进行存储。

另外,为了节省空间,Term Dictionary 在磁盘上是以分 Block 的方式保存的,一个 Block 内部利用公共前缀压缩,比如:将所有以 “pre” 开头的单词提取 “pre” 作为公共部分,将剩余部分原样保存,这样就可以节省一定的空间。

Posting List

倒排列表(Posting List)中记录了出现过某个单词的所有文档的文档列表以及单词在该文档中出现的次数、位置信息。下面结合倒排索引的完整结构理解下倒排列表:

单词ID 单词 文档频率 倒排列表
1 金都 2 (001;1;<1>), (002;1;<1>)
2 嘉怡 2 (001;1;<2>)
3 欣欣 2 (002;1;<2>)
4 假日 2 (001;1;<3>)
5 酒店 2 (001;1;<4>), (002;1;<3>)

Term Index

实现全文检索的速度主要取决于词典查找的速度,虽然 Term Dictionary 使用了查找速度比较高效的数据结构,但是还是避免不了磁盘随机访问的性能影响,由于 Term Dictionary 比较大,如果全部放入内存会有相当大的内存消耗,随着时间,内存可能会被耗尽。所以 Term Dictionary 不适合基于内存的查找。

为了进一步提升 Term Dictionary 的查找速度,于是就有了 Term Index。Term index 使用的是 Trie 树结构。Trie 树不会包含所有的 Term,它仅包含的是 Term 的一些前缀。通过 Term Index 可以快速地定位到 Term Dictionary 的 Block 位置,然后基于该 Block 按照 Term Dictionary 内部的数据结构进行查找。

Term Index 在内存中是以 FST(finite state transducers)的形式保存的,其特点是非常节省内存,Term Index 的尺寸可以只有所有 Term 的尺寸的几十分之一,使得基于内存的词典查找变成可能。基于 Term Index 的查找流程如下图:

ES倒排索引介绍_第1张图片

你可能感兴趣的:(elasticsearch)