Java——《面试题——ElasticSearch篇》

news2024/11/14 21:53:48

目录

1、谈谈分词与倒排索引的原理

2、说说分段存储的思想

 3、谈谈你对段合并的策略思想的认识

4、了解文本相似度 TF-IDF吗

5、能说说ElasticSearch 写索引的逻辑吗?

6、熟悉ElasticSearch 集群中搜索数据的过程吗?

7、了解ElasticSearch 深翻页的问题及解决吗?

8、熟悉ElasticSearch 性能优化

9、ElasticSearch 查询优化手段有哪些?

10、elasticsearch 是如何实现 master 选举的?

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

12、说说你们公司 es 的集群架构,索引数据大小,分片有多少?

13、什么是ElasticSearch?

14、ElasticSearch中的集群、节点、索引、文档、类型是什么?

15、ElasticSearch中的分片是什么?

 16,ElasticSearch中的副本是什么?

 17,ElasticSearch中的分析器是什么?

18,什么是ElasticSearch中的编译器?

19,什么是ElasticSearch中的过滤器?

 20,启用属性,索引和存储的用途是什么?


1、谈谈分词与倒排索引的原理

首先说分词是给检索用的。

  • 英文:一个单词一个词,很简单。I am a student,词与词之间空格分隔。
  • 中文:我是学生,就不能一个字一个字地分,我-是-学生。这是好分的。还有歧义的,使用户 放心,使用-户,使-用户。人很容易看出,机器就难多了。所以市面上有各种各样的分词器, 一个强调的效率一个强调的准确率。

 倒排索引:倒排针对的是正排。

1. 正排就是我记得我电脑有个文档,讲了 ES 的常见问题总结。那么我就找到文档,从上往下翻 页,找到 ES 的部分。通过文档找文档内容。

2. 倒排:一个 txt 文件 ES 的常见问题 -> D:/分布式问题总结.doc。

所以倒排就是文档内容找文档。当然内容不是全部的,否则也不需要找文档了,内容就是几个分词 而已。这里的 txt 就是搜索引擎。

2、说说分段存储的思想

Lucene 是著名的搜索开源软件,ElasticSearch 和 Solr 底层用的都是它。

分段存储是 Lucene 的思想。

早期,都是一个整个文档建立一个大的倒排索引。简单,快速,但是问题随之而来。

文档有个很小的改动,整个索引需要重新建立,速度慢,成本高,为了提高速度,定期更新那么时 效性就差。

现在一个索引文件,拆分为多个子文件,每个子文件是段。修改的数据不影响的段不必做处理。

 3、谈谈你对段合并的策略思想的认识

分段的思想大大的提高了维护索引的效率。但是随之就有了新的问题。

每次新增数据就会新增加一个段,时间久了,一个文档对应的段非常多。段多了,也就影响检索性 能了。

检索过程:

  1. 查询所有短中满足条件的数据 
  2. 对每个段的结果集合并

所以,定期的对段进行合理是很必要的。真是天下大势,分久必合合久必分。

策略:将段按大小排列分组,大到一定程度的不参与合并。小的组内合并。整体维持在一个合理的 大小范围。当然这个大到底应该是多少,是用户可配置的。这也符合设计的思想。

4、了解文本相似度 TF-IDF吗

简单地说,就是你检索一个词,匹配出来的文章,网页太多了。比如 1000 个,这些内容再该怎么 呈现,哪些在前面哪些在后面。这需要也有个对匹配度的评分。

TF-IDF 就是干这个的。

TF = Term Frequency 词频,一个词在这个文档中出现的频率。值越大,说明这文档越匹配, 正向指标。

IDF = Inverse Document Frequency 反向文档频率,简单点说就是一个词在所有文档中都出 现,那么这个词不重要。比如“的、了、我、好”这些词所有文档都出现,对检索毫无帮助。反向指标。

TF-IDF = TF / IDF

5、能说说ElasticSearch 写索引的逻辑吗?

ElasticSearch 是集群的 = 主分片 + 副本分片。

写索引只能写主分片,然后主分片同步到副本分片上。但主分片不是固定的,可能网络原因,之前 还是 Node1 是主分片,后来就变成了 Node2 经过选举成了主分片了。

客户端如何知道哪个是主分片呢? 看下面过程。

  1. 客户端向某个节点 NodeX 发送写请求
  2. NodeX 通过文档信息,请求会转发到主分片的节点上
  3. 主分片处理完,通知到副本分片同步数据,向 Nodex 发送成功信息。
  4. Nodex 将处理结果返回给客户端。

6、熟悉ElasticSearch 集群中搜索数据的过程吗?

  1. 客户端向集群发送请求,集群随机选择一个 NodeX 处理这次请求。
  2. Nodex 先计算文档在哪个主分片上,比如是主分片 A,它有三个副本 A1,A2,A3。那么请求 会轮询三个副本中的一个完成请求。
  3. 如果无法确认分片,比如检索的不是一个文档,就遍历所有分片。

补充一点,一个节点的存储量是有限的,于是有了分片的概念。但是分片可能有丢失,于是有了副 本的概念。

比如: ES 集群有 3 个分片,分片 A、分片 B、分片 C,那么分片 A + 分片 B + 分片 C = 所有数据,每个分 片只有大概 1/3。分片 A 又有副本 A1 A2 A3,数据都是一样的。

7、了解ElasticSearch 深翻页的问题及解决吗?

深翻页:比如我们检索一次,轮询所有分片,汇集结果,根据 TF-IDF 等算法打分,排序后将前 10 条数据返回。用户感觉不错,说我看看下一页。ES 依然是轮询所有分片,汇集结果,根据 TF-IDF 等算法打分,排序后将前 11-20 条数据返回。

对用户来说,翻页应该很快啊,但是实际上,第一次检索多复杂,下一次检索就多复杂。

解决的话,可以把用户的检索结果,存入 Redis 中 10 分钟。这样分页就很快,超过 10 分钟,用户 不翻页,也就不会翻页了,数据就可以清除了。

8、熟悉ElasticSearch 性能优化

1. 批量提交

背景是大量的写操作,每次提交都是一次网络开销。网络永久是优化要考虑的重点。

2. 优化硬盘

索引文件需要落地硬盘,段的思想又带来了更多的小文件,磁盘 IO 是 ES 的性能瓶颈。一个固态硬 盘比普通硬盘好太多。

3. 减少副本数量

副本可以保证集群的可用性,但是严重影响了 写索引的效率。写索引时不只完成写入索引,还要完 成索引到副本的同步。ES 不是存储引擎,不要考虑数据丢失,性能更重要。 如果是批量导入,建 议就关闭副本。

9、ElasticSearch 查询优化手段有哪些?

设计阶段调优

(1)根据业务增量需求,采取基于日期模板创建索引,通过 roll over API 滚动索引;

(2)使用别名进行索引管理;

(3)每天凌晨定时对索引做 force_merge 操作,以释放空间;

(4)采取冷热分离机制,热数据存储到 SSD,提高检索效率;冷数据定期进行 shrink操作,以缩 减存储;

(5)采取 curator 进行索引的生命周期管理;

(6)仅针对需要分词的字段,合理的设置分词器;

(7)Mapping 阶段充分结合各个字段的属性,是否需要检索、是否需要存储等。……..

写入调优

(1)写入前副本数设置为 0;

(2)写入前关闭 refresh_interval 设置为-1,禁用刷新机制;

(3)写入过程中:采取 bulk 批量写入;

(4)写入后恢复副本数和刷新间隔;

(5)尽量使用自动生成的 id。

查询调优

(1)禁用 wildcard;

(2)禁用批量 terms(成百上千的场景);

(3)充分利用倒排索引机制,能 keyword 类型尽量 keyword;

(4)数据量大时候,可以先基于时间敲定索引再检索;

(5)设置合理的路由机制。

其他调优

部署调优,业务调优等。

上面的提及一部分,面试者就基本对你之前的实践或者运维经验有所评估了。

10、elasticsearch 是如何实现 master 选举的?

面试官:想了解 ES 集群的底层原理,不再只关注业务层面了。

前置前提:

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

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

核对了一下代码,核心入口为 findMaster,选择主节点成功返回对应 Master,否则返回 null。选 举流程大致描述如下:

第一步:确认候选主节点数达标,elasticsearch.yml 设置的值

discovery.zen.minimum_master_nodes;

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

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

题外话:获取节点 id 的方法。

  • GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name
  • ip port heapPercent heapMax id name

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

面试官:想了解大数据量的运维能力。

解答:索引数据的规划,应在前期做好规划,正所谓“设计先行,编码在后”,这样才能有效的避免 突如其来的数据激增导致集群处理能力不足引发的线上客户检索或者其他业务受到影响。

如何调优:

动态索引层面

基于模板+时间+rollover api 滚动创建索引,举例:设计阶段定义:blog 索引的模板格式为: blog_index_时间戳的形式,每天递增数据。这样做的好处:不至于数据量激增导致单个索引数据量 非常大,接近于上线 2 的32 次幂-1,索引存储达到了 TB+甚至更大。

一旦单个索引很大,存储等各种风险也随之而来,所以要提前考虑+及早避免。

存储层面

冷热数据分离存储,热数据(比如最近 3 天或者一周的数据),其余为冷数据。

对于冷数据不会再写入新数据,可以考虑定期 force_merge 加 shrink 压缩操作,节省存储空间和 检索效率。

部署层面

一旦之前没有规划,这里就属于应急策略。

结合 ES 自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力,注意:如果之前主 节点等规划合理,不需要重启集群也能完成动态新增的。

12、说说你们公司 es 的集群架构,索引数据大小,分片有多少?

面试官:想了解应聘者之前公司接触的 ES 使用场景、规模,有没有做过比较大规模的索引设计、 规划、调优。

解答:如实结合自己的实践场景回答即可。

比如:ES 集群架构 13 个节点,索引根据通道不同共 20+索引,根据日期,每日递增 20+,索引: 10 分片,每日递增 1 亿+数据,每个通道每天索引大小控制:150GB 之内。

13、什么是ElasticSearch?

Elasticsearch是一个基于Lucene的搜索引擎。它提供了具有HTTP Web和无架构JSON文档的分布 式,多租户能力的全文搜索引擎。Elasticsearch是用Java开发的,根据[Apache]许可条款作为开源 发布。

14、ElasticSearch中的集群、节点、索引、文档、类型是什么?

  • 群集是一个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的 联合索引和搜索功能。群集由唯一名称标识,默认情况下为“elasticsearch”。此名称很重要, 因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分。
  • 节点是属于集群一部分的单个服务器。它存储数据并参与群集索引和搜索功能。
  • 索引就像关系数据库中的“数据库”。它有一个定义多种类型的映射。索引是逻辑名称空间,映 射到一个或多个主分片,并且可以有零个或多个副本分片。 MySQL =>数据库 ElasticSearch =>索引
  • 文档类似于关系数据库中的一行。不同之处在于索引中的每个文档可以具有不同的结构(字 段),但是对于通用字段应该具有相同的数据类型。 MySQL => Databases => Tables => Columns / Rows ElasticSearch => Indices => Types =>具有属性的文档
  • 类型是索引的逻辑类别/分区,其语义完全取决于用户。

15、ElasticSearch中的分片是什么?

在大多数环境中,每个节点都在单独的盒子或虚拟机上运行。

索引 - 在Elasticsearch中,索引是文档的集合。

分片 -因为Elasticsearch是一个分布式搜索引擎,所以索引通常被分割成分布在多个节点上的 被称为分片的元素。

 16,ElasticSearch中的副本是什么?

一个索引被分解成碎片以便于分发和扩展。副本是分片的副本。一个节点是一个属于一个集群的 ElasticSearch的运行实例。一个集群由一个或多个共享相同集群名称的节点组成。

 17,ElasticSearch中的分析器是什么?

在ElasticSearch中索引数据时,数据由为索引定义的Analyzer在内部进行转换。 分析器由一个 Tokenizer和零个或多个TokenFilter组成。编译器可以在一个或多个CharFilter之前。分析模块允许 您在逻辑名称下注册分析器,然后可以在映射定义或某些API中引用它们。

Elasticsearch附带了许多可以随时使用的预建分析器。或者,您可以组合内置的字符过滤器,编译 器和过滤器器来创建自定义分析器。

18,什么是ElasticSearch中的编译器?

编译器用于将字符串分解为术语或标记流。一个简单的编译器可能会将字符串拆分为任何遇到空格 或标点的地方。Elasticsearch有许多内置标记器,可用于构建自定义分析器。

19,什么是ElasticSearch中的过滤器?

数据由Tokenizer处理后,在编制索引之前,过滤器会对其进行处理。

 20,启用属性,索引和存储的用途是什么?

enabled属性适用于各类ElasticSearch特定/创建领域,如index和size。用户提供的字段没有“已启 用”属性。 存储意味着数据由Lucene存储,如果询问,将返回这些数据。

存储字段不一定是可搜索的。默认情况下,字段不存储,但源文件是完整的。因为您希望使用默认 值(这是有意义的),所以不要设置store属性 该指数属性用于搜索。

索引属性只能用于搜索。只有索引域可以进行搜索。差异的原因是在分析期间对索引字段进行了转 换,因此如果需要的话,您不能检索原始数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vsCode 创建新java项目(创建一个新java项目测试方法)

VSCODE环境配置-java之项目建立,非常适合刚准备使用VSCODE开发JAVA的人_vscode创建java项目_rainmenzhao的博客-CSDN博客 1 按 ctrl shift p 2 输入 create Java project 3 选 no build tools 4 选择 一个文件夹 存放 之后要 新建的文件 5 选完之后 自动返回主页…

获得Jolt 大奖的《持续交付》作者David Farley又一新作《现代软件工程》

戴维 法利 (David Farley) 是持续交付的先驱、思想领袖, 也是持续交付、 DevOps、 测试驱动开发和软件开发领域的专家。 从现代计算的早期开始,戴维曾担任过程序员、软件工程师、系统架构师和成功团 队的领导者,他掌握了计算机和软件开发的基…

ES基本操作(postman篇)

关系型数据库 -> Databases(库) -> Tables(表) -> Rows(行) -> Columns(列)。Elasticsearch -> Indeces(索引) -> Types(类型) -> Documents(文档) -> Fields(属性)。 需要注意的是:type的概念在es7.0之后已经删除了。 以下仅做刚入门学习…

矩阵对角线元素的和:揭秘数学之美,解密矩阵的隐秘密码

本篇博客会讲解力扣“1572. 矩阵对角线元素的和”的解题思路,这是题目链接。 本题的思路是:主对角线的下标满足i j,副对角线的下标满足i j size - 1,故只需要使用i遍历每一行,把(i, i)和(i, size - i - 1)的元素求和…

探索 Spring Boot 项目全过程

文章目录 🎇前言1.Spring Boot 所需环境2.Spring Boot 项目创建2.1 安装插件2.2 创建新项目2.3 项目属性配置2.4添加依赖2.4 修改项目名称2.5 添加框架支持2.6 目录介绍 3.判断Spring Boot 创建项目是否成功🎆总结 🎇前言 在 Java 这个圈子&…

1. Except

文章目录 Except前言Except 语法Except 使用举例结合其他关键字使用EXCEPT with BETWEEN operatorExcept with IN operatorEXCEPT with LIKE operator 文章参考 Except 前言 SQL中,EXCEPT 操作用于检索存在于第一个表中的唯一记录,而不是两个表中共有的…

python3GUI--网速内存小工具By:PyQt5(附源码)

文章目录 一.前言二.预览1.主界面2.动图演示3.内存详细信息查看4.自定义界面 三.源代码1.tool_god_GUI.py2.tool_god_ui.py3.engine.py4.CWidgets.py 四.总结五.参考 一.前言 本次使用PyQt5进行开发一款网…

(并查集) 685. 冗余连接 II ——【Leetcode每日一题】

并查集基础 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的Kruskal算法和求最近公共祖先(LCA)等。 并查集的基本操作主…

MySQL 分库分表实战之ShardingSpare

文章目录 概要一、安装二、配置2.1、 通用配置2.2、 分片配置2.3、读写分离 三、演练3.1、读写分离3.2、分库分表3.3、分库分表读写分离 4、总结 概要 市面上MySQL分库分表中间件还是很多的,主要分为两大类:应用层依赖类中间件(比如sharding…

【学习周报】

最近看过的几篇论文里,VALOR和InstructBLIP模型使用了cross-attention机制,以这两篇论文为基础着重学习cross-attention相关的代码和思路。 学习内容: cross-attention机制学习lstm与transformer 学习时间: 6.26 ~ 7.1 学习笔记…

Linux--重定向:> >> <

输出重定向&#xff1a;> a.如果目标文件不存在&#xff0c;则创建文件。反之 b.本来应该显示到显示器的内容&#xff0c;被写入到了文件中 示例&#xff1a; 追加重定向: >> 示例&#xff1a; 输入重定向&#xff1a;< 本来应该从键盘中读取的内容&#xff0c;变…

分布式锁的实现方案(免费gpt4分享)

1.1基于数据库 有两个方案&#xff1a;依赖数据库排他锁以及表主键的唯一。 依赖数据库排他锁&#xff1a; 在查询语句后面增加for update&#xff0c;数据库会在查询过程中给数据库表增加排他锁 (注意&#xff1a; InnoDB 引擎在加锁的时候&#xff0c;只有通过索引进行检索…

SpringBoot扩展机制

启动生命周期 一.Spring boot初始化器扩展 package com.lx.conmon.extend.intializer;import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext;/*** Spring boot初始化器扩展* author liu we…

AIPRM for ChatGPT 提示词模板扩展工具实践

&#xff08;1&#xff09;基本介绍 AIPRM for ChatGPT是一个Chrome浏览器扩展程序&#xff0c;基于Chromium内核开发的浏览器都可以使用该扩展&#xff0c;比如微软的Edge浏览器等。 在AIPRM的帮助下&#xff0c;我们可以在ChatGPT中一键使用各种专门为网站SEO、SaaS、营销、…

超详细,Python自动化测试 Allure报告参数化动态生成标题(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 默认 allure 报告…

ubuntu安装openssh

Ubuntu安装openssh之后&#xff0c;然后在客户端安装winscp,然后就可以很方便的传输文件了 sudo apt install openssh-server sudo service ssh status sudo service ssh start sudo service ssh restart

自然语言处理从入门到应用——预训练模型总览:预训练模型存在的问题

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 相关文章&#xff1a; 预训练模型总览&#xff1a;从宏观视角了解预训练模型 预训练模型总览&#xff1a;词嵌入的两大范式 预训练模型总览&#xff1a;两大任务类型 预训练模型总览&#xff1a;预训练模型的拓展 …

DOM模型

文章目录 DOM模型获取DOM对象常用方法通过元素ID获取DOM对象通过元素标签名获取DOM对象通过元素的class属性获取DOM对象通过元素的name属性获取DOM对象通过CSS选择器获取所有DOM对象通过CSS选择器获取第一个DOM对象 获取DOM对象时机操作DOM属性直接通过属性名修改属性使用getAt…

Qt中使用QXmlStreamReader读取xml文件中遇到的问题

Qt系列文章目录 文章目录 Qt系列文章目录前言一、为什么xml.readElementText()是空的问题原因QXmlStreamReader类简介 前言 <?xml version"1.0" encoding"UTF-8"?> <note><yolov5>E:/work/python_jdk/yolov5/dist/detect/detect.exe&…

终于有人把 Java 面试高分 Guide 总结得如此系统,堪称傻瓜式笔记总结

纵观今年的技术招聘市场&#xff0c; Java 依旧是当仁不让的霸主 &#xff01;即便遭受 Go 等新兴语言不断冲击&#xff0c;依旧岿然不动。究其原因&#xff1a; Java 有着极其成熟的生态&#xff0c;这个不用我多说&#xff1b; Java 在 运维、可观测性、可监 控性方面都有着…