干货 | 2024 年 Elasticsearch 常见面试题集锦

当涉及到 Elasticsearch 开发者的面试时,问题通常会更专注于软件开发生命周期内与 Elasticsearch 集成的具体技术细节和实际应用场景。

以下是一些Elasticsearch开发相关的面试题目,题目来自死磕 Elasticsearch 知识星球。

1、Elasticsearch数据建模相关问题

问题描述

Q1:描述如何设计 Elasticsearch 索引以支持高效的全文搜索和聚合操作。

Q2:在数据建模过程中,你如何决定使用嵌套类型还是平面结构?

A1:

  • 倒排索引以支持全文检索;

  • 正排索引以支持聚合操作。

A2:关于嵌套结构、平面结构——实践表明:

如果能平面宽表存储,咱们就宽表,空间换时间的方式是非常有效的数据建模方式;

除非特殊情况,当子文档更新不频繁的场景,推荐使用 Nested 类型;

子文档更新频繁的场景,推荐使用:Join 类型。

2、Elasticsearch 查询和分析相关问题

描述你如何优化复杂的 Elasticsearch 查询,以提高性能。

如果需要对大数据集进行实时分析,你会采取哪些策略?

回答如下:

(1)硬件资源层面,要给到位。

能 SSD 磁盘的,咱们优先SSD磁盘。这样,写入、检索性能均比普通磁盘要好。

能内存高配的尽量高配,多高呢?推荐64GB,且堆内存设置32GB之内;如果更高配置,有待商榷和验证性能。

CPU核数决定并发支持力度,这个和“线程池队列调优”有关系,也不能太低。

尤其云服务器场景,受限于硬件资源的分配,别太低。云服务器也要考虑网络带宽,不能太低。

否则,即便所谓各种检索技巧,也无处可施。比如:买个1核1GB的云服务器学生机,神仙也帮不了优化。

(2)数据建模层面,做足文章。

不推荐上来就直接优化DSL,因为某些情况,优化空间非常少。

  • 多考虑:字段层面是否最优化设置了?字段类型是否设置合理?

  • 多考虑:有没有字段借助预处理 ingest pipeline再继续拆分会更好?

  • 多考虑:所谓的多表关联,能不能不关联的宽表空间换时间实现呢?

(3)复杂检索考虑优化点

那些耗费性能的检索,有没有替代方案?

比如:wildcard 能否通过 ngram 分词修改检索方式?能不用,咱们尽量不用。

如果能用 filter 过滤提升缓存性能的,咱们是否用了?

“profile:true”,看看哪个环节出问题了,咱们有针对性的进行优化。

(4)其他因素

检索的时候,是否有大量的写入操作?看有没有优化空间。

是否采取必要的段合并的策略,以优化检索。

其他业务场景细节有针对的调优。

3、Elasticsearch 集成与开发问题

你如何在现有的 Web 应用程序中集成 Elasticsearch?

解释在微服务架构中如何利用 Elasticsearch 来提供搜索服务。

回答:

基本上说一下自己 Java 或者 Python层面集成  Elasticsearch 实践就可以。

咱们怎么做的,就怎么说就可以。

比如:使用的 Java 官方客户端 Java-api(8.x),还是早期的 HighLevelREST API, 更早起的 LowLevelREST API 等。或者使用的 SpringBoot 相关的 API。

干货 | Elasticsearch Java 客户端演进历史和选型指南

或者Python 框架下的 elasticsearch.py、elasticsearch-DSL等。

4、Elasticsearch DSL 相关应用选型等问题

Q1:你对 Elasticsearch Query DSL 有多熟悉?请给出一个你认为高效的查询例子。

Q2:使用 Elasticsearch DSL 编写一个可以处理模糊搜索和自动完成功能的查询。

回答:

这是两个大类问题。

A1——问题1:你对 Elasticsearch Query DSL有多熟悉?请给出一个你认为高效的查询例子。 

回答:其实就说出 DSL 分类就可以:精确匹配查询(term、exists等)、全文检索(match、match_phrase 等)、Bool 组合检索(must、must_not、filter、should)等。

高效查询比如:基于 filter 的过滤缓存检索,性能比普通没有 filter 好很多,因为有效使用了缓存。

A2——问题2:编写一个可以处理模糊搜索和自动完成功能的查询。

回答:与面试官交流一下这里模糊查询的含义,比如:match_phrase  和 slop 结合可以实现,比如:wildcard 可以实现,但有性能问题,比如:regex 正则检索可以实现,也有性能问题。

自动完成功能,需要沟通是不是自动补全功能,这点 ES 支持 auto complete 类似的 API——completion-suggester。

Elasticsearch 8.X 有哪些自动补全的检索方式?

补充参见:

[1] https://www.elastic.co/guide/en/elasticsearch/reference/8.12/search-suggesters.html#completion-suggester

[2]https://docs.elastic.co/search-ui/solutions/ecommerce/autocomplete 

[3]https://taranjeet.medium.com/elasticsearch-building-autocomplete-functionality-494fcf81a7cf 

[4]https://opster.com/guides/elasticsearch/how-tos/elasticsearch-auto-complete-guide/ 

[5]https://taranjeet.medium.com/elasticsearch-using-completion-suggester-to-build-autocomplete-e9c120cf6d87

5、Elasticsearch 索引数据同步相关问题

Q1:描述如何保证数据库和 Elasticsearch 索引间的数据同步。

Q2:你是如何处理批量索引和更新大量文档的?

回答:

这也是两个问题。

对于问题1:保证同步——我用 logstash 多,主要基于时间戳和自增id实现同步。

这两种机制单纯自己实现方式都能有效保障同步。

如果出现同步异常,也可以通过两侧(源头、目的端)通过ID比对的方式进行排查和核实。

对于问题2:

批量索引——就是基于 bulk API 批量导入或者写入数据。

这里要注意的点就是:bulk 值不适宜上来调整的非常大,比如:上来就10万、100万等。

而是根据线程池和队列:逐步调大进行性能测试,不如:5000、10000、20000这种,直到找到性能接近瓶颈且合适的值即可。

更新大量文档——非必要不使用更新操作。

6、Elasticsearch 性能调优和索引维护相关问题

  • 在开发过程中,你会如何处理 Elasticsearch 的索引碎片化?

  • 有没有经验进行索引的映射迁移或重建?

回答:

第一个问题:索引碎片化不是专有词汇,ES 官方文档并没有这种称呼。

需要和面试官核实,多大是碎片?

这里,咱们推荐两个维度考虑这个问题。

  • 维度1:架构层面,单分片的最大值尽量控制在 30 GB- 50GB,过大了不便于维护,过小了性能会有影响。

  • 维度2:不定期在非业务密集区域实现段合并,以保证性能优化。

第二个问题:有没有经验进行索引的映射迁移或重建?

看数据量大小:

  • 如果数据量不大,直接 reindex 数据迁移;

  • 如果数据量适中,使用 reindex + slice 的方式迁移;

  • 如果数据过大,推荐 elasticdump(适合跨集群同步),索引快照和恢复的方式保障数据迁移的高可用性。

  • 如果跨集群,其实也可以使用:reindex, 但是要配置白名单。

  • 如果版本兼容,快照和恢复机制也是推荐的!

7、Elasticsearch 错误处理和日志相关问题

Q1:如何处理 Elasticsearch 相关的异常和错误?

Q2:在你的开发工作中,你是如何进行日志记录和监控 Elasticsearch 行为的?

回答:

这个问题也非常大。

一般几个维度考量:

第一,不定期查看日志或者出了问题第一时间查看日志,普通日志会记录集群故障。比如:wildcard 出错,出问题日志能看到。

第二,必要时候,开启慢日志查询。比如:想知道哪个IP地址近期操作频繁,想知道近期哪个聚合比较拉胯。

第三,日志可视化,ELKB实现,日志通过logstash 同步到 Elasticsearch,并借助 Kibana 进行数据的可视化。

以上维度,保障集群问题及时发现也便于我们提前发现问题并解决问题。

8、Elasticsearch API使用和最佳实践相关问题

Q1:描述你使用Elasticsearch REST API时的一些最佳实践。

Q2:如何使用 Elasticsearch 的聚合 API来提取关键业务指标?

REST API 举例:

  • 能用 filter 的咱们就走缓存过滤。

  • 将核心 API 脚本实现,监控内存使用率,磁盘使用率、CPU使用率,一旦出问题及时邮件预警。

聚合API:这个没有问题,聚合核心就三个维度:

  • Metric 指标聚合;

  • bucket 分桶聚合;

  • pipeline 基于聚合的子聚合。

三种方式都可以,需要结合业务灵活使用聚合方式。

9、Elasticsearch 安全性和权限控制相关问题

  • Q1:描述在应用程序中实现 Elasticsearch 安全性的策略。

  • Q2:你是如何在 Elasticsearch 中管理细粒度的访问控制?

回答:

描述在应用程序中实现 Elasticsearch 安全性的策略?——针对这个问题,

我这边一般是 8.X 高版本,已经自带强调 SSL 证书访问,Kibana 也是安全配置的。

这样之后,Http访问就变成了 Https 访问。

那么在 Python 和 Java 客户端的程序访问也是需要把 Elasticsearch 配置的证书拷贝到给定的工程路径下的。

A2:你是如何在Elasticsearch中管理细粒度的访问控制?——针对这个问题,ES 是能支持到字段级别,不过是收费功能。实际项目中我们使用的开源版本,并未使用这功能。

10、Elasticsearch 容错性和高可用性:

Q1:你如何确保你开发的Elasticsearch应用具备高容错性?

Q2:当 Elasticsearch 集群不可用时,你的应用程序如何处理?

回答:

A:高容错性?——这个词我的理解是高可用性。需要表达清楚后,咱们和面试官进行核对,确保理解题目是正确的。

如果是,高可用性的策略可以安排如下:

第一:副本策略,多节点集群至少一个副本,确保某个节点宕机后,副本提升为主分片,确保集群的高可用性。

但是,实践验证过,副本不是越多越好,副本越多,意味着牺牲的存储空间越大,一般数据量大的集群扛不住那么多的冗余存储。一般至少一个即可(个人理解的经验值)。除非极其高可用要求的场景,可以超过1个副本,其他不建议。

第二:集群的不定时快照和恢复策略,确保集群万一故障能恢复到某一个时刻的可用状态。

高版本支持 SLM 快照生命周期管理功能,这一切的自动化和定时机制变得更加方便和快捷。

11、Elasticsearch 监控和警报机制

Q1:在开发过程中,你如何利用监控工具如 Elasticsearch 的 X-Pack 或其他插件来观察集群的健康状况?

Q2:你如何设置和处理与 Elasticsearch 相关的警报?

回答:

A1:x-pack 插件高版本 7.X 版本已经集成,不再需要二次安装。

我一般借助 kibana 的可视化,使用 Metricbeat 收集指标数据,同步到 Elasticsearch ,借助kibana 进行集群数据监控的可视化。

A2:你如何设置和处理与 Elasticsearch 相关的警报?——警报部分是收费功能,成本原因没有用。

不过第三方的 yelp 公司的开源 elasticalert 插件可以用和集成,不确认最新版本是否支持,早期版本用过。

https://github.com/jertel/elastalert2

还有,自己开发了必要的 python+shell 脚本,监控集群的健康状态,确保集群出现:cpu、磁盘、内存警戒线一到(自己定义的),就能第一时间收到预警邮件信息。


这些问题旨在评估候选人的技术能力、解决问题的方法以及对Elasticsearch 开发生命周期的理解。通过这样的问题,面试官可以了解候选人在 Elasticsearch 项目的规划、实施和维护方面的深度和广度。

欢迎大家一起完善补充!

908a2643e33ff0680edab0fce7f8e8dc.jpeg

7年积累,只为你少走不必要弯路!

7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/483674.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL系列】Public Key Retrieval is not allowed

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

人事管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW调试部署环境,文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java…

【科学计算与数学建模】logistic回归预测二分类

任务描述相关知识 数据集以及任务介绍 任务数据集数据属性信息提供的特征属性格式提交的数据格式实现方法—Logistic Regression 加载数据数据标准化逻辑回归模型验证集的使用(Validation set)训练过程画图函数测试数据的使用预测二分类编程要求测试说明…

ConcurrentHashMap源码分析

文章目录 ConcurrentHashMap源码分析jdk1.7版本重要成员变量put方法源码分析 jdk1.8版本重要成员变量put方法源码分析 ConcurrentHashMap源码分析 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的。为了保证数据的安全性我们可以使用Hashtable&a…

【LLM】LongRoPE:LLM上下文窗口扩展方法及非官方实现

前言 目前,大多数LLMs的上下文窗口限制在4k个标记左右,这意味着模型在处理超过这个长度的文本时性能会下降。这种限制对于需要大量上下文信息的场景,虽然可以通过在更长的文本上进行微调来将预训练LLM的上下文窗口扩展上下文窗口&#xff0c…

【鸿蒙系统】 ---OpenHarmony加快本地编译(二)

💌 所属专栏:【鸿蒙系统】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢…

SpringBoot3集成PostgreSQL

标签:PostgreSQL.Druid.Mybatis.Plus; 一、简介 PostgreSQL是一个功能强大的开源数据库系统,具有可靠性、稳定性、数据一致性等特点,且可以运行在所有主流操作系统上,包括Linux、Unix、Windows等。 通过官方文档可以…

MySQL:表的操作

文章目录 创建表查看表结构修改表删除表 前面对于库的操作有了认识后,下面进行表的操作 创建表 以下图为例 创建表其实和定义结构体有点类似,总的来说就是先定义列名,然后后面跟着是列的数据类型,之后在定义结束后可以带上对应的…

校园圈子系统--自带校园跑腿功能,校园交友,校园陪玩,校园交友墙,地图找伴,二手市场等功能。源码交付,支持二开!APP小程序H5等移动端都有。

一、需求分析 在搭建校园论坛平台之前,我们需要进行详细的需求分析。这包括以下几个方面: 1.用户需求 我们需要了解目标用户群体的需求和喜好,包括学生的年龄层次、兴趣爱好、关注话题等。通过调查问卷、访谈等方式收集用户需求,为…

数学算法(算法竞赛、蓝桥杯)--最大公约数,欧几里得算法

1、B站视频链接&#xff1a;G05 最大公约数 欧几里得算法_哔哩哔哩_bilibili 题目链接&#xff1a;[NOIP2001 普及组] 最大公约数和最小公倍数问题 - 洛谷 #include <bits/stdc.h> using namespace std; typedef long long LL; LL x,y,ans;LL gcd(LL a,LL b){return b0?…

包叔推荐12代i3-独显组装电脑主机配置清单

去年Intel第十代i5-依然是主流热选机型。 今年&#xff0c;随着i3-的价格优势越来越大&#xff0c;已经成功取代了i5-。 今天包叔推荐几套12代i3-独立显卡组装电脑主机配置。 列表&#xff1a;一组核心显示配置&#xff0c;其余三组均为独立显示配置。 适合主机预算在2000元至3…

JDK下载配置

一、JDK的作用 Java开发环境&#xff1a;JDK提供了完整的Java开发环境&#xff0c;包含编译器&#xff08;javac&#xff09;、解释器&#xff08;java&#xff09;、打包工具&#xff08;jar&#xff09;、文档生成工具&#xff08;javadoc&#xff09;等一系列工具&#xff0…

【高并发服务器 01】—— 基础知识回顾

接下来四周时间&#xff0c;我将会做一个高并发服务器相关的项目。 前置知识&#xff1a;操作系统系统编程、网络编程、基础的数据结构、C语言。 开发环境&#xff1a;VMware虚拟机&#xff1a;Ubuntu 20.04.6 LTS、vscode 今天先回顾一些基础知识。 1.文件与IO 标准IO&#…

软件测试教程 性能测试概论

文章目录 1. 性能测试实施的流程1.1 常见的性能问题1.2 性能测试是什么&#xff1f;1.3 性能测试和功能测试之间的区别1.4 什么样的系统/软件表现属于性能好&#xff0c;什么样的软件性能表现属于性能不好1.5 为什么要进行性能测试1.6 性能测试实施的流程1.7 常见的性能指标以及…

Python虚拟环境conda的安装使用

文章目录 conda虚拟环境的详细步骤和注意事项&#xff1a;**安装Conda****创建Conda虚拟环境****激活Conda虚拟环境****安装Python包****管理Conda环境****其他优势与特性** 相较于venv&#xff0c;使用conda管理虚拟环境有以下优势&#xff1a;**性能****资源占用****其他性能…

【jvm】jinfo使用

jinfo介绍 jinfo 是一个命令行工具&#xff0c;用于查看和修改 Java 虚拟机&#xff08;JVM&#xff09;的配置参数。它通常用于调试和性能调优。 使用 jinfo 命令&#xff0c;你可以查看当前 JVM 的配置参数&#xff0c;包括堆大小、线程数、垃圾回收器类型等。此外&#xf…

立体统计图表绘制方法(分离式环图)

立体统计图表绘制方法&#xff08;分离式环形图&#xff09; 记得我学统计学的时候&#xff0c;那些统计图表大都是平面的框框图&#xff0c;很呆板&#xff0c;就只是表现出统计的意义就好了。在网络科技发展进步的当下&#xff0c;原来一些传统的统计图表都有了进一步的创新。…

unity 多屏幕操作

想了解基础操作请移步&#xff1a;&#xff08;重点是大佬写的好&#xff0c;这里就不再赘述&#xff09; Unity 基础 之 使用 Display 简单的实现 多屏幕显示的效果_unity display-CSDN博客 在panel上也可以通过获取 Canvas&#xff0c;来达到切换多屏幕的操作&#xff0c; …

数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)

和我一起学编程呀&#xff0c;大家一起努力&#xff01; 这篇文章耗时比较久&#xff0c;所以大家多多支持啦 链表的结构及结构 概念&#xff1a;链表是⼀种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 理解&a…

在MongoDB建模1对N关系的基本方法

“我在 SQL 和规范化数据库方面拥有丰富的经验&#xff0c;但我只是 MongoDB 的初学者。如何建立一对 N 关系模型&#xff1f;” 这是我从参加 MongoDB 分享日活动的用户那里得到的最常见问题之一。 我对这个问题没有简短的答案&#xff0c;因为方法不只有一种&#xff0c;还有…