ES面试题系列「一」

1、Elasticsearch 是什么?它与传统数据库有什么区别?

答案:Elasticsearch 是一个基于 Lucene 的分布式、开源的搜索和分析引擎,主要用于处理大量的文本数据,提供快速的搜索和分析功能。与传统数据库相比,ES 更侧重于全文搜索和实时数据分析,数据以 JSON 格式存储,具有更好的扩展性和灵活性,而传统数据库擅长事务处理和结构化数据的存储与查询。

2、什么是倒排索引?它是如何工作的?

答案:倒排索引是 Elasticsearch 的核心数据结构。它从词出发,记载了每个词在哪些文档中出现过,由词典和倒排表组成。在构建倒排索引时,会对文档进行分词处理,将文档拆分成词条,然后建立词条与文档 ID 的映射关系。查询时,通过查找词条在倒排索引中的位置,快速定位到包含该词条的文档。

3、Elasticsearch 中的索引、文档和字段分别是什么?

答案:索引类似于关系数据库中的数据库,是具有相同结构的文档的集合;文档是 ES 中最小的存储单位,相当于关系数据库中的一条记录,以 JSON 格式存储;字段是文档中的属性,类似于关系数据库中的列,每个字段都有其数据类型。

4、如何理解 Elasticsearch 中的分片和副本?

答案:分片是为了提高 ES 的存储和查询性能,将索引分成多个部分,分布在不同的节点上。副本是每个分片的备份,用于提高可用性和容错性,当主分片出现故障时,副本可以替代主分片提供服务。合理设置分片和副本数量可以平衡系统的性能、可用性和成本。

5、Elasticsearch 是如何实现 Master 选举的?

答案:前置前提是只有候选主节点(master:true)的节点才能成为主节点,并且要满足最小主节点数(min_master_nodes)以防止脑裂。选举流程大致为:第一步,确认候选主节点数达标,即满足 elasticsearch.yml 设置的 discovery.zen.minimum_master_nodes 的值;第二步,比较节点,先判定是否具备 master 资格,具备候选主节点资格的优先返回;若两节点都为候选主节点,则 id 小的值会成为主节点,这里的 id 为 string 类型。

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

答案:第一步,客户端向集群中的某节点写入数据,发送请求,如果没有指定路由 / 协调节点,请求的节点扮演路由节点的角色;第二步,节点接收到请求后,使用文档_id 来确定文档属于哪个分片,请求会被转到对应的主分片所在节点;第三步,主分片所在节点在主分片上执行写操作,如果成功,则将请求并行转发到其他副本分片上,等待结果返回。所有的副本分片都报告成功后,主分片所在节点将向协调节点报告成功,协调节点再向请求客户端报告写入成功。

7、Elasticsearch 的查询流程是怎样的?

答案:首先,客户端发送搜索请求,请求中包含查询条件、索引名称等信息。Elasticsearch 根据搜索请求中指定的索引名称和查询条件,确定哪些分片包含符合查询条件的文档数据,然后并行地向这些分片发送搜索请求,每个分片在本地执行相应的查询操作并返回部分结果。接着,Elasticsearch 将这些部分结果汇总起来,并根据查询要求对结果进行排序,最后将搜索结果返回给客户端。

8、在 Elasticsearch 中,如何进行索引数据的调优?

答案:可以从设计阶段、写入阶段、查询阶段等方面进行调优。设计阶段,根据业务增量需求,采取基于日期模板创建索引,使用别名进行索引管理,合理设置分词器,充分考虑字段属性等;写入阶段,写入前可将副本数设置为 0,关闭 refresh_interval,写入过程中采用 bulk 批量写入,写入后恢复副本数和刷新间隔,尽量使用自动生成的 id;查询阶段,禁用 wildcard 和批量 terms,充分利用倒排索引机制,能使用 keyword 类型尽量使用 keyword,数据量大时先基于时间敲定索引再检索,设置合理的路由机制等。

9、什么是 Elasticsearch 中的 Mapping?它有什么作用?

答案:Mapping 定义了文档的结构,包括字段的数据类型、索引方式、分析器等信息。它的作用是告诉 Elasticsearch 如何解析和存储文档中的数据,以及如何对字段进行索引和搜索,确保数据能够被正确地处理和查询。

10、Elasticsearch 支持哪些数据类型?

答案:常见的数据类型有文本类型(text)、关键字类型(keyword)、日期类型(date)、数值类型(如 integer、long、float、double 等)、布尔类型(boolean),还有二进制类型(binary)、地理空间类型(geo - point、geo - shape)等。

相关推荐
专注API从业者41 分钟前
基于 Flink 的淘宝实时数据管道设计:商品详情流式处理与异构存储
大数据·前端·数据库·数据挖掘·flink
淡酒交魂2 小时前
「Flink」业务搭建方法总结
大数据·数据挖掘·数据分析
mask哥2 小时前
详解flink java基础(一)
java·大数据·微服务·flink·实时计算·领域驱动
TDengine (老段)2 小时前
TDengine IDMP 高级功能(4. 元素引用)
大数据·数据库·人工智能·物联网·数据分析·时序数据库·tdengine
DashVector3 小时前
如何通过Java SDK分组检索Doc
java·数据库·面试
Code_Artist3 小时前
[Go]结构体实现接口类型静态校验——引用类型和指针之间的关系
后端·面试·go
livemetee3 小时前
Flink2.0学习笔记:Flink服务器搭建与flink作业提交
大数据·笔记·学习·flink
程序员清风3 小时前
跳表的原理和时间复杂度,为什么还需要字典结构配合?
java·后端·面试
张元清4 小时前
电商 Feeds 流缓存策略:Temu vs 拼多多的技术选择
前端·javascript·面试
Jenny4 小时前
第九篇:卷积神经网络(CNN)与图像处理
后端·面试