ES面试问题和入门资料
开屏暴击:
1. 什么是全文检索?什么是ES?
Before: 之前用什么? 数据量少的时候用mysql的like %小张%
表越来越大,内容越来越多。 分库分表。
- 增加了运维工作,数据迁移问题
- 对于大数据的搜索,仍然存在效率问题,很慢
Then: 出现了 Lucene,全文检索工具。但是lucene对外暴露出的可用接口对于开发人员来说,操作是非常的复杂,而且没有效率的;于是在lucene的基础上进一步的封装
End: Es框架出现了,同样是以lucene为基础,并且吸收了前两代的教训而开发出的分布式多用户能力的全文搜索引擎
- 提供restful web接口,操作方便
- 集群部署,易于处理
- 支持PB级别数据,接近实时搜索能力,自动发现节点 副本机制保障可用性
2. ES核心概念介绍
index:索引, 3中意思
- 名词,类似于mysql的database。 一个索引就是一个拥有几分相似特征的文档的集合。
- 动词,保存一个文档到索引中的过程, 类似 insert 语句
- 倒排索引, mysql中使用 b+树索引到指定的列上,提升查询速度。 es使用倒排索引 来达到目的
type: 类似于 table。 从6.0.0版本后 一个index只能有一个type
document: index里面的一条记录称为 文档, 类似mysql中的行
field
mapping
cluster: 集群
节点node: 5中节点类型
分片shard和副本replicas
3. ES基本操作
索引的增、删
文档的 增、 删、 改、 查
4. 索引操作时候的分片交互过程
参考: https://blog.youkuaiyun.com/ZGL_cyy/article/details/120804713
5. es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
写入过程:
-
客户端请求发给一个node,
coordinating node
(协调节点) -
协调节点对document计算路由, 转发给 data-node(有primary-shard)
-
primary处理完成后,同步给 replica node
-
所有节点都处理完成后,返回success
读数据过程:
可以通过
doc id
来查询,会根据doc id
进行 hash,判断出来当时把doc id
分配到了哪个 shard 上面去,从那个 shard 去查询。
- 客户端发送请求到任意 一个 node,成为
coordinate node
。 coordinate node
对doc id
进行哈希路由,将请求转发到对应的 node,此时会使用round-robin
随机轮询算法 ,在primary shard
以及其所有 replica 中随机选择一个,让读请求负载均衡。- 接收请求的 node 返回 document 给
coordinate node
。 coordinate node
返回 document 给客户端。
搜索数据过程:
es 最强大的是做全文检索,根据关键词搜索
- 客户端发送请求到一个
coordinate node
。 - 协调节点将搜索请求转发到所有 的 shard 对应的
primary shard
或replica shard
,都可以。 - query phase:每个 shard 将自己的搜索结果(其实就是一些
doc id
)返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。 - fetch phase:接着由协调节点根据
doc id
去各个节点上拉取实际 的document
数据,最终返回给客户端。
https://cloud.tencent.com/de