运维开发.索引引擎ElasticSearch.倒序索引的概念

news2025/3/9 10:50:35
运维开发.索引引擎ElasticSearch
倒序索引的概念

- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/139141734
HuaWei:https://bbs.huaweicloud.com/blogs/427858

【介绍】:Elasticsearch是一个基于Lucene的开源分布式搜索和分析引擎,它能够实现对大规模数据的实时全文搜索和复杂的数据分析。Elasticsearch之所以能够快速地处理海量数据的搜索和分析需求,其核心原理就在于它采用了一种称为"倒序索引"的数据结构。在接下来的内容中,我们将深入探讨Elasticsearch倒序索引的原理。

在这里插入图片描述


1. 概述

Elasticsearch是一个基于Lucene的开源分布式搜索和分析引擎,它能够实现对大规模数据的实时全文搜索和复杂的数据分析。Elasticsearch之所以能够快速地处理海量数据的搜索和分析需求,其核心原理就在于它采用了一种称为"倒序索引"的数据结构。

倒序索引是Elasticsearch高性能搜索的基石,它颠覆了传统的正序索引模式,为全文搜索和复杂查询带来了革命性的改进。那么,倒序索引到底是如何实现的呢?它与正序索引有何不同?为什么说它是Elasticsearch高效搜索的关键?

在接下来的内容中,我们将深入探讨Elasticsearch倒序索引的原理。

2. 正序索引

要讲清楚为什么需要倒序索引,还需要了解传统的正序索引。正排索引,也称为正序索引,是一种传统的索引方式。它的基本思路是通过唯一的文档ID(通常作为主键)来索引和存储文档内容。

2.1 搜索文档为例

以常见的关系型数据库MySQL为例,我们可以创建一张文章表,其中包含文章ID和文章内容两个字段。文章ID作为主键,同时在其上建立聚集索引(Clustered Index)。当我们需要查询某篇文章时,可以直接根据文章ID通过聚集索引快速定位到对应的文章内容,这个过程非常高效。

2.2 搜索文档内容的局限性

虽然正序索引在通过唯一ID查找文档时非常高效。然而,正序索引在面对全文搜索需求时却显得力不从心。

设想一下,如果我们要查询包含某个关键词的文章,使用正序索引的思路,我们需要遍历每一篇文章的内容,判断其中是否包含目标关键词。这个过程不仅效率低下,而且还要考虑关键词的语言变体(如大小写、单复数等)。如果文章数量庞大,这种查询方式几乎是不可接受的。

假设我们要查询所有包含"Elasticsearch"这个关键词的文章。使用正序索引,我们需要遍历每一篇文章的内容,检查其中是否出现了"Elasticsearch"这个词。这个过程存在以下问题:

  1. 查询效率低:对于大规模的文档集合,逐个遍历文档内容是非常耗时的操作。即使使用了并行处理,查询效率也难以满足实时搜索的需求。
  2. 匹配准确性差:关键词在文档中的出现形式可能多种多样,如大小写变体(“Elasticsearch"vs"elasticsearch”)、单复数形式(“index"vs"indexes”)等。简单的字符串匹配难以覆盖所有的语言变体,导致匹配准确性下降。
  3. 无法支持相关度排序:用户往往希望搜索结果能够按照与查询关键词的相关程度排序。但正序索引无法直接获取文档与关键词的相关度信息,难以实现基于相关度的排序。
  4. 难以实现复杂查询:实际搜索需求往往不限于单个关键词,而是多个关键词的组合条件。例如,“Elasticsearch AND Lucene"或"Elasticsearch OR Solr”。正序索引很难高效支持这种复杂条件查询。

综上,正序索引在面对全文搜索需求时,在查询效率、准确性、排序和复杂条件支持等方面都有很大局限。这些局限性阻碍了正序索引在大规模全文搜索场景下的应用。

为了克服正序索引的局限,Elasticsearch采用了一种全新的索引结构——倒序索引。倒序索引从关键词出发,建立关键词到文档的映射关系,从而实现高效、准确、灵活的全文搜索。这将再后面的小节中进行介绍。

3. Elasticsearch的全文搜索需求

Elasticsearch作为一个全文搜索引擎,面临着各种复杂的搜索需求。这些需求远远超出了简单的根据唯一ID查找文档的范畴,而是要求能够根据文档内容进行灵活、高效的搜索。

最常见的全文搜索需求就是根据关键词查找相关文档。用户输入一个或多个关键词,搜索引擎需要返回所有包含这些关键词的文档。这种查询要求搜索引擎能够快速定位到包含指定词条的文档,而不是逐个文档进行字符串匹配

用户的查询词条可能与文档中的词条并不完全一致,可能存在拼写错误、词形变化等情况。因此,搜索引擎需要支持模糊匹配,即能够返回与查询词条相似但不完全相同的文档。这要求搜索引擎在索引时考虑词条的变体形式,并在查询时进行相应的模糊匹配。

如果使用正排索引来应对这些全文搜索需求,我们将面临严重的效率问题。因为正排索引的文档是按照唯一ID组织的,没有直接建立词条与文档的映射关系

在关键词查询时,如果使用正排索引,我们需要遍历每个文档,在其内容中搜索是否包含目标词条。这个过程非常耗时,尤其是当文档数量庞大时,查询响应时间将难以接受。

对于模糊匹配,问题更加严重。我们不仅要遍历所有文档,还需要在每个文档中考虑词条的各种变体形式,如大小写单复数时态等。这进一步增加了查询的复杂度和时间开销

大小写、同义词、词形变化等语言现象也给查全率和查准率带来挑战。例如,如果用户搜索"Elasticsearch",而文档中出现的是"elasticsearch"或"ElasticSearch",使用正排索引的简单字符串匹配就会漏掉这些文档,导致查全率下降。

反过来,如果我们在正排索引中对所有词条都进行大小写转换和词形还原,则可能把不相关的文档也匹配出来,导致查准率下降。同义词的处理也面临类似的两难困境。

可见,正排索引在面对Elasticsearch的全文搜索需求时,无论是查询效率还是查询质量,都难以满足实际应用的要求。

=> 这就促使Elasticsearch采用了一种全新的索引结构——倒排索引,来解决全文搜索中的种种难题。倒排索引通过词条到文档的映射,实现了高效的关键词查询和灵活的模糊匹配,同时兼顾了查全率和查准率。在下一节中,我们将深入剖析倒排索引的原理和优势。

4. 倒序索引的原理

4.1 倒序索引的基本概念

倒序索引(Inverted Index),也称为反向索引,是一种索引方法,用于存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是实现 “单词-文档矩阵” 的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。

倒序索引的思路是:将文档中的内容按照词条(Term)进行拆分,并建立词条与文档的映射关系。例如,对于一个包含"Elasticsearch is cool"的文档,倒序索引会将其拆分为"Elasticsearch"、“is”、"cool"三个词条,然后分别记录这些词条出现在哪些文档中

当用户搜索某个词条时,倒序索引可以快速返回包含这个词条的文档列表,而无需逐个文档进行扫描。这种 "词条到文档"的映射结构是倒序索引的核心它颠覆了传统的"文档到内容"的组织方式

4.2 倒序索引的数据结构

倒序索引主要由两部分组成:词条字典(Term Dictionary)、倒排列表(Posting List)。

4.2.1 词条字典

:

词条字典是倒序索引的核心组成部分,它记录了所有文档的词条,并为每个词条分配一个唯一的ID。

词条字典通常采用树形结构(如B树)或哈希表来组织,以支持快速的词条查找。

对于词条的组织,倒序索引还会考虑语言处理,如大小写转换、词形还原、同义词处理等,从而实现更加智能的匹配。

4.2.2 倒排列表

倒排列表记录了每个词条对应的文档信息,即某个词条出现在了哪些文档中。

对于每个词条,倒排列表中包含了一组文档ID,表示该词条在这些文档中出现过。

除了文档ID,倒排列表还可以记录词条在文档中的位置、频率等附加信息,用于支持高级的查询和排序功能。

举例来说,假设我们有以下三个文档:

  • 文档1:“Elasticsearch is cool”

  • 文档2:“Elasticsearch is fast”

  • 文档3:“Lucene is cool”

对应的倒序索引结构如下:

词条字典:
- Elasticsearch -> ID: 1
- is -> ID: 2
- cool -> ID: 3
- fast -> ID: 4
- Lucene -> ID: 5

倒排列表:
- 1 -> [文档1, 文档2]
- 2 -> [文档1, 文档2, 文档3]  
- 3 -> [文档1, 文档3]
- 4 -> [文档2]
- 5 -> [文档3]

可以看到,通过倒序索引,我们可以快速找到包含某个词条的文档列表。例如,搜索"Elasticsearch"时,只需查找词条字典得到其ID(1),然后访问倒排列表即可获得包含该词条的文档列表[文档1, 文档2]。这个过程不需要对每个文档进行全文扫描,效率非常高。

4.2.3 正序索引与倒序索引的查询过程对比

现在对两种方式做一个简要对比作为回顾:

正序索引的查询过程:

  1. 用户输入查询词条;
  2. 对每个文档,遍历其内容,判断是否包含查询词条;
  3. 返回包含查询词条的文档列表。

倒序索引的查询过程:

  1. 用户输入查询词条;
  2. 在词条字典中查找查询词条的ID;
  3. 通过词条ID在倒排列表中获取包含该词条的文档列表;
  4. 返回文档列表。

可以看到,倒序索引的查询过程省去了对每个文档内容的遍历,直接通过词条定位到相关文档。这种"词条到文档"的映射关系使得查询效率大大提高。

而且,倒序索引在建立索引时就完成了词条的提取和语言处理工作,查询时无需再次进行这些操作。相比之下,正序索引在每次查询时都需要对文档内容进行分词和语言处理,开销较大。

倒序索引通过预先建立词条与文档的映射关系,将查询时间复杂度从线性降低到了常数级别。这是Elasticsearch实现高效全文搜索的关键所在。

5. 结论

倒序索引是Elasticsearch实现高效全文搜索的核心原理。相比传统的正序索引,倒序索引在全文搜索场景下具有以下特点:

  • 查询效率高:倒序索引通过建立词条到文档的映射关系,将查询时间复杂度从线性降低到了常数级别。查询时无需对每个文档进行全文扫描,而是通过词条直接定位到相关文档,效率非常高。即使在海量文档的情况下,倒序索引也能实现亚秒级的查询响应。
  • 查准率高:倒序索引在建立索引时就完成了词条的提取和语言处理工作,如大小写转换、词形还原、同义词处理等。查询时无需再次进行这些操作,可以直接使用标准化后的词条进行匹配。这种预处理机制有效提高了查询的准确性,降低了错误匹配的可能性。
  • 查全率高:得益于倒序索引的词条字典,所有文档的词条都被提取和记录在案。查询时只要词条存在于字典中,就一定能找到所有包含该词条的文档,不会漏掉任何相关结果。这种全面性保证了查询的查全率,避免了相关文档被遗漏的问题。
  • 支持高级查询:倒序索引不仅记录了词条与文档的映射关系,还可以存储词条的位置、频率等附加信息。这为实现高级查询功能提供了支持,如短语查询、相似度排序、词频统计等。这些功能大大扩展了全文搜索的应用场景和灵活性。

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

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

相关文章

微信小程序源码-基于Java后端的小区租拼车管理信息系统毕业设计(附源码+演示录像+LW)

大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设…

[Android]联系人-删除修改

界面显示 添加按钮点击,holder.imgDelete.setlog();具体代码 public MyViewHolder onCreateViewHolder(NonNull ViewGroup parent, int viewType) {//映射布局文件,生成相应的组件View v LayoutInflater.from(parent.getContext()).inflate(R.layout.d…

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

漏洞复现环境搭建请参考 http://t.csdnimg.cn/MxmId 漏洞版本 Apache Log4j 2.8.2之前的2.x版本 漏洞验证 (1)开放端口4712 漏洞利用 (1)ysoserial工具获取 wget https://github.com/frohoff/ysoserial/releases/download/v0…

JAVA面试题大全(九)

1、为什么要使用 spring? 方便解耦,便于开发支持aop编程声明式事务的支持方便程序的测试方便集成各种优秀的框架降低JavaEE API的使用难度 2、解释一下什么是 aop? AOP 是 Aspect-Oriented Programming 的缩写,中文翻译为“面向…

食品行业精细化收入管理的新引擎

在当今数字化时代,食品行业面临着前所未有的机遇与挑战。市场竞争日益激烈,消费者需求日趋多元化,要求企业不仅要提供高质量的产品,还要在收入管理上做到精细、高效。用友BIP收入云作为一套先进的收入管理工具,正逐步成…

分布式微服务之springboot学习

文章目录 SpringBoot基本介绍官方文档springboot是什么?springboot快速入门需求/图解说明完成步骤快速入门小结 Spring SpringMVC SpringBoot的关系梳理关系如何理解 -约定优于配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景启动器starte…

STM32F4_HAL控制GPIO输出——跑马灯实验

1、GPIO工作模式 1.1 端口输入数据寄存器(IDR) 1.2 端口输出数据寄存器(ODR) 1.3 端口置位/复位寄存器(BSRR) 为什么有了 ODR 寄存器,还要这个 BSRR 寄存器呢?我们先看看 BSRR 的寄…

AI大模型应用开发实践:4.基于 Chat Completions API 实现外部函数调用

基于 Chat Completions API 实现外部函数调用 2023年6月20日,OpenAI 官方在 Chat Completions API 原有的三种不同角色设定(System, Assistant, User)基础上,新增了 Function Calling 功能。 详见OpenAI Blog functions 是 Chat Completion API 中的可选参数,用于提供…

文件传输服务应用1——java集成smb2/3详细教程和windows共享服务使用技巧

在实际项目开发过程中,读取网络资源或者局域网内主机的文件是必要的操作和需求。而FTP(文件传输协议)和SMB(服务器消息块)是两种最为常见的文件传输协议。它们各自在文件传输领域拥有独特的优势和特点,但同…

mac清理软件推荐免费 mac清理系统数据怎么清理 cleanmymac和腾讯柠檬哪个好

macbook是苹果公司的一款高性能的笔记本电脑,受到了很多用户的喜爱。但是,随着使用时间的增长,macbook的系统也会积累一些垃圾文件,影响其运行速度和空间。那么,macbook系统清理软件推荐有哪些呢?macbook用…

【Text2SQL 论文】SQLova:首次将 PLM 应用到 NL2SQL 中

论文:A Comprehensive Exploration on WikiSQL with Table-Aware Word Contextualization ⭐⭐⭐⭐ KR2ML Workshop at NeurIPS 2019, arXiv:1902.01069 Code: SQLova | GitHub 参考文章:将预训练语言模型引入WikiSQL任务 | CSDN 一、论文速度 这篇论文…

ZEDmini使用完全指南

ZEDmini使用 ZED stereolabs 开箱测评 使用说明 ubuntu18.04nvidiacuda10 ubuntu18.04ZED SDK安装和使用 Ubuntu16.04安装NVIDIA显卡驱动 查看显卡信息 redwallredwall-G3-3500:~/catkin_ws$ lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Device …

XV7011BB陀螺仪传感器广泛用于工业应用

陀螺仪传感器作为一种重要的惯性传感器,在航空航天、智能手机与可穿戴设备、工业控制与机器人、汽车行业、医疗仪器等多个领域都有着重要的应用,为这些领域的发展和创新提供了关键支持。 Epson陀螺仪传感器系列以其优异的性能和可靠性著称&#xff0c…

【20天拿下Pytorch:Day 8】模型层layers

文章目录 1. 内置模型层1.1 基础层1.2 卷积网络相关层1.3 循环网络相关层1.4 Transformer相关层 2. 自定义模型层 深度学习模型一般由各种模型层组合而成。 torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类,具备参数管理功能。 注:这…

最新 ROS 2 Jazzy Jalisco 发布!支持 Ubuntu 24.04

系列文章目录 前言 世界海龟日快乐 今天,ROS 2 发布团队很高兴地宣布 ROS 2 的第十个版本:Jazzy Jalisco(代号 jazzy)。 除了之前分享的官方徽标,我们还发布了全新的 Jazzy Jalisco 图标。 Jazzy Jalisco 是一个长期支…

2024电工杯A题保姆级分析完整思路+代码+数据教学

2024电工杯A题保姆级分析完整思路代码数据教学 A题题目:园区微电网风光储协调优化配置 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 总体分析: 题目要求对园区微电网进行风光储协调优化配置,具体涉及三个园区&#xff08…

小蓝和小青在做数字破解游戏

小蓝和小青在做数字破解游戏,设某图案由m*n的0和1点阵组成,依照以下规则破解连续一组数值,从点阵图第一行第一个符号开始计算,从左到右,由上至下。第一个数表示连续有几个0,第二个数表示接下来连续有几个1,…

链表经典OJ问题【环形链表】

题目导入 题目一:给你一个链表的头节点 head ,判断链表中是否有环 题目二:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL。 题目一 给你一个链表的头节点 head ,…

什么是物联网通信网关?-天拓四方

在信息化、智能化的时代,物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备,将现实世界与数字世界紧密相连,从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分,物联网通信…

Q-Learning学习笔记-李宏毅

introduction 学习的并不是policy,而是学习critic,critic用来评价policy好还是不好;一种critic:state value function V π ( s ) V^\pi(s) Vπ(s)是给定一个policy π \pi π,在遇到state s s s之后累积的reward的…