Elasticsearch 倒排索引原理

倒排索引也是索引的一种。索引,本质上就是为了快速检索我们存储的数据。

每种数据库都有自己要解决的问题(或者说擅长的领域),对应的就有自己的数据结构,而不同的使用场景和数据结构,需要用不同的索引,才能起到最大化加快查询的目的。

对于 MySQL 来说,使用 B+ tree 索引是为了优化已有数据的存储结构,对于不需要快速更新的时候,采用预先排序等方式换取更小的存储空间,更快的检索速度,但同时,由于每次更新都需要对 B+ 树进行调整,导致更新比较慢。Elasticsearch 是通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好。

Elasticsearch 是建立在全文搜索引擎库 Lucene 基础上的搜索引擎,它隐藏了 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API,不过掩盖不了它底层也是 Lucene 的事实。
Elasticsearch 的倒排索引,其实就是 Lucene 的倒排索引。

倒排索引名字的由来

在没有搜索引擎时,我们是直接输入一个网址,然后获取网站内容,这时我们的行为是:

document -> to -> words

通过文章,获取里面的单词,这种就是所谓的"正向索引"(forward index)。

后来,我们希望能够输入一个单词,找到含有这个单词,或者和这个单词有关系的文章:

word -> to -> documents

于是就把这种索引,称为 inverted index,直译过来,应该叫"反向索引",国内翻译成"倒排索引"。

倒排索引的内部结构

首先,在数据生成的时候,比如插入一份文档,内容是“生存还是死亡”,这个时候通过使用分词器,会将它分解为“生存”、“还是”、“死亡”三个词语,然后可能还会把“还是”这个无意义的词语干掉。

接着,就会将这两个词语以及对应的文档 id 存下来:

word documentId
生存 1
死亡 1

然后我们再插入一个文档,这个内容是“生存”,于是索引就变成了:

word documentId
生存 1,2

你可能感兴趣的:(elasticsearch)