深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之倒排索引(三)

news2025/2/21 20:04:18

当我们谈论Elasticsearch(简称ES)时,我们经常会提到它的高效搜索能力。而这背后的核心技术之一就是倒排索引。那么,什么是倒排索引,以及它是如何在Elasticsearch中工作的呢?

深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之行存(一)
深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之列存(二)

一、什么是倒排索引?

首先,我们需要了解传统的正向索引。在正向索引中,文档是按照它们在磁盘上的顺序进行存储的,每个文档都有一个与之关联的文档ID。如果我们要查找某个词在哪些文档中出现,就需要遍历整个文档集合,这显然是非常低效的。

倒排索引则解决了这个问题。在倒排索引中,有一个单词列表,对于列表中的每个单词,都有一个包含它的文档的列表。这样,当我们要查找某个词在哪些文档中出现时,只需要查找该词的条目,然后获取与之关联的文档列表即可。

二、Elasticsearch中的倒排索引

Elasticsearch使用了一种称为Lucene的库来实现倒排索引。在Elasticsearch中,每个文档的每个字段都被索引为一个独立的倒排索引。

  • 当用户在Elasticsearch中执行一个搜索查询时,查询会被解析成一个或多个查询词。
  • 对于每个查询词,Elasticsearch首先在单词词典中查找它。由于单词词典通常很大,直接查找可能会很慢,因此Elasticsearch会使用词项索引来加速这个过程。
  • 一旦找到了查询词,Elasticsearch就获取与之关联的倒排列表。这些倒排列表记录了包含查询词的所有文档的ID以及相关信息。
  • Elasticsearch可以根据需要合并多个倒排列表,并根据相关性算法对结果进行排序,最终返回给用户。

那么当我们谈论倒排索引结构时,我们主要涉及到三个部分:倒排表(Posting List)、词项字典(Term Dictionary)和词项索引(Term Index)。下面,我将详细解释这三个部分的作用和工作原理。
在这里插入图片描述

1. 倒排表(Posting List)
倒排表是倒排索引结构中最核心的部分。对于文档集合中出现的每个单词(或称为词项),倒排表中都有一个条目与之对应。这个条目包含了该单词在哪些文档中出现的信息,通常包括文档ID和单词在该文档中出现的位置、频率等附加信息。

例如,假设我们有一个文档集合,包含三个文档:

Doc1: "The quick brown fox"
Doc2: "Quick foxes jump over lazy dogs"
Doc3: "Brown foxes are not quick"

对于单词"quick",倒排表中的条目可能如下:

quick -> Doc1:1; Doc3:3 (这里的数字表示单词在文档中的位置)

倒排表通常会被压缩以节省存储空间,例如使用差分编码或位图等技术。

2. 词项字典(Term Dictionary)
词项字典是一个包含文档集合中所有唯一单词的列表。每个单词在词项字典中都有一个唯一的条目,这个条目指向倒排表中与该单词对应的条目。

使用上面的文档集合作为例子,词项字典可能如下:

The
quick
brown
fox
foxes
jump
over
lazy
dogs
are
not

每个单词都按照某种顺序(例如字典序)排列,并且每个单词都有一个指针或引用,指向倒排表中相应的条目。

3. 词项索引(Term Index)

词典查找的挑战

  • 全文检索系统通常需要处理大量的文本数据,这意味着词典(Term Dictionary)也会非常大。虽然可以使用各种高效的数据结构(如哈希表、B树等)来加速查找,但这些数据结构通常都需要将数据加载到内存中才能实现最优的查找性能。然而,将整个词典加载到内存中可能会导致巨大的内存消耗,甚至耗尽可用内存。

  • 此外,即使词典被加载到内存中,由于内存访问速度仍然远低于CPU的处理速度,因此查找性能仍然可能受到限制。特别是在需要进行大量的随机内存访问时,性能影响会更加显著。

词项索引(Term Index)的作用

  • 为了解决这些问题,引入了词项索引(Term Index)。词项索引的目的是提供一个更紧凑、更快速的方式来查找词典中的词项。它通常使用Trie树(或前缀树)结构来存储词项的前缀信息。

  • Trie树是一种树形数据结构,用于高效地存储和查找字符串(或其他类型的数据)。在Trie树中,从根到任何一个节点,按照路径上的标签字符顺序连接起来,就是一个相应的字符串。这种结构非常适合于存储大量的字符串,并且可以快速查找具有相同前缀的字符串。

  • 然而,传统的Trie树可能会消耗大量的内存,特别是当词典非常大时。为了解决这个问题,可以使用一种压缩版的Trie树,称为有限状态转换器(Finite State Transducers,FST)。FST是一种特殊类型的有限状态机,它可以用来表示字符串之间的映射关系,并且非常节省内存。

基于词项索引的查找流程

  • 通过Term Index定位:首先,系统使用Term Index(以FST的形式保存在内存中)来快速定位到词典中可能包含目标词项的区块(Block)。由于Term Index只存储词项的前缀信息,并且使用了高效的FST结构,这一步的查找速度非常快,并且内存消耗很低。
  • 在词典中查找:一旦定位到了可能的区块,系统就可以在词典(Term Dictionary)中按照其内部的数据结构(如排序数组、B树等)进行精确的查找。由于这一步的查找范围已经大大缩小,因此查找速度也很快。
  • 通过这种方式,词项索引(Term Index)和词典(Term Dictionary)的结合使用可以在不消耗大量内存的情况下实现高效的词典查找,从而支持全文检索系统中的快速查找操作。
    在这里插入图片描述

倒排索引结构通过倒排表、词项字典和词项索引这三个部分,实现了从单词到包含这些单词的文档的快速映射。这种结构使得搜索引擎能够高效地处理大量的文本数据和复杂的查询请求。

当我们在Elasticsearch中执行一个搜索查询时,以下是发生的主要步骤**:**

  • 查询被解析成一个或多个查询词。
  • 对于每个查询词,Elasticsearch在单词词典中查找它。
  • 如果找到了查询词,Elasticsearch就获取与之关联的倒排列表,并根据需要将这些列表合并。
  • 根据合并后的倒排列表,Elasticsearch可以快速地确定哪些文档与查询匹配,以及这些匹配文档的相关性。

三、优化与扩展

当然,上述的描述只是倒排索引的基础原理。在实际应用中,Elasticsearch还使用了许多优化技术来提高搜索性能,例如:

  • 压缩技术:倒排列表可以被压缩以减少存储空间和提高查询速度。
  • 跳跃表:对于大型倒排列表,Elasticsearch使用了一种称为跳跃表的数据结构来加速查询。
  • 前缀共享:单词词典中的单词可以通过共享前缀来减少存储空间。

此外,Elasticsearch还支持多种查询类型和分析器,可以根据需要定制搜索行为。

总结

倒排索引是Elasticsearch实现高效搜索的核心技术之一。通过将文档分解为单词,并为每个单词建立倒排列表,Elasticsearch可以快速地确定哪些文档与查询匹配。通过使用各种优化技术,Elasticsearch可以进一步提高搜索性能,满足各种复杂查询的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1448018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习系列——(二十一)神经网络

引言 在当今数字化时代,机器学习技术正日益成为各行各业的核心。而在机器学习领域中,神经网络是一种备受瞩目的模型,因其出色的性能和广泛的应用而备受关注。本文将深入介绍神经网络,探讨其原理、结构以及应用。 一、简介 神经网…

PHP脉聊交友系统网站源码,可通过广告变现社交在线聊天交友即时通讯APP源码,附带视频搭建教程

探索全新社交体验:一站式PHP交友网站解决方案 🌐 全球化交友,无界沟通 在数字化的浪潮下,社交已不再受地域限制。我们的PHP交友网站不仅支持多国语言,还配备了即时翻译功能,让您轻松跨越语言障碍&#xff…

分享87个CSS3特效,总有一款适合您

分享87个CSS3特效,总有一款适合您 87个CSS3特效下载链接:https://pan.baidu.com/s/1CAxe8nPBzXvH7Nr6B_U72Q?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不…

MySQL基本操作之数据库的操作

一.创建数据库 1.基本语法 create database 数据库名; 注意别忘记加分号。 2.if not exists 数据库名字是唯一的,所以不可以创建已存在的数据库,如下: 重复创建就会报错 所以有了if not exists这个语法,加上之后&…

片上网络NoC(5)——非直连拓扑

目录 一、前言 二、概念阐述 三、交叉开关 四、蝶形网络 五、clos网络 六、fat tree网络 6.1 clos网络的折叠过程 七、总结 一、前言 本文继续介绍片上网络的拓扑,在之前的文章中,我们已经介绍了片上网络的拓扑指标和直连拓扑的相关内容&#xf…

正月初五迎财神

大家好,我是小悟 正月初五,人们在这一天迎接财神,祈求财运亨通、事业顺利。按照习俗,家家户户都会燃放鞭炮、点灯笼、摆设祭品,以示虔诚。 早晨,太阳刚刚升起,大家便早早起床,开始准…

软件架构与系统架构:区别与联系的分析

软件架构与系统架构:区别与联系的分析 在信息技术领域,软件架构和系统架构这两个术语经常被提及。尽管它们在某些方面有重叠,但它们确实代表了不同的概念和聚焦点。理解这两种架构之间的区别和联系对于任何从事技术开发和设计的专业人士都是至…

【Python网络编程之TCP三次握手】

🚀 作者 :“码上有前” 🚀 文章简介 :Python开发技术 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Python网络编程之[TCP三次握手] 代码见资源,效果图如下一、实验要求二、协议原理2.…

DS Wannabe之5-AM Project: DS 30day int prep day15

Q1. What is Autoencoder? 自编码器是什么? 自编码器是一种特殊类型的神经网络,它通过无监督学习尝试复现其输入数据。它通常包含两部分:编码器和解码器。编码器压缩输入数据成为一个低维度的中间表示,解码器则从这个中间表示重…

WPF是不是垂垂老矣啦?平替它的框架还有哪些

WPF(Windows Presentation Foundation)是微软推出的一种用于创建 Windows 应用程序的用户界面框架。WPF最初是在2006年11月推出的,它是.NET Framework 3.0的一部分,为开发人员提供了一种基于 XAML 的方式来构建丰富的用户界面。 W…

小白学Halcon100例:如何应用极坐标的展开及逆变换?

这里写目录标题 什么是极坐标系?在halcon中对应的算子halcon实例程序输出结果:原图什么是极坐标系? 1、极坐标系(polar coordinates)是指在平面内由极点、极轴和极径组成的坐标系。在平面上取定一点O,称为极点。从O出发引一条射线Ox,称为极轴。再取定一个单位长度,通常…

微服务OAuth 2.1认证授权Demo方案(Spring Security 6)

文章目录 一、介绍二、auth微服务代码1. SecurityConfig2. UserDetailsService3. 总结 三、gateway微服务代码1. 统一处理CORS问题 四、content微服务代码1. controller2. SecurityConfig3. 解析JWT Utils4. 总结 五、一些坑 书接上文 微服务OAuth 2.1认证授权可行性方案(Sprin…

基于函数计算AIGC生成图应用

目录 基于函数计算部署AIGC应用的主要步骤 创建Stable Diffusion模型的应用 访问应用实现文字生图 函数的查看与管理 基于函数计算部署AIGC应用的主要步骤 用函数计算实现AIGC只要简单的三步,分别是创建应用、运行应用及查看管理。 创建Stable Diffusion模型的应…

力扣hot1--哈希

推荐一个博客: 一文看懂哈希表并学会使用C STL 中的哈希表_哈希表end函数-CSDN博客 哈希做法: 我们将nums[i]记为key,将i记为value。 判断target-nums[i]是否在哈希表中,如果在说明这两个值之和为target,那么返回这两…

34 张图详解网络设备知识

网络其实很简单,就是一堆设备连接在一起,然后在上面跑各种网络协议,实现设备之间的网络互通。其中第一步便是把所有设备按照一定的规则连接起来。这些设备可能是路由器、交换机、防火墙等网络设备,也可能是服务器、电脑、手机等需…

LeetCode、338. 比特位计数【简单,位运算】

文章目录 前言LeetCode、338. 比特位计数【中等,位运算】题目链接与分类思路位运算移位处理前缀思想实现 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java…

【网络攻防实验】【北京航空航天大学】【实验三、口令破解(Password Cracking)实验】

实验三、口令破解(Password Cracking)实验 一、 L0phtCrack破解实验 1、 注册L0phtCrack: 2、 设置口令: (1) 创建3个新账户: 帐户创建过程(以test-1为例): 帐户创建结果: (2) 使用L0phtCrack破解口令:(使用管理员账号运行程序) 口令破解结果: 正确破解口令…

成长的“三把刀”

成长的“三把刀” The Three Edges of Growth: Temptation, Grievance, and Obsession 嘿,大家好啊!今天咱们来聊聊人的成长,其实就是要学会应对三样东西:诱惑、委屈和执念。就像毛姆说的,这刀刃可不好过,它…

【Pytorch】Pytorch基础入门教程

🌞欢迎来到PyTorch 的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 📆首发时间:🌹2024年2月14日&…

【JavaSE篇】——String的常用方法(全面知识覆盖)

目录 字符串常用方法 🎈字符串构造 🎈字符串长度(length) 🎈字符串是否为空(empty) 🎈String对象的比较 🌈比较是否引用同一个对象(boolean) 🌈boolean equals(Object anObject) 方法&#xff1…