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.xdnf.cn/news/140598.html

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

相关文章

HarmonyOS开发:解决DevEco Studio低版本导入高版本项目运行失败问题

前言 基于DevEco Studio 4.0 Beta2,hvigorVersion为3.0.2,开发了一个项目,上传到了远程仓库,当同事下载后,却始终无法运行,频繁报错,由于API都是使用的9,第一感觉就是开发环境不同&a…

AI-Chat,一款集全网ai功能的应用(附下载链接)

AI-Chat是一款综合性的聊天机器人,集成了多种先进的模型和功能。它采用了GPT4.0、联网版GPT和清华模型等多种模型,使得其具备更强大的语言处理能力。同时,AI-Chat还融合了AI绘画模型,例如Stable Diffusion绘画、文生图、图生图、艺…

怒刷LeetCode的第3天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:动态规划 第二题 题目来源 题目内容 解决方法 方法一:模拟 方法二:数学规律 方法三:分组 第三题 题目来源 题目内容 解决方法 方法一:数学方法 方法…

Java客户端_Apache Curator操作Zookeeper

Curator是 Netflix公司开源的一套ZooKeeper客户端框架。和ZkClient一样,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和 NodeExistsException异常等,目前已经成为了Apache的顶级项目,是全世界范围…

MySQL常见join关联查询分析

1、join关联查询七大类型结构图 2、建表语句 CREATE TABLE t_dept (id INT(11) NOT NULL AUTO_INCREMENT,deptName VARCHAR(30) DEFAULT NULL,address VARCHAR(40) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEINNODB AUTO_INCREMENT1 DEFAULT CHARSETutf8;CREATE TABLE t_emp (id…

【20230921】关于sing-box命令行程序开机自启动运行(Windows、Linux)

1 背景 sing-box是一个命令行程序,官网给出的教程是复制链接到Git Bash(windows)或终端运行(Linux)。每次开机都进行复制运行是一件繁琐的事情。 复制的内容其实就是下次并运行shell脚本,其实系统只需要运…

【Java开发】Redis位图实现统计日活周活月活

最近研究了使用 Redis 的位图功能统计日活周活等数据,特来和大家分享下,Redis 位图还可用于记录用户签到情况、判断某个元素是否存在于集合中等。 1 Redis 位图介绍 Redis 位图是一种特殊的数据结构,它由一系列位组成,每个位只能…

Ribbon自定义负载均衡算法

Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出…

【c语言】贪吃蛇

当我们不想学习新知识的时候,并且特别无聊,就会突然先看看别人怎么写游戏的,今天给大家分享的是贪吃蛇,所需要的知识有结构体,枚举,以及easy-x图形库的一些基本函数就完全够用了,本来我想插入游…

数据结构--希尔排序

目录 希尔排序的定义 给一个序列进行希尔排序 希尔排序的算法实现 算法性能分析 1.时间复杂度 2.稳定性 3.适用性 知识点回顾 希尔排序的定义 给一个序列进行希尔排序 第一趟d可以是元素个数/2 相距为4的子表 对子表进行直接插入排序(由小到大&#xf…

PostgreSQL 查询某个属性相同内容出现的次数

查询某个数据库表属性 name 相同内容出现出现的次数,并按次数从大到小排序 SELECT name, COUNT(*) AS count FROM your_table GROUP BY name ORDER BY count DESC;示例 select project_id, COUNT(*) AS count from app_ads_positions group by project_id order b…

Mojo:新AI语言中的7个惊人的Python升级

一、说明 AI发展是日新月异的,对于新模型的产生,我们不能不给以关注。Mojo就是一种新发布的编程语言,专为AI开发人员制作,由Modular制作,Modular是一家由Swift的原始创建者Chris Lattner创立的公司。 二、关于MOJO的概…

山石网科国产化入侵防御系统,打造全生命周期的安全防护

随着互联网的普及和网络安全的威胁日益增加,botnet感染成为了企业面临的重要问题之一。botnet是一种由分散的客户端(或肉鸡)组成的网络,这些客户端被植入了bot程序,受控于攻击者。攻击者通过这些客户端的bot程序&#…

华为云云耀云服务器L实例评测|Docker版的Minio安装 Springboot项目中的使用 结合vue进行图片的存取

前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到过MySQL数据库被攻击的情况,Redis被攻击的情况,教训是密码不能太简单。在使用服务器时,学习到很多运维相关的知识。 本篇博客介绍如何在Linux中安装mi…

vue element 搜索框根据后台的接口实现模糊查询 + 分页特殊处理+重置表格

模糊查询效果图 1.配置接口 search: "/api/goods/search", //搜索接口/goods/search 2.get接口 search(params) { return axios.get(base.search, { params });//后台传参 再写这个params }, 3.异步请求接口 // 搜索接口async search(search){let res await this…

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

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

**20.迭代器模式(Iterator)

意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 上下文:集合对象内部结构常常变化各异。对于这些集合对象,能否在不暴露其内部结构的同时,让外部Client透明地访问其中包含的元素…

github 网页显示不全?

问题 解决 1、检查网页,打开 network,重新刷新 github 网页 2、查看无法加载的资源(如 css 文件) 3、查看域名地址 https://tool.chinaz.com/dns/,github.githubassets.com(检查网页元素,点击无…

文件系统详解

目录 文件系统(1) 第一节文件系统的基本概念 一、文件系统的任务 二、文件的存储介质及存储方式 三、文件的分类 第二节 文件的逻辑结构和物理结构 一、文件的逻辑结构 二、文件的物理结构 文件系统(2) 第三节 文件目…

uniapp webview实现双向通信

需求&#xff1a;uniapp webview嵌套一个h5 实现双向通信 uniapp 代码 <template><view><web-view src"http://192.168.3.150:9003/" message"onMessage"></web-view></view> </template><script>export defau…