1:es的组成部分:
Elasticsearch 引擎:核心组件,处理索引和搜索请求
Kibana:es的可视化的数据界面,用于分析和展示数据
Beats(可选)轻量级的日志采集器
2:基本概念
es开源的分布式搜索(分布式架构)引擎,常用于全文搜索、大数据搜索等场景
index 索引:索引是一个逻辑结构,可以看作是数据库中的表,用于存储和管理文档。每个索引都有一个名称,并且可以配置映射、分片等属性。
document 文档:文档是存储在索引中的基本单位。它是一个 JSON 格式的数据对象,可以看作是数据库中的一行记录。
Field 字段:字段是文档中的数据项,相当于数据库表中的列。每个字段都有一个名称和值
shard 分片:分片是索引的基本组成部分,每个索引都可以被分割成多个分片。每个分片是一个独立的 Lucene 索引,可以在集群中的不同节点上分布存储。
replica 副本:副本是分片的副本,用于提高数据的可靠性和查询的负载均衡(如果某主分片1出了问题,对应的副本分片1会提升为主分片,保证集群的高可用。)
mapping映射:映射定义了索引中每个字段的数据类型及其属性(定义age字段为integer类型)
type 类型(7.0之前的):在一个索引中,可以有多个类型,每个类型可以有自己的映射
3:倒排索引
倒排索引
是一种用于全文检索的索引结构;创建倒排索引是对正向索引的一种特殊处理,流程: 将每一个文档的数据利用算法分词,得到一个个词条 ,创建索引(表),每行数据包括词条、词条所在文档id、位置等信息 ;
在查询的时候:
对搜索语句进行分词----》去词条列表查询文档id----〉根据文档id查询文档---》存入结果集
根据词条搜索、模糊搜索时,速度非常快
上表中部分倒排索引表:
4:DocValues的作用
倒排索引在做聚合操作,如排序分组的时候,如果排序的数量大容易找成内存溢出和性能缓慢
DocValues 就是 es 在构建倒排索引的同时,构建了正排索引,从而实现根据指定字段进行排序和聚合的功能,排序高效,快速的聚合计算,节省内存
默认开启: Elasticsearch 默认启用 DocValues
,对于大多数字段类型(如数值、日期和关键字字段),都会使用 DocValues
。
文本字段: 对于 text
类型字段,DocValues
并不会存储其分词后的值,因为这些字段主要用于全文检索。对于 text
字段,通常会使用 DocValues
的 keyword
子字段来支持排序和聚合操作。
5:text 和 keyword类型的区别
es中两种常用的字段类型
两个的区别主要分词的区别:keyword 类型是不会分词的,直接根据字符串内容建立倒排索引,keyword类型的字段只能通过精确值搜索到;Text 类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建立倒排索引
6:停顿词过滤
停顿词可以看成是没有意义的词,比如“的”、“而”,这类词没有必要建立索引
7:query 和 filter
1)query: 查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;
(2)filter: 查询操作仅判断是否满足查询条件,不会计算任何分值,也不会关心返回的排序问题,同时,filter 查询的结果可以被缓存,提高性能。
8:ES 写数据的过程
客户端发起写请求
集群路由请求到合适的主分片(Primary Shard)
主分片执行写操作,生成倒排索引,并写入内存缓冲区和事务日志
主分片将数据同步到所有副本分片(Replica Shard)
客户端收到写操作的确认响应
后台进程定期将内存缓冲区数据刷入磁盘,事务日志清空
9:ES的更新和删除流程
因为es的数据是不可变的,这意味着在更新或删除数据时,并不会直接修改或删除原来的文档,而是使用“标记删除”和“追加更新”的方式来实现
(1)如果是删除操作,文档其实并没有真的被删除,而是在 .del 文件中被标记为 deleted 状态。该文档依然能匹配查询,但是会在结果中被过滤掉。
(2)如果是更新操作,就是将旧的document标识为 deleted 状态,然后创建一个新的 doc。
数据的写入 每 refresh 一次,就会产生一个 segment 文件 ,所以默认情况下是 1s 生成一个 segment 文件,然后定期执行 merge。
每次 merge 的时候,会将多个 segment 文件合并成一个,同时这里会将标识为 deleted 的 doc 给物理删除掉,然后将新的 segment 文件写入磁盘
10:ES的搜索流程
搜索过程被分为两个阶段:
1:查询阶段(Query)
查询请求分发到分片
每个分片执行查询:每个分片会在其本地执行查询,利用倒排索引查找符合条件的文档,并为每个匹配的文档计算相关性评分
返回最相关的文档 ID 和评分
主要是为了找到哪些文档符合查询条件,并计算每个文档的相关性评分,但不涉及文档的具体内容。
2:获取阶段(Fetch)
协调节点汇总查询结果
请求文档内容
返回最终结果
获取在 Query Phase 中确定的文档的实际内容,协调节点负责从各个分片中提取这些文档的具体数据。最终结果会按相关性排序,并返回给客户端。
11:ES在高并发下保证读写一致性
1)对于更新操作
通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖
每个文档都有一个_version 版本号,这个版本号在文档被改变时加一。Elasticsearch使用这个 _version 保证所有修改都被正确排序。当一个旧版本出现在新版本之后,它会被简单的忽略。
利用_version的这一优点确保数据不会因为修改冲突而丢失。比如指定文档的version来做更改。如果那个版本号不是现在的,请求就失败了。
2)对于写操作
一致性级别支持 quorum/one/all,默认为 quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。
one: 要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行
all: 要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作
quorum: 默认的值,要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作
3)对于读操作
可以设置 replication (将数据从主分片复制到副本分片的过程)为 sync(默认同步),这使得操作在主分片和副本分片都完成后才会返回;如果设置replication 为 async(异步) 时,也可以通过设置搜索请求参数_preference 为 primary 来查询主分片,确保文档是最新版本。
12:es分布式原理
Elasticsearch 会对存储的数据进行切分,将数据划分到不同的分片上,同时每一个分片会保存多个副本,主要是为了保证分布式环境的高可用。在 Elasticsearch 中,节点是对等的,节点间会选取集群的 Master,由 Master 负责集群状态信息的改变,并同步给其他节点。
13:es写入性能会不会很低
只有建立索引和类型需要经过 Master,数据的写入有一个简单的 Routing 规则,可以路由到集群中的任意节点,所以数据写入压力是分散在整个集群的。
14:es 如何选举 Master
Elasticsearch 通过 Zen Discovery 机制选举 Master 节点,选举过程依赖于候选节点之间的相互发现和投票,确保集群有一个唯一的主节点来管理集群的状态。在集群中,minimum_master_nodes设置是防止脑裂的关键,确保只有获得多数支持的节点才能成为 Master。
15:es是如何避免脑裂现象
discovery.zen.minimum_master_nodes
:这是防止脑裂的关键参数。脑裂现象可能导致不同的节点组分别选出自己的 Master 节点,从而导致数据不一致。通过设置 minimum_master_nodes
,可以确保只有足够多的 Master 候选节点才可以参与选举。
16:ES的深度分页与滚动搜索scroll
深度分页其实就是搜索的深浅度,搜索得太深,就会造成性能问题,会耗费内存和占用cpu(第1页,第2页,第10页,第20页,是比较浅的;第10000页,第20000页就是很深了)
我们应该避免深度分页操作(限制分页页数),比如最多只能提供100页的展示,从第101页开始就没了,毕竟用户也不会搜的那么深。
滚动搜索:在查大量数据的时候会影响性能,这个时候可以使用滚动搜索,也就是 scroll;滚动搜索可以先查询出一些数据,然后再紧接着依次往下查询。
在第一次查询的时候会有一个滚动id,相当于一个锚标记 ,随后再次滚动搜索会需要上一次搜索滚动id,根据这个进行下一次的搜索请求。每次搜索都是基于一个历史的数据快照,查询数据的期间,如果有数据变更,那么和搜索是没有关系的。
17:列出与 es有关的主要可用字段数据类型
text
: 用于全文搜索的字符串。它被分析为词条或令牌,以便进行搜索和聚合操作。keyword
: 用于精确值匹配的字符串,不会被分析。通常用于过滤、排序和聚合操作。date
: 用于日期和时间的字段,可以指定不同的格式。boolean
: 用于存储布尔值(true 或 false)。integer
和long
: 用于存储整数。float
和double
: 用于存储浮点数。
18:es的 NRT
NRT(Near Real-Time, 近实时)
指 Elasticsearch 在索引数据和查询数据之间的延迟非常短,但不是完全实时的。这种近实时性意味着,当数据被写入 Elasticsearch 后,可能需要几秒钟才能在搜索结果中查询到,在性能与实时性之间的平衡
Elasticsearch 的 NRT 特性依赖于底层的 Lucene 引擎。Lucene 的写入操作和搜索操作是分离的
文档写入缓冲区,刷新操作:Elasticsearch 默认每隔 1 秒会进行一次自动刷新操作,将内存缓冲区中的数据刷新到一个新的 segment(段) 中,并将其写入磁盘。
优点:
高效的写入性能:通过先将数据缓存在内存中,Elasticsearch 可以非常高效地进行批量写入操作。
查询的快速响应:即使是近实时的模式,Elasticsearch 的数据可见性延迟很短,通常在 1 秒以内,对于大多数应用场景来说已经足够实时。
缺点
数据延迟:虽然是“近实时”,但并非完全实时。写入的数据在刷新的间隔期内是不可见的。
增加的系统开销:频繁的刷新操作会增加 I/O 开销,因为每次刷新都会生成新的段文件并需要进行磁盘写操作。
19:精准匹配检索和全文检索
精确匹配用于:是否完全一致(生份证之类的)
全文检索用于:是否相关?
es支持精确匹配和全文检索匹配
20:es 中的相关性和得分
搜索apple:水果,苹果公司
ES 会将相关的内容都返回给你,只是:计算得出的评分高的排在前面,评分低的排在后面。