目录

1、为什么要使用 Elasticsearch? (或 回答什么是ES?)

2、elasticsearch 的倒排索引是什么?

3、倒排索引的搜索过程是什么样的?

4、elasticsearch 索引数据多了怎么办,如何调优,部署

5、elasticsearch 是如何实现 master 选举的

6.详细描述一下 Elasticsearch 索引文档的过程

7、如何对Elasticsearch 进行性能优化?


1、为什么要使用 Elasticsearch? (或 回答什么是ES?)


在我们常用的业务场景中我们往往采用模糊查询进行数据的搜索,而模糊查询如果用全表扫描,在百万数据量的情况下, 查询效率是非常低下。而使用Elasticsearch ,做一个全文索引, 可以提高查询速度。 



使用一种称为 倒排索引 的结构,倒排索引会在存储数据时将关键词和数据进行关联,保存到倒排表中,然后查询时,将查询内容进行分词后在倒排表中进行查询,最后匹配数据 ,可以提高查询速度。



ES还有以下方面优势:
1. 横向可扩展性:只需要增加一台服务器,做一点儿配置,启动一下ES进程就可以并入集群;
2. 分片机制提供更好的分布性:同一个索引分成多个分片(sharding),分而治之的方式来提升处理效率;
3. 高可用:提供复制(replica)机制,一个分片可以设置多个复制,使得某台服务器宕机的情况下,集群仍旧可以照常运行,并会把由于服务器宕机丢失的复制恢复到其它可用节点上;


2、elasticsearch 的倒排索引是什么?

倒排索引是通过分词策略,形成词和文章的关系映射表,这种词典+映射表的方式就是倒排索引,有点类似于我们以前使用的新华字典。倒排索引可极大的提高查询效率。


3、倒排索引的搜索过程是什么样的?

搜索的时候先去查询词典,看看所要查询的单词在不在词典当中,如果不在的话搜索结束,如果在的话,还要看看单词在倒排列表中的指针是什么,通过倒排列表去获取它这个单词对应文档ID的列表,然后拿着文档ID去对应我们的数据

倒排索引,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程


4、elasticsearch 索引数据多了怎么办,如何调优,部署

1.在设计的时候可以基于模板+时间滚动方式创建索引,每天递增数据,避免单个索引很大的情况出现。

2.在存储的时候,冷热数据分开存储,比如最近3天的数据作为热数据,其他的作为冷数据,冷数据的话,由于不会再写入新数据了,可以考虑定期force_merge(强制合并)和shrink(压缩)的方式进行处理,节约空间和检索效率

3.由于es支持动态扩展,所以可以多加几台机器来缓解集群压力。


5、elasticsearch 是如何实现 master 选举的

前置条件:

(1)只有候选主节点(master:true)的节点才能成为主节点。

(2)最小主节点数(min_master_nodes)的目的是防止脑裂。

实现步骤

第一步:确认候选主节点数达标,就是我们在Es.yml 设置的值

第二步:比较:先判定是否具备 master 资格,具备候选主节点资格的优先返回;

若两节点都为候选主节点,则 id 小的值会主节点。注意这里的 id 为 string 类型。

补充:master 节点的职责主要包括集群、节点和索引的管理,不负责文档级

别的管理;data 节点可以关闭 http 功能。


6.详细描述一下 Elasticsearch 索引文档的过程

这里的索引文档应该理解为文档写入 ES,创建索引的过程

第一步:客户从集群某节点写入数据,发送请求。(如果没有指定路由/协调节点,

请求的节点扮演路由节点的角色。)

第二步:节点 1 接受到请求后,使用文档_id 来确定文档属于分片 0。而分片0属于节点3,请求会被转到节点 3。分片 0 的主分片也分配到节点 3 上;

第三步:节点 3 在主分片上执行写操作,成功后将请求并行转发到节点1和节点 2 的副本分片上。所有的副本分片都报告成功,节点3将向协调节点(节点 1)报告成功,节点 1 向请求客户端报告写入成功。

如果面试官再问:第二步中的文档获取分片的过程?

回答:借助路由算法获取,路由算法就是根据路由和文档 id 计算目标的分片id


7、如何对Elasticsearch 进行性能优化?

一、索引层面

  1. 增加 Refresh 时间间隔
  2. 开启慢查询日志
  3. 减少副本数量,使用 Elasticsearch 做业务搜索的时候,建议副本数目还是设置为 3 个,但是像内部 ELK 日志系统、分布式跟踪系统中,完全可以将副本数目设置为 1 个。
  4. 开启异步刷写,如果允许数据丢失,可以对特定 index 开启异步刷写:

二、服务器层面

  1. 内存设置,有必要将一半的物理内存留给lucene ; 另一半的物理内存留给ES。
  2. 集群分片设置,在创建索引时,合理配置分片数是非常重要的。
  3. Mapping建模
  4. 索引优化设置
  5. 查询优化