Elasticsearch 之全文检索与倒排索引
Elasticsearch 是一种高度可伸缩的全文检索和分析引擎,其底层基于 Apache Lucene,Lucene 本身早就是一种闻名于世的全文检索和工具包。Elasticsearch 在其基础上进行了封装,不仅继承了 Lucene 的所有优点,还大大降低了使用和开发的复杂度。
不仅如此,ES 也拥有强大的数据存储能力,它所检索的数据不依赖于外部数据源,而是由 ES 统一管理。ES 还具备创建数据分片和数据副本的能力,可以满足大数据量下的高可用性和高性能要求。所以 ES 也成归类为一种基于文档的 NoSQL 数据库,类似于 MongoDB。而也是因为 ES 强大的数据存储能力,所以才有强大的检索和分析能力。
全文检索与倒排索引
Elasticsearch 中的索引是倒排索引(Inverted Index),是一种专门应用于全文检索的索引类型。
全文检索
什么叫做全文检索?
数据检索的目的是从一系列数据中,根据某一或某些数据特性将特定的数据找出来。从数据检索的角度来看,数据大体上可以分为两种类型:一种是结构化数据;另一种是非结构化数据。
结构化数据:将数据具有的特征事先以结构化的形式定义好,数据有固定的格式或有限的长度。例如传统关系型数据库的表结构,数据特征直接体现在表结构的字段上。
非结构化数据:没有预定定义好的结构化特征,也没有固定格式和固定长度。例如,文章、图片、视频、网页、邮件等。其中像 HTML 网页这种具有一定格式的文档也称为半结构化数据。
在实际的数据检索中,通常是像文章、网页、邮件这种全文本(Full-text)数据的检索需求占大多数 ,因此形成了一门独立学科,称为全文检索。在 Elastic 官网中,经常称全文本数据为全文数据,称全文数据中的一条数据为文档(Document),而称存储全文数据的数据库为全文数据库。
因此,简单来说,全文检索是指全文数据中检索单个文档或文档集合的搜索技术,而 Elasticserach 从这个方面来说也可以理解为是一个全文数据库。
全文检索面临什么样的问题?
与结构化数据查询相比,全文检索面临的最大问题就是性能问题。全文检索典型应用场景是根据一些关键字查找包含这些关键字的文档,比如互联网搜索引擎要实现的功能就是根据一些关键字查找网页。如果没有对文档进行特别的处理,查找的办法就只能逐条比对。效率非常低下。
倒排索引
如何解决全文检索效率慢的问题?
关系型数据库通过给字段添加索引,可以提升数据查询速度,有了索引字段会根据字段值排序并创建类似排序二叉树的数据结构(如B树),然后利用二分查找等算法提升查询速度。但是给字段添加索引后,查询速度提升的同时会降低增加和删除数据时的速度,并且还需要额外的空间存储索引。这是典型的利用空间换取事件策略。
倒排索引先将文档中包含的关键字全部提取出来,然后再将关键字与文档的对应关系保存起来,最后再对关键字本身做索引排序。全文检索就是使用这种索引方式解决效率慢的问题。
倒排索引是如何工作的?
用户在检索某一关键字时,可以先对关键字的索引进行查找,再通过关键字与文档的对应关系找到所在文档。如下:
文档一:I love yuki.
文档二:I love xixi。
针对以上两个文档创建倒排索引,第一步先对文档提取关键字。对于英文来说按空格进行分隔即可,两份文档共提取 I 、love、yuki 和 xixi 四个关键字。接下来就是建立关键字与文档之间的对应关系,即标识关键字被哪些文档包含:
| 序号 | 关键字 | 文档一 | 文档二 |
| 1 | I | √ | √ |
| 2 | love | √ | √ |
| 3 | yuki | √ | |
| 4 | xixi | √ |
根据倒排索引,用户检索就可以在倒排索引中快速定位到包含关键字的文档。倒排索引与关系型数据库索引类似,都会根据关键字做排序。但关系型数据库索引一般是对主键创建,然后索引指向数据内容;而倒排索引则正好相反,它是针对文档内容创建索引,然后索引指向主键(文档一、二),这就是这种索引被称为倒排索引的原因。

浙公网安备 33010602011771号