ElasticSearch - 分布式搜索引擎底层实现——倒排索引

目录

一、ElasticSearch

1.1、ElasticSearch 是什么?

1.2、ElasticStack 是什么?

1.3、正向索引和倒排索引

1.3.1、正向索引

1.3.2、倒排索引

a)倒排索引的创建过程:

b)倒排索引的查询过程: 

c)分析总结:

1.3.3、倒排索引的适用场景


一、ElasticSearch


1.1、ElasticSearch 是什么?

ElasticSearch 是一个非常强大的搜索引擎,可以帮助我们从海量的数据中,快速的找到所需要的内容.

就比如说,咱们大家去淘宝上买东西,你输入了一个商品信息,他是不是立马就搜索出跟你输入关键字有关的信息,例如你输入的关键词是 "IPhone",就可以看到会搜索出各式各样的信息,“IPhone 13 特惠”、"IPhone 10  二手出售".... 甚至还可以看到 IPhone 这个关键字,还变成红色的了,这就叫做高亮显示,是为了更清晰醒目一些.

1.2、ElasticStack 是什么?

这里实际上还有几个组件是和 ElasticSearch 一起搭配使用的,分别是 Kibana、Logstash、Beats,他们结合就是 ElasticStack 技术栈.

这套东西,被广泛的应用在微服务的日志数据分析和实时监控.

日志数据分析:我们项目在运行的过程中,会产生海量的日志信息,这些大家平常也不少见~  这些日志信息,就是方便我们去定位系统出现的问题,假设你系统报错了,在线上运行的时候,你总不可能去打断点 debug 吧,那一般就是通过先通过 Logstash 进行日志数据的抓取,elasticsearch 存储、计算、搜索数据,最后通过 Kibana 进行数据可视化给你展示处理,这样,你将来去作日志分析的时候,就非常方便了.

实时监控:在项目运行的时候,他的运行状态也是数据,比如 cpu 、内存情况、访问的频率等等,这些信息也会被 es 管理起来,然后通过可视化给你展示处理啊,这样你就能清除的知道项目的运行情况了.

但实际上,在 ElasticStack 中,Kibana 、Logstash、Beats 这三个组件都是可以替换的,官方提供给你,想用就用,不用也没关系,就比如 淘宝在展示搜索结果的时候,都是有自己的网页自己去展示,就不一定是通过 Kibana 生成的数据报表来展示.但是不可替代的就是 elasticsearch 这个核心(也是之后讲解的重点).

1.3、正向索引和倒排索引

1.3.1、正向索引

传统数据库(比如 mysql)就是采用正向索引.

假如我这里有一张数据库表,一般都会基于 id 去创建一个索引,形成一个 b+ 树,那么根据 id 进行检索的速度就会非常快,那么这种方式就是正向索引.  但是如果现在搜索的字段不是 id,是一个普通的标题字段(一般内容会比较长),所以你不会给他加索引.

那就算你给他加了索引,如果我现在要搜索的不是一个精确的标题值,我只搜其中的一部分,这时候你怎么办?你不是要来一个 select * from 表 where 标题 like 什么... 一旦使用了这样的模糊匹配,即使这个字段有索引,将来也是不生效的,最终导致数据库就会采用逐条扫描的方式,判断每一行数据中是否包含 标题关键字 ,如果不包含就抛弃,如果包含就放到结果集中.  这样一来,假如你有 10亿 条数据,就意味着要扫描 10 亿次啊!性能可想而知. 这也便是正排索引.

1.3.2、倒排索引

elasticsearch 的底层就是采用倒排索引,并且这里涉及到两个概念:

  • 文档:每条数据就是一个文档(例如 mysql 表中的一行数据,比如商品表中,一个商品就是一个文档,用户表中一个用户就是一条数据).
  • 词条:文档按照语义分成的词语,比如 “华为手机” 这四个字,就可以分成 “华为”和 “手机” .
a)倒排索引的创建过程:

假设有一张商品表:

1. 为 商品表 中 商品名称 倒创建倒排索引时候,会把 商品名称 中的内容分成词条去存储,比如商品名称是 “小米手机” ,那么就把这个标题进行分词得到两个词语 “小米” 和 “手机” 去存储起来. 

2. 此时,比如把 “小米” 拿过来存储时,同时也会把他的 id 记录到他的文档中,而 “手机” 这个词就会存到一个新的文档,同时记录他的 id. 

3. 如果下一条数据的 商品名称 被分词后又得到了 "手机" 这个词条,就会把他的 id 存到词条相同的文档中.

4. 以此类推,最后数据组织完成了,就可以给得到的所有词条创建索引了,这样,将来根据词条查询的速度是不是就更快了.

b)倒排索引的查询过程: 

1. 比如现在来搜索一下 “华为手机”,首先会将他进行分词,得到得到两个词条,“华为”和“手机”.

2. 接下来拿着词条去倒排索引中进行查询,由于刚才就是根据 词条 建立的索引,所以一查就能立刻查到,词条 "华为" 所包含的文档 id(假设 id 有 2,3) ,以及“手机” 所包含的文档 id(假设 id 有 1,2),这时候也就相当于知道了 “华为手机” 包含的所有文档(1,2,3).

3. 其中 id = 2 的商品信息存在于两个文档中,也就是说 id = 2 的商品名称更符合你的搜索的信息,那么将来还会按照这个匹配程度给你排序.

4. 此时,拿着这些 id 就可以去正向索引里查询文档了,而正向索引这边不就是根据 id 建立的索引么,那么拿着 id 就可以快速定位到文档了,将查询到的数据按照排序的 id 放到结果集中.

c)分析总结:

根据上述过程,我们可以看到,搜索的过程经历了两次检索:

  • 第一次是根据用户输入的内容的词条,去找到对应的文档 id.
  • 第二次是拿着文档 id 来找文档.

这样的查询效率,相比于正向索引中搜索 包含手机关键字的 数据,一行一行去查找就要快的多了.

倒那么这里也能够看出,排索索引为什么是倒排了,因为正向索引中,得一行一行找,找到匹配的放到结果集中,而倒排索引就是反过来,基于词条创建索引,搜多的时候,就是根据词找到对应的文档(正向索引就是根据文档来找词).

1.3.3、倒排索引的适用场景

倒排索引更擅长查询文档的部分内容,比如你去浏览器里搜索内容的一部分关键词,或者是搜索商品信息之类的等等.

这也就是为什么 elasticsearch 是基于 倒排索引 实现的搜索引擎了~~

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

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

相关文章

LeetCode讲解篇之347. 前 K 个高频元素

347. 前 K 个高频元素 文章目录 347. 前 K 个高频元素题目描述题解思路题解代码 题目描述 题解思路 根据数组频率倒序排序, 然后返回前k的个数据 题解代码 func topKFrequent(nums []int, k int) []int {m : make(map[int]int, 0)for i : len(nums) - 1; i > 0; i-- {m[n…

一拖三快充线(USB-C转三充)的解决方案--LDR6020P

DR6020P 是带有 3 组 6 路 DRP USB-C 及 PD 通信协议处理模块和 USB2.0 Device 功能的 16 位 RISC MCU,内置 8K16 位 MTP 程序存储器(可烧录 1000 次),512 字节的数据存储器(SRAM)。内置 LDO 5V 输出&#…

滑动窗口9.23

1876.长度为3且各字符不同的子字符串 1876. 长度为三且各字符不同的子字符串 - 力扣(LeetCode)https://leetcode.cn/problems/substrings-of-size-three-with-distinct-characters/?envTypelist&envId24zW97w8自写思路: 数组充当哈希表…

Mysql004:用户管理

前言:本章节讲解的是mysql中的用户管理,包括(管理数据用户)、(控制数据库的访问权限)。 目录 1. 查询用户 2. 创建用户 3. 修改用户密码 4. 删除用户 5. 权限控制 1. 查询用户 在mysql数据库中&#xff0…

数字IC设计系列----单端口RAM、双端口RAM

一、单端口RAM原理及实现 1.1、概念/原理 在内存空间中开辟出一段固定大小的内存用于存储数据,每一个数据所占的bit位称之为位宽,这段内存空间中数据的总数称之为深度。例如reg [7:0] mem [255:0],这段内存空间中每一个数据的位宽为8bit&am…

Nuxt 菜鸟入门学习笔记:路由

文章目录 路由 Routing页面 Pages导航 Navigation路由参数 Route Parameters路由中间件 Route Middleware路由验证 Route Validation Nuxt 官网地址: https://nuxt.com/ 路由 Routing Nuxt 的一个核心功能是文件系统路由器。pages/目录下的每个 Vue 文件都会创建一…

C语言数组和指针笔试题(四)(一定要看)

目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个人主页 🥸🥸🥸C语言 🐿️…

【Unity3D赛车游戏制作】开始界面场景搭建

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

大模型的最大bug,回答正确率几乎为零,GPT到Llama无一幸免

目录 前言 1.名字和描述颠倒一下,大模型就糊涂了 2.实验及结果 3.未来展望 前言 大模型的逻辑?不存在的。 我让 GPT-3 和 Llama 学会一个简单的知识:A 就是 B,然后反过来问 B 是什么,结果发现 AI 回答的正确率竟然是…

SpringCloud Alibaba - Sentinel

接上文SpringCloud Alibaba - Nacos 1.Sentinel 流量防卫兵 1.1 安装与部署 和Nacos一样,它是独立安装和部署的,下载地址https://github.com/alibaba/Sentinel/releases 下载后的jar放到目录 然后配置 启动并访问,用户名密码都是 sentinel 此时就…

2024年考研教育专业的教育综合考试大纲、样题和往年真题

根据教育部通知,2024年全国硕士研究生招生考试初试定于2023年12月23日至24日,即我们说的2024年考研时间为12月23-24日。距离现在只剩下3个月不到的时间,那么如何让我们在最后三个月内的复习和备考有效且高效呢? 结合很多清北复交研…

湖南麒麟两种修复硬盘方式

1、背景介绍 目前X86平台采用湖南麒麟3.3-3B系统,当遇到文件系统损坏时,可分下面两种情况进行文件系统修复 2、紧急模式下的修复 板子能进入系统,但是进入的是紧急模式,类似下面这种 此时可以直接输入修复命令进行系统修复 xf…

win11 允许使用脚本Set-ExecutionPolicy

目录 Set-ExecutionPolicy RemoteSigned notepad.exe $PROFILE Set-ExecutionPolicy RemoteSigned Set-ExecutionPolicy RemoteSigned 如果报错,执行: Set-ExecutionPolicy -Scope CurrentUser 然后就会提示我们输入,我们把刚刚的 Remot…

C语言每日一题(10):无人生还

文章主题:无人生还🔥所属专栏:C语言每日一题📗作者简介:每天不定时更新C语言的小白一枚,记录分享自己每天的所思所想😄🎶个人主页:[₽]的个人主页🏄&#x1f…

Ubuntu 安装 CUDA 与 OPENCL

前言:最近需要做一些GPU并行计算,因而入坑CUDA和OPENCL,两者都有用到一些,刚好有点时间,同时记录一些学习过程,排掉一些坑,这篇是环境安装篇,基本跟着走就没什么问题,环境…

Qt5开发及实例V2.0-第二十一章-Qt.Quick Controls开发基础

Qt5开发及实例V2.0-第二十一章-Qt.Quick Controls开发基础 第21章 Qt Quick Controls开发基础21.1 Qt Quick Controls概述21.1.1 第一个Qt Quick Controls程序21.1.2 Qt Quick窗体应用程序的构成 21.2 Qt Quick控件21.2.1 概述21.2.2 基本控件21.2.3 高级控件21.2.4 样式定制 2…

基于MUSIC算法的二维超声波成像matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基本原理 4.2、数学公式 4.3、实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................…

比特币的蒙提霍尔问题

把钱放在嘴边 我们在比特币上建立了蒙提霍尔问题模拟。 如果您知道概率谜题的正确答案,不仅炫耀您的数学技能,还会获得金钱奖励。 它完全无需信任地在链上运行。 蒙提霍尔问题 蒙提霍尔问题(三门问题)是一个以蒙提霍尔命名的概率…

力扣-234.回文链表

Idea 用一个数组或者字符串将链表中的值依次存入,然后利用数组遍历方法比较双端元素 AC Code class Solution { public:bool isPalindrome(ListNode* head) {string s "";ListNode* p head;while(p ! nullptr){s.append(to_string(p->val));p p-&g…

SQL 如何提取多级分类目录

前言 POI数据处理,原始数据为csv格式,整理入库至PostGreSQL,本例使用PostGreSQL13版本。 一、POI POI(一般作为Point of Interest的缩写,也有Point of Information的说法),通常称作兴趣点&am…