【总结笔记】深度理解 ElasticSearch
https://juejin.cn/post/6958408979235995655/
https://zhuanlan.zhihu.com/p/33671444
https://juejin.cn/post/6994789245227368479 【ES 架构原理入门篇】
https://blog.csdn.net/xingduan5153/article/details/118930951
0 什么是ElasticSearch
(1)ElasticSearch是一个 分布式的实时文档存储,每个字段可以被索引与搜索;
(2)ElasticSearch是一个 分布式实时分析搜索引擎
(3)能胜任上百个服务节点的扩展,支持PB级别的结构化或非结构化数据
Q:ElasticSearch 与 Mysql 的区别:
1)Mysql 擅长事务型类型,可以确保数据的安全和一致性。因此对安全性要求较高的写操作,使用 mysql;
2)Elasticsearch:擅长海量数据的搜索、分析、计算。对查询性能要求较高的搜索需求,使用es
1 集群、节点、索引、分片的区别(基本概念)
1.1 集群 (cluster)
一个集群就是一个或多个 ES 实例的集合,每个实例通过集群名和 ip 配置互相发现。
集群是 ES 实现分布式系统的重要操作。
1.2 节点 (node)
一个节点就是一个 ES 实例。一台机器可以有多个节点。
1.3 索引 (index)
索引可以近似看成一张数据库的表。索引包括 2 个结构 —— setting 和 mapping。setting 主要有 分片 和 分析器。分析器里的分词器是用来生成倒排索引。mapping 定了了这个索引有哪些字段,例如 id,name,sex等。
1.4 分片
ES 底层基于 Lucene(鲁森),每个节点(node)就是一个 ES 实例,每个分片就是一个 Lucene 实例。当一个索引在创建时,需要指定它的分片数量。分片分为主分片和副本分片。当存储一个文本时, ES 通过计算,存到相应的主分片上,然后同步到副本。【是不是可以理解为,同一个索引的文档并不是放在一起的?】分片存在的意义是,提高存储性能、增加集群的负载均衡。
2 es 的倒排索引
2.1 倒排索引含义
传统的检索是通过文章,逐个遍历找到对应关键词的位置。倒排索引是通过分词策略,形成了词和文章的映射关系表,这种 【词典+映射表】 即为倒排索引。使用倒排索引检索文章只需要O(1) 时间复杂度。
2.2 倒排索引原理
使用了 Term Idex 。Term Idex 底层是用 FST(Finite State Transductor)来实现的,它近似字典树。Term 字典保存的是分词。由于实际中 Term 字典词汇量会很大,通过查询 Term Idex 定位到对应的 Term 字典的位置,再由此查询document。
2.3 倒排索引高效原因
回答这个问题就是回答为什么反向搜索为什么比正向搜索高效。由于网页的数据量是上百万的,因此遍历文档判断关键词是否在此时的查询文档里非常耗开销。而中文单词词汇是很小的。所以倒排索引非常高效。
3 es 索引文档
https://juejin.cn/post/6958408979235995655/
3.1 索引的几重含义
(1)索引(名词)
一个索引类似一个数据库,存储关系型文档。
(2)索引(动词)
“索引” 一个文档就是存储一个文档到一个索引,类似 INSERT 操作。
(3)倒排索引
使用倒排索引提升数据检索速度
3.2 索引实例
megacorp是索引节点(相当于数据库)、employee 是文档(相当于 table)、1 是 文档(相当于 table 的一行数据)的ID。"firset_name" 是field(相当于一个column)
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
3.3 索引文档的方式
索引文档即文档写入 ES,包括单文档写入和批量 bulk 写入。
4 详细描述 ES 搜索的过程?
ES 搜索过程是 "query then fetch"。
4.1 query
query 阶段的目的是定位到位置,但不取。
ES 选取一个作为master (假设是节点1),即协调节点(Master)。
1)Master 会将查询节点广播到每一个数据节点,这些数据节点的分片会处理该查询请求。
2)每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给 Master;3)Master 将所有的结果进行汇总,并进行全局排序。
4.2 fetch
协调节点向这些分片发送 get 请求,并返回给客户端。
5 ES 分布式架构原理 —— 理解 ES 搜索的过程
ES 用于构建高可用和可扩展的系统。可扩展说明其节点可以扩展。 ES 通过增加节点来均摊负载,通过添加负分片来实现高可用性。ES 通过管理节点来提供高扩展和高可用。
5.1 ES 如何实现分布式 —— 添加索引及设置分片
索引是 ES 的基本单位,一个索引含有若干分片,一个分片保存该索引的部分数据【均摊负载,且当一个分片宕机时,不会导致所有数据均无法访问】,所有文档均存在分片中。
PUT /hotel_idx
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
该例子是一个节点设置 3 个分片,每个分片有 1 个副本
详细描述 ES 搜索的过程:
ES 选取一个作为master (假设是节点1),即协调节点(Master)。
1)Master 会将查询节点广播到每一个数据节点,这些数据节点的分片会处理该查询请求。
2)每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给 Master;
3)Master 将所有的结果进行汇总,并进行全局排序。
4)协调节点向这些分片发送 get 请求,并返回给客户端。
6 Lucence 内部结构是什么?
Lucence 内部结构其实就是分片的内部结构,一个分片支持创建索引,索引(插入文档的的意思)、搜索
7 ES 的应用场景
1)对于电商项目,可以使用 ES 来存储商品,来支持快速搜索 (实时文档存储与搜索)
2)对于需要对海量数据进行数据分析的项目,也可以使用 ES ,通过搜索和聚合、排序等功能挖掘自己感兴趣的信息,同时可以通过 Kibana 来实现可视化(实时分析与搜索)
8 详细描述下 ES 更新和删除文档的过程
1)ES 的删除和更新都是写操作,ES 本身的文档是不支持更改的;
2)删除文档只是在 .del 文件里标记哪些文档是需要被删除的,在查询结果中这些数据最终会被过滤掉;
3)新的文档被创建时(或者说修改文档时),ES 会为该文档指定一个版本,更新文档时就将旧版本的文档在 .del 文件中标记,查询时将该条记录过滤。
9 在并发情况下,ES 如何保证读写一致性
1)通过版本号使用乐观并发控制,以确保旧版本不会被新版本覆盖,由应用层来处理具体的冲突。
【乐观并发就是写数据库的时候假设不会发生冲突,然后在碰到冲突的时候才进行处理】
【悲观并发就是写数据库的时候假设错误始终会发生,因此,更新前要做字段值的比对工作】
2)对于写操作,只有当大部分分片可用时才运行写操作。【写是写在分片】
3)对于读操作,读是读副本。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了