ElasticSearch搜索引擎常见面试题

【精选】ElasticSearch搜索引擎常见面试题总结_es搜索引擎面试题_张维鹏的博客-CSDN博客原文链接:https://blog.csdn.net/a745233700/article/details/115585342【精选】ElasticSearch搜索引擎常见面试题总结_es搜索引擎面试题_张维鹏的博客-CSDN博客


1、什么是Elasticsearch

        Elasticsearch 是 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。

全文检索是指对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当查询时,根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

2、Elasticsearch 的基本概念

(1)index 索引:索引类似于mysql 中的数据库,Elasticesearch 中的索引是存在数据的地方,包含了一堆有相似结构的文档数据。

(2)type 类型:类型是用来定义数据结构,可以认为是 mysql 中的一张表,type 是 index 中的一个逻辑数据分类

(3)document 文档:类似于 MySQL 中的一行,不同之处在于 ES 中的每个文档可以有不同的字段,但是对于通用字段应该具有相同的数据类型,文档是es中的最小数据单元,可以认为一个文档就是一条记录。

(4)Field 字段:Field是Elasticsearch的最小单位,一个document里面有多个field

(5)shard 分片:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。

(6)replica 副本:任何服务器随时可能故障或宕机,此时 shard 可能会丢失,通过创建 replica 副本,可以在 shard 故障时提供备用服务,保证数据不丢失,另外 replica 还可以提升搜索操作的吞吐量。

shard 分片数量在建立索引时设置,设置后不能修改,默认5个;replica 副本数量默认1个,可随时修改数量;

3、什么是倒排索引

 在搜索引擎中,每个文档都有对应的文档 ID,文档内容可以表示为一系列关键词的集合,通过倒排索引,可以记录每个关键词在文档中出现的次数和出现位置。也就是说,倒排索引是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了该关键词。

要注意倒排索引的两个细节:

倒排索引中的所有词项对应一个或多个文档
倒排索引中的词项 根据字典顺序升序排列


4、doc_values 的作用

        doc_values 就是 es 在构建倒排索引的同时,会对开启 doc_values 的字段构建一个有序的 “document文档 ==> field value” 的列式存储映射,可以看作是以文档维度,实现了根据指定字段进行排序和聚合的功能。

5、text 和 keyword类型的区别

        两个类型的区别主要是分词:keyword 类型是不会分词的,直接根据字符串内容建立倒排索引,所以keyword类型的字段只能通过精确值搜索到;Text 类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建立倒排索引

6、query 和 filter 的区别?

(1)query:查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;

(2)filter:查询操作仅判断是否满足查询条件,不会计算任何分值,也不会关心返回的排序问题,同时,filter 查询的结果可以被缓存,提高性能。


7、ES写数据的整体流程:

(1)客户端选择 ES 的某个 node 发送请求过去,这个 node 就是协调节点 coordinating node
(2)coordinating node 对 document 进行路由,将请求转发给对应的 node(有 primary shard)
(3)实际的 node 上的 primary shard 处理请求,然后将数据同步到 replica node 
(4)coordinating node 等到 primary node 和所有 replica node 都执行成功之后,最后返回响应结果给客户端。

8、ES的更新和删除流程


        删除和更新都是写操作,但是由于 Elasticsearch 中的文档是不可变的,因此不能被删除或者改动以展示其变更;所以 ES 利用 .del 文件 标记文档是否被删除,磁盘上的每个段都有一个相应的.del 文件

(1)如果是删除操作,文档其实并没有真的被删除,而是在 .del 文件中被标记为 deleted 状态。该文档依然能匹配查询,但是会在结果中被过滤掉。

(2)如果是更新操作,就是将旧的 doc 标识为 deleted 状态,然后创建一个新的 doc。

 

9、ES的搜索流程:


搜索被执行成一个两阶段过程,即 Query Then Fetch:

1、Query阶段:

        客户端发送请求到 coordinate node,协调节点将搜索请求广播到所有的 primary shard 或 replica,每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。接着每个分片返回各自优先队列中 所有 docId 和 打分值 给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。

2、Fetch阶段:

        协调节点根据 Query阶段产生的结果,去各个节点上查询 docId 实际的 document 内容,最后由协调节点返回结果给客户端。

五、ES在高并发下如何保证读写一致性?
(1)对于更新操作:可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖

每个文档都有一个_version 版本号,这个版本号在文档被改变时加一。Elasticsearch使用这个 _version 保证所有修改都被正确排序,当一个旧版本出现在新版本之后,它会被简单的忽略。

利用_version的这一优点确保数据不会因为修改冲突而丢失,比如指定文档的version来做更改,如果那个版本号不是现在的,我们的请求就失败了。

(2)对于写操作,一致性级别支持 quorum/one/all,默认为 quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,副本将会在一个不同的节点上重建。

one:写操作只要有一个primary shard是active活跃可用的,就可以执行
all:写操作必须所有的primary shard和replica shard都是活跃可用的,才可以执行
quorum:默认值,要求ES中大部分的shard是活跃可用的,才可以执行写操作
(3)对于读操作,可以设置 replication 为 sync(默认),这使得操作在主分片和副本分片都完成后才会返回;如果设置replication 为 async 时,也可以通过设置搜索请求参数 _preference 为 primary 来查询主分片,确保文档是最新版本。


10、Elasticsearch 的分布式原理:

        Elasticsearch 会对存储的数据进行切分,划分到不同的分片上,同时每一个分片会生成多个副本,从而保证分布式环境的高可用。ES集群中的节点是对等的,节点间会选出集群的 Master,由 Master 会负责维护集群状态信息,并同步给其他节点。

11、ES集群 如何 选举 Master:

        Elasticsearch 的选主是 ZenDiscovery 模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和 Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分;

(1)确认候选主节点的最少投票通过数量(elasticsearch.yml 设置的值 discovery.zen.minimum_master_nodes)
(2)选举时,集群中每个节点对所有 master候选节点(node.master: true)根据 nodeId 进行字典排序,然后选出第一个节点(第0位),暂且认为它是master节点。
(3)如果对某个节点的投票数达到阈值,并且该节点自己也选举自己,那这个节点就是master;否则重新选举一直到满足上述条件。
补充:master节点的职责主要包括集群、节点和索引的管理,不负责文档级别的管理;data节点可以关闭http功能。

12、Elasticsearch是如何避免脑裂现象:

(1)当集群中 master 候选节点数量不小于3个时(node.master: true),可以通过设置最少投票通过数量(discovery.zen.minimum_master_nodes),设置超过所有候选节点一半以上来解决脑裂问题,即设置为 (N/2)+1;

(2)当集群 master 候选节点 只有两个时,这种情况是不合理的,最好把另外一个node.master改成false。如果我们不改节点设置,还是套上面的(N/2)+1公式,此时discovery.zen.minimum_master_nodes应该设置为2。这就出现一个问题,两个master备选节点,只要有一个挂,就选不出master了

13、建立索引阶段性能提升方法:


(1)如果是大批量导入,可以设置 index.number_of_replicas: 0 关闭副本,等数据导入完成之后再开启副本
(2)使用批量请求并调整其大小:每次批量数据 5–15 MB 大是个不错的起始点。
(3)如果搜索结果不需要近实时性,可以把每个索引的 index.refresh_interval 改到30s
(4)增加 index.translog.flush_threshold_size 设置,从默认的 512 MB 到更大一些的值,比如 1 GB
(5)使用 SSD 存储介质
(6)段和合并:Elasticsearch 默认值是 20 MB/s。但如果用的是 SSD,可以考虑提高到 100–200 MB/s。如果你在做批量导入,完全不在意搜索,你可以彻底关掉合并限流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是ElasticsearchElasticsearch是一个开源的分布式搜索和分析引擎,它可以快速地存储、搜索和分析大量的数据。 2. Elasticsearch的主要特点是什么? Elasticsearch的主要特点包括:分布式、高可用、实时搜索、全文搜索、多种查询方式、支持多种数据类型、可扩展性强等。 3. Elasticsearch的数据结构是什么? Elasticsearch的数据结构是基于文档的,每个文档都是一个JSON格式的数据对象,可以包含任意数量的字段。 4. Elasticsearch的索引是什么? Elasticsearch的索引是一个包含多个文档的数据集合,每个文档都有一个唯一的ID,可以通过ID来访问文档。 5. Elasticsearch的查询方式有哪些? Elasticsearch的查询方式包括:全文搜索、精确匹配、模糊匹配、范围查询、布尔查询、聚合查询等。 6. Elasticsearch的分布式架构是怎样的? Elasticsearch的分布式架构是基于节点的,每个节点都可以存储数据和执行查询,节点之间可以相互通信和协调工作,从而实现数据的分布式存储和查询。 7. Elasticsearch的数据分片是什么? Elasticsearch的数据分片是将一个索引分成多个部分,每个部分称为一个分片,每个分片可以存储一部分数据,从而实现数据的分布式存储和查询。 8. Elasticsearch的数据备份是怎样的? Elasticsearch的数据备份是通过副本实现的,每个分片可以有多个副本,副本可以分布在不同的节点上,从而实现数据的高可用和容错。 9. Elasticsearch的性能优化有哪些? Elasticsearch的性能优化包括:合理设置分片和副本、使用合适的查询方式、优化索引结构、使用缓存等。 10. Elasticsearch的安全性如何保障? Elasticsearch的安全性可以通过设置访问控制、加密通信、使用SSL证书等方式来保障。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值