关于 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 中倒排索引的理解