问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

正向索引与倒排索引:Elasticsearch的核心索引机制

创作时间:
作者:
@小白创作中心

正向索引与倒排索引:Elasticsearch的核心索引机制

引用
CSDN
1.
https://m.blog.csdn.net/explorer_321/article/details/144538666

在大数据时代,如何快速地从海量数据中检索出所需的信息是一个重要的技术挑战。Elasticsearch作为一款流行的开源搜索引擎,其核心优势在于采用了倒排索引技术,能够显著提高全文检索的效率。本文将深入探讨正向索引和倒排索引这两种索引机制,帮助读者理解它们的工作原理以及在实际应用中的优劣。

一、Elasticsearch介绍

Elasticsearch 是一个开源的分布式 RESTful 搜索和分析引擎、可扩展的数据存储和向量数据库,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。

以上描述来源于官方文档。简单来说Elasticsearch是一个分布式的搜索引擎,可以提高在海量数据中进行数据搜索的效率。

1.1 ELK

ELK(elastic stack)是Elasticsearch结合kibana、Logstash、Beats的统称。被广泛应用于日志数据分析、实时监控等领域。

那为什么Elasticsearch就能够提高搜索效率呢,他和我们直接在数据库中进行查询有什么区别呢?原因是Elasticsearch使用了倒排索引而我们平常使用的数据库一般都是正向索引,所以Elasticsearch的搜索效率会比数据库高很多。

二、正向索引

正向索引是一种索引机制,它将文档或数据记录按照某种特定顺序进行组织,一般是按照文档id或其他唯一标识符进行排序。这种索引的特点是我们可以通过文档或数据记录的id(或唯一标识符)快速查找到具体的文档(数据记录)。

我们平常使用的数据库使用的就是正向索引机制,我们在创建表的时候都会习惯地使用一个自增字段id作为表的主键,其实这样做的目的就是让数据库可以根据id字段来创建索引,这样我们通过id就能很快地找到对应的数据。

下面用一个例子来分析一下正向索引的优缺点:

现有如下所示的一张

student

表:

id name age

1 张三 18

2 李四 19

3 王五 18

… … …

我们指定

id

字段为自动递增的主键类型,数据库自动为该字段创建主键索引。我们执行

select * from student where id =3;

时,数据库就能够通过索引快速找到 id=3 所对应的数据记录。

接下来我们试着执行一下这段sql

select * from student where name like '张三';

此时,数据库会进行全表扫描(即使你为name创建了索引,索引也会失效),并将扫描到包含

张三

的数据加入到结果集中。此时的查询效率是非常低的。

所以从上面的分析来看,正向索引是非常适用于我们已经知道了文档的id(或唯一标识)然后查询文档数据的场景的,但是对于需要进行全文检索查询的场景,正向索引是不起作用的,最终只能逐条扫描数据,导致查询效率低下。

对于全文检索查询,我们需要使用另外一种索引方法即倒排索引,倒排索引通过词条来组织数据,允许我们通过词条快速找到包含词条的所有文档。数据库中的全文索引(FullText index)就是通过创建倒排索引来实现的。

三、倒排索引

倒排索引,也称为反向或逆向索引,是一种索引数据的方法,它能够在搜索引擎或信息系统中高效地进行全文检索。与正向索引不同,倒排索引不按照文档id或文档唯一标识来组织数据,倒排索引是通过词条来组织数据的。

在倒排索引中,每个词条都会被记录在一个索引条目中,这个条目包含一个或多个指向包含该关键词的文档记录的指针或引用。这样就可以根据关键词快速查询到包含关键词的所有文档。

3.1 倒排索引的创建过程

下面我们通过了解倒排索引的创建过程,可以更容易理解倒排索引。

倒排索引的创建过程如下:

  • 分词:将文档内容分解成独立的词汇,对于中文这种没有明显分隔符的文档,我们可以使用ik分词器来对其进行分词。

  • 构建词条表:为从文档中分解出来的词条构建一个词条表,并为词条表中的每一个词条创建倒排索引表。

  • 建立倒排索引表:对于每一个词条,记录该词条以及包含该词条的文档标识符(文档id)

  • 为了提高搜索效率,索引可能会进行一些优化,如根据词条的出现频率进行排序,或者对索引进行压缩以减少存储空间。

现有如下一张数据库表,我们要为其中的数据创建倒排索引过程如下:

id title content

1 日记 今天天气真好

2 周记 今天运气真好

3.2 通过倒排索引进行数据查询

现在我们已经获得了包含词条的文档id,我们就可以使用正向索引查询得到文档数据了。这样就避免了全表扫描,大大提高查询效率。

四、总结

通过上面的分析,我们可以总结得出正向索引与倒排索引各自的优缺点。

正向索引:

  • 优点:可以通过文档id(唯一标识)快速查询到对应的文档数据,对于已经知道文档id需要查询文档数据的场景查询速度非常快。

  • 缺点:无法应对需要根据词条查询文档的场景,如果要查询包含某个词条的所有文档需要进行全表扫描,查询效率极低。

倒排索引:

  • 优点:对于全文检索场景,可以快速地找到包含某个词条的所有文档。

  • 缺点:无法应对根据文档id查询文档的场景,因为倒排索引是通过词条组织数据的。

Elasticsearch通过倒排索引快速找到包含某个词条的所有文档id,然后通过正向索引快速找到文档数据,完成查询。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号