【深入剖析】为何Elasticsearch选择倒排索引而非B树索引?探索背后的差异与优势

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

前言

索引可能大家都不陌生,在用关系型数据库时,一些频繁用作查询条件的字段我们都会去建立索引来提升查询效率。在关系型数据库中,我们一般都采用 B 树索引进行存储,所以 B 树索引也是我们接触比较多的一种索引数据结构,然而在 es 中,进行全文搜索的时候却并没有选择使用 B 树 索引,而是采用的倒排索引。本文就让我们来看看 es 中的倒排索引是如何存储和检索的吧。

为什么全文索引不使用 B+ 树进行存储

关系型数据库,如 MySQL,其选择的是 B+ 树索引,如下图就是一颗简单的的 B+ 树示例:

c7e8ece8800d72a74f4a21ea25ce33a6.jpeg

上图中蓝色的表示索引值,白色的表示指针,最底层叶子节点除了存储索引值还会存储整条数据(InnoDB 引擎),而根节点和枝节点不会存储数据,B+ 树之所以这么设计就是为了使得根节点和枝节点能够存储更多的节点,因为搜索的时候从根节点开始搜索,每查询一个节点就是一次 IO 操作,所以一个节点能存储更多的索引值能减少磁盘 IO 次数。

如果有想更详细了解 B+ 树的,可以点击这里。

那么到这里我们就可以思考这个问题了,假如索引值本身就很大,那么 B+ 树是不是性能会急剧下降呢?答案是肯定的,因为当索引值很大的话,一个节点能存储的数据会大大减少(一个节点默认是 16kb 大小),B+ 树就会变得更深,每次查询数据所需要的 IO 次数也会更多。而且全文索引就是需要支持对大文本进行索引的,从空间上来说 B+ 树不适合作为全文索引,同时 B+ 树因为每次搜索都是从根节点开始往下搜索,所以会遵循最左匹配原则,而我们使用全文搜索时,往往不会遵循最左匹配原则,所以可能会导致索引失效。

总结起来 B+ 树不适合作为全文搜索索引主要有以下两个原因:

  • 全文索引的文本字段通常会比较长,索引值本身会占用较大空间,从而会加大 B+ 树的深度,影响查询效率。
  • 全文索引往往需要全文搜索,不遵循最左匹配原则,使用 B+ 树可能导致索引失效。

全文检索

在全文检索当中,我们需要对文档进行切词处理,切好之后再将切出来的词和文档进行关联,并进行索引,那么这时候我们应该如何存储关键字和文档的对应关系呢?

正排索引

可能大家都知道,在全文检索中(比如:Elasticsearch)用的是倒排索引,那么既然有倒排索引,自然就有正排索引。

正排索引又称之为前向索引(forward index)。我们以一篇文档为例,那么正排索引可以理解成他是用文档 id 作为索引关键字,同时记录了这篇文档中有哪些词(经过分词器处理),每个词出现的次数已经每个词在文档中的位置。

但是我们平常在搜索的时候,都是输入一个词然后要得到文档,所以很显然,正排索引并不适合于做这种查询,所以一般我们的全文检索用的都是倒排索引,但是倒排索引却并不适合用于聚合运算,所以其实在 es 中的聚合运算用的是正排索引。

倒排索引

倒排索引又称之为反向索引(inverted index)。和正排索引相反,倒排索引使用的是词来作为索引关键字,并同时记录了哪些文档中有这个词。

在这里我们以一个英文文档为例子,之所以选择用英文文档是因为英文分词比较简单,直接以空格进行分词即可,而中文分词相对比较复杂。

我们以 Elasticsearch 官网中下面两句话作为两位文档来分析:

Elasticsearch is the distributed search and analytics engine at the heart of the Elastic Stack.Elasticsearch provides near real-time search and analytics for all types of data.

根据上面两句话,假设我们可以得到下面这样的一个索引结构:

其中:

  • term index:顾名思议,这个是为 term(经过分词后的每个词) 建立的索引,也就是通过这个索引可以快速找到当前 term 的位置,从而找到对应的 Posting list。因为在 es 中,会为每个字段都建立索引(
Elasticsearch从入门到精通】第41篇:为什么需要搜索引擎——关系数据库的搜索困境 摘要 本文深入分析了关系数据库在全文搜索场景下的性能瓶颈。通过电商商品搜索案例,揭示了LIKE查询的全表扫描问题(时间复杂度O(N))和B-Tree索引的三大局限:无法支持多词组合搜索、模糊匹配和相关度排序。实验数据显示,当数据量达到百万级时,LIKE查询响应时间超过1秒,完全无法满足实时搜索需求。相比之下,搜索引擎采用倒排索引结构,通过分词、索引构建和相关性排序三个核心过程,将搜索性能提升至O(logN)级别。MySQLElasticsearch的性能对比表明,在全文搜索场景下,专业搜索引擎的响应时间可 阅读详情

相关推荐

新手必看:es数据库传统数据库对比解析

深入对比es数据库传统数据库在数据存储、查询性能和使用场景上的不同,帮助开发者理解es数据库的高搜索效率灵活扩展能力,适用于日志分析实时检索等典型应用。

weixin_35756130的博客 1053

深入理解ES 第二章-ES索引类型

通过词找文章,将关键词分词后。每个分词后的数据都加入term dictionary这个term dictionary 就是es索引,他是有序的。

hzh727172424的博客 1366

【深度解析】Elasticsearch的分布式架构内存索引:为何在搜索场景下碾压MySQL?

本文深度解析了Elasticsearch的分布式架构内存索引技术,揭示其在搜索场景下远超MySQL的性能优势。通过对比测试数据,详细阐述了ES倒排索引、分片设计和内存优化等核心技术,以及在实际应用中的最佳实践和混合架构设计。

weixin_29284201的博客 313

OLAP数据库-ElasticSearch

(1)为用户提供按关键字查询的全文搜索功能。(JavaEE中使用较广泛)(2)实现企业海量数据的处理分析的解决方案。大数据领域的重要一份子,如著名的ELK 框架(ElasticSearch(存储分析),Logstash(采集),Kibana(可视化))。(3)作为 OLAP (联机分析处理)数据库,对数据进行统计分析。

m0_57697768的博客 1232

Elasticsearch(简称ES)简易介绍

Elasticsearch(简称ES)是一个开源的分布式搜索引擎,在实时数据索引、搜索和分析方面有着优秀的性能和功能。

解决bug的路上 1163

Elasticsearch 中为什么选择倒排索引而不选择 B 索引_es使用什么索引

索引可能大家都不陌生,在用关系型数据库时,一些频繁用作查询条件的字段我们都会去建立索引来提升查询效率。在关系型数据库中,我们一般都采用B索引进行存储,所以B索引也是我们接触比较多的一种索引数据结构,然而在es中,进行全文搜索的时候却并没有选择使用B 索引,而是采用的倒排索引。本文就让我们来看看es中的倒排索引是如何存储和检索的吧。

2401_86963268的博客 1331

为什么mysql索引要用B+Tree数据结构

二叉 不适合自增长索引,失去索引效率,单边增长,成链表状。 (从1插入到4) 红黑(平衡二叉) 不适合数据量大,太高。如果查找数据在叶子节点,则需要查高次数。 (从1插入到5) hash表 hash冲突,并且不支持范围查询,...

qq_33719894的博客 715

从慢查询到搜索引擎:正向索引倒排索引的核心原理实战选型

在数据库索引擎领域,索引是提升查询性能的核心技术。其基本原理是通过建立高效的数据结构,加速数据的检索过程。从技术价值看,不同的索引设计直接决定了系统在读写操作上的性能表现适用场景。正向索引采用记录导向的映射,擅长基于主键或字段值的点查范围查询,是OLTP数据库事务处理的基石。而倒排索引则采用关键词导向的映射,通过构建“词项到文档”的映射列表,完美解决了海量文本的全文检索难题,成为Elasticsearch等搜索引擎的引擎核心。在应用场景上,正向索引适用于需要强一致性的事务系统,而倒排索引则广泛应用于

weixin_30616969的博客 328

数据结构算法 - BB+:多路平衡的应用场景

摘要 BB+是专为磁盘存储优化的多路平衡搜索,通过减少高和批量读取提升I/O效率。B通过多路分支(如100阶仅需4次I/O访问1亿数据)和节点磁盘页对齐设计解决二叉磁盘I/O瓶颈。B+在B基础上改进:数据仅存于叶子节点、内部节点作索引、叶子双向链表连接,具有更高扇出、更优范围查询和稳定查询路径。本文详细解析了B/B+的定义性质、插入删除操作流程(包括节点分裂合并机制),并提供Java实现代码示例。这两种数据结构是数据库索引、文件系统的核心基础,能有效管理海量有序数据。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

ElasticSearch从入门到架构师】第8章:倒排索引深度剖析

正排索引是我们最熟悉的索引方式,也是关系型数据库(如MySQL)的默认索引模式。核心思想:以文档ID为Key,以文档内容为Value。结构示例文档ID: 1文档内容: "ElasticSearch是一个分布式搜索引擎"文档ID: 2文档内容: "ElasticSearch使用倒排索引实现快速检索"文档ID: 3文档内容: "搜索引擎的核心技术是倒排索引"查询过程如果要搜索"ElasticSearch",数据库必须逐行扫描所有文档时间复杂度:O(N),N为文档总数这就是传统的为什么慢。

gaochufukanyongren的博客 374

ElasticSearch索引 和MySQL索引那个更高效实用那个更合适

前言 这段时间在维护产品的搜索功能,每次在管理台看到elasticsearch这么高效的查询效率我都很好奇他是如何做到的。 这甚至比在我本地使用MySQL通过主键的查询速度还快。 为此我搜索了相关资料: 这类问题网上很多答案,大概意思呢如下: ES 是基于Lucene的全文检索引擎,它会对数据进行分词后保存索引,擅长管理大量的索引数据,相对于MySQL来说不擅长经常更新数据及关联查询。 说的不是很透彻,没有解析相关的原理;不过既然反复提到了索引,那我们就从索引的...

风水道人 790

MySQL 实战宝典(二):MySQL vs Elasticsearch 文本检索性能全方位对比

MySQL 是数据的底座,保证数据的安全准确;Elasticsearch 是数据的放大镜,挖掘数据的价值。不要试图用战术匕首(MySQL Like)去砍参天大,也不要用屠龙刀(ES)去切水果。在现代架构中,将两者结合使用,通过 Binlog 实现数据流转,才是应对海量文本检索的最佳实践。

TracyCoder的博客 2074

C++实现校园公告搜索引擎:从倒排索引到BM25排序的实战优化

索引擎作为信息检索的核心技术,其基本原理是通过倒排索引将文档内容映射为可快速查询的数据结构。在实现层面,倒排索引的高效组织和存储是关键,它决定了检索的响应速度资源占用。对于中文搜索场景,中文分词的准确性性能直接影响索引质量和查询效果。基于向量空间模型或BM25等经典算法进行相关性排序,能够有效提升搜索结果的质量,满足用户对精准信息的需求。这些技术广泛应用于各类垂直搜索、内容聚合平台和企业级文档检索系统中。本文以校园公告搜索为具体应用场景,详细探讨了如何利用C++从零构建一个高性能搜索引擎,并深入剖析

weixin_33911824的博客 395

重新认识 键值型数据库、文档型数据库、搜索引擎数据库、列式数据库(三)

键值型数据库通过 Key-Value 键值的方式来存储数据,其中 Key 和 Value 可以是简单的对象,也可以是复杂的对象。Key 作为唯一的标识符,优点是查找速度快,在这方面明显优于关系型数据库,缺点是无法像关系型数据库一样使用条件过滤(比如 WHERE),如果你不知道去哪里找数据,就要遍历所有的键,这就会消耗大量的计算。键值型数据库典型的使用场景是作为内存缓存。Redis 是最流行的键值型数据库。此类 数据库可存放并获取文档,可以是XML、JSON等格式。

AlbenXie的博客 327

Elasticsearch聚合分析深度剖析:从原理到百亿级数据实战

从你当前业务场景的最小可行需求出发,先实现一个能工作的聚合查询,然后通过监控(特别是Elasticsearch的慢查询日志和热点线程API)发现瓶颈,再针对性地优化。当数据量从百万级跃升到百亿级时,传统的基于SQL的OLAP方案(如MySQL、传统数据仓库)即便有索引加持,聚合查询的响应时间也会从毫秒级退化到分钟甚至小时级。Elasticsearch的聚合分析能力,在其看似简单的API之下,隐藏着一个极其精巧且强大的分布式计算引擎。在当今的互联网和物联网时代,数据正以前所未有的速度增长。

持续输出Java相关知识 886

C++索引擎性能优化:布隆过滤器倒排索引的深度集成实践

在搜索引擎、数据库和缓存系统等高性能场景中,快速判断一个元素是否存在于海量数据集合是核心的性能瓶颈。布隆过滤器(Bloom Filter)作为一种空间效率极高的概率型数据结构,通过多个哈希函数将元素映射到一个位数组中,能以极小的内存开销,在常数时间内判定元素“可能存在”或“一定不存在”。其技术价值在于,它用微小的误判概率(假阳性)换取内存和查询时间的巨大节省,是实现高性能查询预处理和缓存穿透防护的关键组件。在搜索引擎架构中,该技术常应用于查询预处理环节,作为倒排索引的前置过滤器,能有效拦截大量无效查询,避免

anqiu4023的博客 374

Elasticsearch 全面解析:是什么? MySQL 对比、应用场景、优缺点

在现代软件开发和大数据架构中,和MySQL是两个极其核心的存储查询引擎。为什么有了 MySQL 还要用 Elasticsearch?两者到底有什么区别?各自适合什么场景?本文将用通俗易懂、系统全面什么是 ElasticsearchElasticsearch 核心特点MySQL Elasticsearch 应用场景对比两者详细优缺点对比企业真实架构:MySQL + ES 如何配合使用内容完全符合 CSDN 发布标准,适合学习、面试、架构设计。

✨ 欢迎来到【Seal ^_^ 的CSDN博客】!✨ 2435

ES核心索引机制深度解析:从“正排”“倒排”的底层原理到实战应用场景

本文深度解析Elasticsearch核心索引机制,详细对比正排索引倒排索引的底层原理及实战应用场景。通过电商商品搜索、新闻APP全文检索等案例,揭示Doc Values和Fielddata的性能差异优化技巧,帮助开发者高效实现搜索聚合功能。

weixin_29197835的博客 179
上一篇: 【深入解析】揭秘MySQL索引底层逻辑,带你掌握干货满满的核心知识
下一篇: Java进阶:掌握数据结构,破解Redis速度之谜
手把手教你学Java
博客等级 码龄6年 2559粉丝 · 475原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值