呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

关于 ElasticSearch 中倒排索引的理解

ElasticSearch 是一个搜索引擎,也可以看做是一个分布式的数据库(经常被当做一个文档型的NoSQL数据库在使用),它可以大量的存储数据,并建立索引,以便在极短时间从海量数据中找到目标数据。

它和传统数据库很大的一个区别在于它建立索引的能力,这里有一个重要的概念——倒排索引

倒排索引可以很大的提高检索的速度,下面举一个例子,来说明一下倒排索引是什么,以及这种方式相比于传统数据库为什么会提高索引的速度。

在 ElasticSearch 中,一条记录被称之为一个文档,文档中有 id、type、version、source(文档主要数据存储在这里)等字段。

这里假设 文档A 的source字段中有一个关键字 content 的值是一条文本:

I love study.

文档B 的source字段中有一个关键字 content 的值是另一条文本:

And study make me happy.

现在输入我们想要检索的关键字:“study happy”

可以想象,在传统数据库中,会用一条类似这样的 sql 语句在数据库表中挨条查找符合要求的记录:

SELECT column_name(s)
FROM table_name
WHERE (column_name LIKE 'study' and column_name LIKE 'happy')

假如表中存有 1000w 条记录,那么这条 sql 将会依次检索这1000w 条记录,所要消耗的时间随着记录数增多而提高。这种方式在应对海量数据的时候,便有些力不从心。

那么我们可不可以换一种检索的方式呢?

既然我们要在 文档(记录) 中查找指定的 单词(关键字),最终查找的是 单词(关键字) 在某一个文档中存不存在,存在于哪一个文档中。那么我们可以反过来直接根据 单词(关键字) 建立一个索引表,通过检索关键字直接找到所有包含关键字的文档,这便是 倒排索引

先拿以上例子说明一下传统数据库存储的方式:

再拿以上例子说明如何建立倒排索引:

文档 A 和 B 中的两个文本,“I love study.”“And study make me happy.”,可以建立如下索引表:

当我们检索关键字 “study happy” 的时候,可以直接找到 study 在文档A和文档B中都存在,happy 只在 文档B 中存在。相比传统数据库的检索方式,这种方式更加直接和高效,特别在数据量极大的情况下。

同时我们也可以发现,我们输入的关键字在 文档A 中命中1次,在文档B中命中2次,于是 ElasticSearch 甚至可以得到相关性的结论,文档B 的相关度比 文档A 高

这也是 ElasticSearch 的一个优势所在,它不仅可以快速检索内容,还可以将命中的文档根据相关度进行排序,并显示在搜索结果中。

本文只对倒排索引最核心的概念进行粗略介绍,如有不当之处,欢迎指出。

原创声明

转载请注明:呓语 » 关于 ElasticSearch 中倒排索引的理解