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

运维开发.索引引擎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实现高效全文搜索的核心原理。相比传统的正序索引,倒序索引在全文搜索场景下具有以下特点:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ConCurrentHashMap源码学习

ConCurrentHashMap在JDK7之前是ReentrantLockSegmentHashEntry,在JDK8及之后是synchronizedCASNode红黑树。 JDK7之前 对于JDK7的版本实现,ConcurrentHashMap为了提高本身的并发能力,在内部采用了一个Segment结构,一个Segment其…

路由器不能端口映射什么原因?如何设置内网映射?

近期有小伙伴发来求助信息,他以前开游戏服务器和别人一起玩,那个时候端口映射还好,不知道哪一天开始突然不行了,已经是公网了,光猫是桥接的状态,连路由器都换了,就是不能端口映射开服务器&#…

如何使用Suno:免费的AI歌曲生成器

文章目录 Suno AI 是什么?Suno AI 如何工作?选择Suno AI的理由:核心优势易于操作多样化创作灵活的定价策略版权保障技术突破 如何使用Suno AI创作歌曲?第1步:注册Suno AI账户第2步:输入提示词创建第 3 步&a…

酷开系统 | 酷开科技把握智慧先机 AI赋能家庭场景

智慧化是当今世界科技发展的前沿领域之一。现在的智慧化,也正在逐步成为我们日常生活的一部分。电视系统也进入了数字化时代,AI的应用正在不断扩展,其潜力似乎无穷无尽。 酷开科技深耕人工智能技术,在提升语音体验、强化智能家居…

leetcode230 二叉搜索树中第K小的元素

题目 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 示例 输入:root [5,3,6,2,4,null,null,1], k 3 输出:3 解析 这道题应该是能做出…

小程序丨数据功能如何使用

查询发布完成后,如发现信息有误或想要修改信息,老师可以使用数据功能在线修改已发布的查询内容。 数据功能包含导出、添加、编辑、更多操作,下面来教大家如何使用吧。 📌使用教程 数据功能主要用于在线修改已发布的查询内容&#…

什么是流量削峰?如何解决秒杀等业务的削峰场景

文章推荐 1 作为程序员,开发用过最好用的AI工具有哪些? 2 Github Copilot正版的激活成功,终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手,帮助你提高写代码效率 5 Jetbrains的a…

软件设计:基于 python 代码快速生成 UML 图

1. 官方文档 PlantUML Language Reference Guide Comate | 百度研发编码助手 百度 Comate (Coding Mate Powered by AI) 是基于文心大模型的智能代码助手,结合百度积累多年的编程现场大数据和外部优秀开源数据,可以生成更符合实际研发场景的优质代码。…

【easyx】快速入门——弹球小游戏(第一代)

目录 1.需求 2.运动的小球 3.碰到边缘反弹 4.圆周撞击或越过边界反弹 5.绘制和移动挡板 6.小球碰到挡板反弹 7.游戏失败时该如何处理 8.随机初始条件 9.完整代码 我们这一节将结合动画和键盘交互的知识来做一个小游戏 1.需求 我们先看需求:小球在窗体内运动,撞到除…

OTP8脚-全自动擦鞋机WTN6020-低成本语音方案

一,产品开发背景 首先,随着人们生活质量的提升,对鞋子的保养需求也日益增加。鞋子作为人们日常穿着的重要组成部分,其清洁度和外观状态直接影响到个人形象和舒适度。因此,一种能够自动清洁和擦亮鞋子的设备应运而生&am…

docker 安装 SonarQube

文章目录 docker 安装 SonarQube一、修改句柄二、创建挂载文件夹三、拉取镜像四、修改 PG 库4.1、创建用户4.2、创建库 五、启动和挂载六、访问七、安装插件 docker 安装 SonarQube 版本:8.9 对 JDK 8 最大支持为 8.9 版本 一、修改句柄 #修改文件句柄数量&#…

Android Studio 版本升级后 Gradle project sync failed(Android V 应用升级)

问题及解决方案 更新到蜥蜴 Android Studio Iguana 后,出现Gradle project sync failed的问题(IDE更新版本的常态了)。 背景:对应用进行Android V版本升级(SDK35,gradle插件版本要 8.4.0) 1、…

安卓实现5个底部导航栏切换fragment

步骤,写 5 个 fragment 自定义的类5个布局文件: package com.xmkjsoft.xhgh.fragment;import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;import androidx.annotation.NonNul…

每日一题——C++、Python实现牛客网CM11 链表分割(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 题目链接 目录 我的写法 C嘎嘎 ​编辑 Python 代码点评 代码点评 时间复杂度分析 空…

飞凌嵌入式亮相上海CPSE,展现智能充储技术新力量

5月22日~24日,第三届上海国际充电桩及换电站展览会(CPSE)在上海汽车会展中心举行,飞凌嵌入式以“聚焦充电桩主控智造赋能车桩智联”为主题参展,与来自全国的客户朋友及行业伙伴一同交流分享,展位号Z15。 作为国内较早从事嵌入式技…

PDF24 Creator v11.12.1软件安装教程(附软件下载地址)

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! PDF24 Creator v11.12.1是一款免费、简便实用的多功能 PDF 工具。用户可通过直观拖放界面轻松组合、编辑和处理PDF文件。功能包括合并、分割、添加、…

JVM学习-动态链接和方法返回地址

动态链接–指向运行时常量池的方法引用 每一个栈帧内部包含一个指向运行时常量池中该栈帧所属方法的引用,包含这个引用的目的为了支持当前方法的代码能够实现动态链接(Dynamic Linking),如invokednamic指令。在Java源文件被编译到字节码文件中时&#x…

异步爬虫学习实战项目:水效标识网

大家好,我是南枫,今天一起来学习异步爬虫。 文章开始之前,我们先搞清楚为什么要学异步爬虫?我们之后在工作中会遇到爬大量数据,比如百万数据采集,用平常的方法爬取的效率会比较低,所以要学习异…

AI应用案例:电能量异常分析智能诊断系统

窃电和计量装置故障造成漏收、少收电费使电力系统利益受损。一般情况主要通过定期巡检、定期校验电表、用户举报窃电等手段来发现窃电或计量装置故障。对人的依赖性太强,抓窃查漏的目标不明确。利用电力系统中逐步积累下来的海量真实数据,采用数据挖掘技…

CSDN智能总结助手

github项目地址: https://github.com/anjude/little-demo/tree/master 获取CSDN的user name和user token 打开csdn,打开控制台 - Application - Cookies,找到domain为blog.csdn.net的cookie,复制user_name和user_token的值 把上…