搜索引擎
更新: 5/5/2025 字数: 0 字 时长: 0 分钟
如果说一个后端程序员最先接触的四个中间件是什么,我一定会说是——MySQL,Redis,MQ,ElasticSearch
这里我们就来聊一下ElasticSearch的相关问题
(基础内容已经在另一篇文章中提到过,这里主要是将一些在实际使用时会遇到的问题)
ES如何实现的分布式?
首先我们还是先来看一下ES的层级
index(表) -> type(7.0后被移除) -> mapping(表属性) -> document(行) -> field(列)
括号里面是和MySQL的大致类比(记住,只是类比,没有实际意义)
其中type没法跟MySQL类比,因为MySQL中就找不到类似的东西,一个Index中可以有多个type,type就是两个很像的Mapping,里面大部分字Field都一样,只有少量的Field不一样,这个东西在Es7.0以后已经被彻底的移除掉了
这上面同样不太准确的还有一个就是Mapping,Mapping其实应该算是Index的附带品,这个东西就像是你在创建MySQL表时的那个表的属性,定义了里面的Document长什么样子,同时还有一些这个Index自己的特点
ES的分布式是将Index拆分成多个Shard(分片),让后每个Shard春芳一部分数据,同时每个shard都有一个 primary shard
,负责写入数据,但是还有几个 replica shard
。 primary shard
写入数据之后,会将数据同步到其他几个 replica shard
上去。
通过这样的方案就实现了ES的 高可用性
同时ES多节点部署会自动选举一个节点作为Master节点,Master节点负责干一些管理工作,比如维护元数据(meta),切换Primary Shard和Replica Shard身份。当Master宕机时系统会从Slave中选举一个新的作为Master,宕机节点上的primary shard的身份会转移到其对应的其他节点上的某个replica shard上(这里需要补充一个知识点:ES为了保证副本的作用,要求一个Shard的Replica Shard和Primary Shard必须不能在同一个节点上),当宕机节点恢复后会将新的PrimaryShard的数据同步过去,但这个节点将会保持ReplicaShard的身份
ES写入懂不懂啊?工作原理是什么啊?
一旦设计到这个问题,就是想让你说一下了不了解底层Lucene到底是怎么工作的,甚至是能不能说出你为什么要引入ES进入你的系统,ES和MySQL有哪些区别
读与写的过程
我们都知道,ES是对Luence的一层封装,相当于整个ES就是一个黑盒,通过接受一些Rest风格的api,然后就能操作Luence来完成一系列的操作
写过程:
- 客户端选择一个协调节点(Coordinating Node)将请求发过去
- 协调节点对Document进行路由,然后转发给具有其Primary shard的节点上
- 协调节点如果发现Primary Shard和replica Shard都操作完成,就返回成功的相应给客户端
读过程:
- 客户端选择一个协调节点将请求发出
- 协调节点进行Hash路由,找到对应的node,然后再PrimaryShard和ReplicaShard中选一个去获取document
- node将Document返回给协调节点
- 协调节点将Document返回给客户端
Lucene到底是个啥
Luence是Apache基金会旗下的一个想不,说简单点其实就是一个jar包,内涵许多建立倒排索引的算法代码
倒排索引是什么
倒排索引应该和正向索引关联记忆
所谓正向索引就是一般的数据库中的索引,将数据存到一个数据结构中,然后使用特定的算法去寻找
而倒排索引就是将这个过程反过来,先将文本内容转换成多个词(Term),然后将这些词春坊道一个字段中,在对这个字段建立索引(你可以简单的理解成他自动生成了一个中间表,这个表用来存放Term和documentId的关系,然后我们就可以通过Term->documentId->document)这一套操作