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

当我们谈论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.hqwc.cn/news/466984.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业数字化转型介绍

目录 ​编辑 一、企业数据化转型概述 1.1 概述 二、传统企业数字化转型的困难 2.1 传统企业数字化建设阶段划分 2.1.1 第一阶段,以产品外购方式为主 2.1.2 第二阶段,自主研发为辅、外包为主 2.1.3 第三阶段,自主研发为主、外包为辅 …

【数据结构】链表OJ面试题3《判断是否有环》(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 记录每天的刷题,继续坚持! 2.OJ题目训练 9. 给定一个链表,判断链表中是否有环。 力扣(LeetCode)官网 - 全球极客挚爱的技术成…

【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 &#x1f680…

更新至2022年,迪博上市公司内部控制指数、分项指数、评级等数据

更新至2022年,上市公司迪博内部控制指数、分项指数、评级等数据 1、时间:更新至2022年,四份数据,具体时间见下文 2、范围:上市公司 3、具体数据: 2000-2022年上市公司内部控制指数评级及评分数据 2007…

AMD FPGA设计优化宝典笔记(3)控制集

控制集 1 控制集的个数要求 控制集 control set:因为 7 系列 FPGA,一个 slice 只能有一种控制集(触发器的使用方式 比如有复位/有时钟使能等等),多了就会分布到不同的 slice 里, 所以代码尽量统一触发器的…

ubuntu下如何查看显卡及显卡驱动

ubuntu下如何查看显卡及显卡驱动 使用nvidia-smi 工具查看 查看显卡型号nvida-smi -L $ nvidia-smi -L GPU 0: NVIDIA GeForce RTX 3050 4GB Laptop GPU (UUID: GPU-4cf7b7cb-f103-bf56-2d59-304f8996e28c)当然直接使用nvida-smi 命令可以查看更多信息 $ nvidia-smi Mon Fe…

【C语言】实现双向链表

目录 (一)头文件 (二) 功能实现 (1)初始化 (2)打印链表 (3) 头插与头删 (4)尾插与尾删 (5)指定位置之后…

产品交付双轮驱动思维模型下的思考的研发工具

一、产品交付双轮驱动思维模型 之前读过这样双轮驱动思维模型,其思维模型如下图所示,双轮驱动思维模型是一个产品价值交付模型,总的理念是以“真北业务价值”为导向,以“产品快速交付”为动力,将“业务价值”与“产品…

ZigBee学习——BDB

✨本博客参考了善学坊的教程,并总结了在实现过程中遇到的问题。 善学坊官网 文章目录 一、BDB简介二、BDB Commissioning Modes2.1 Network Steering2.2 Network Formation2.3 Finding and Binding(F & B)2.4 Touchlink 三、BDB Commissi…

【Web】Redis未授权访问漏洞学习笔记

目录 简介 靶机配置 Redis持久化 Redis动态修改配置 webshell 反弹shell Redis写入反弹shell任务 加固方案 简介 Redis(Remote Dictionary Server 远程字典服务器)是一个开源的内存数据库,也被称为数据结构服务器,它支持…

数据结构哈希表

这里个大家用数组来模拟哈希表 法一&#xff1a;拉链法 法二&#xff1a;开放寻址法 /** Project: 11_哈希表* File Created:Sunday, January 17th 2021, 2:11:23 pm* Author: Bug-Free* Problem:AcWing 840. 模拟散列表 拉链法*/ #include <cstring> #include <iostr…

Swift Combine 发布者订阅者操作者 从入门到精通二

Combine 系列 Swift Combine 从入门到精通一 1. Combine核心概念 你只需要了解几个核心概念&#xff0c;就能使用好 Combine&#xff0c;但理解它们非常重要。 这些概念中的每一个都通过通用协议反映在框架中&#xff0c;以将概念转化为预期的功能。 这些核心概念是&#x…