互联网Java工程师面试题·Elasticsearch 篇·第二弹

news2024/12/25 9:01:06

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

协调节点默认使用文档 ID 参与计算(也支持通过 routing ),以便为路由提供合适的分片。
shard = hash(document_id) % (num_of_primary_shards)
1 、当分片所在的节点接收到来自协调节点的请求后,会将请求写入到 Memory Buffer,然后定时(默认是每隔 1 秒)写入到 Filesystem Cache ,这个从 Momery Buffer 到 Filesystem Cache 的过程就叫做 refresh
2 、当然在某些情况下,存在 Momery Buffer Filesystem Cache 的数据可能会丢失,ES 是通过 translog 的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中时,才会清除掉,这个过程叫做 flush
3 、在 flush 过程中,内存中的缓冲将被清除,内容被写入一个新段,段的 fsync将创建一个新的提交点,并将内容刷新到磁盘,旧的 translog 将被删除并开始一个新的 translog
4 flush 触发的时机是定时触发(默认 30 分钟)或者 translog 变得太大(默认为 512M )时;

补充:关于 Lucene Segement
1 Lucene 索引是由多个段组成,段本身是一个功能齐全的倒排索引。
2 、段是不可变的,允许 Lucene 将新的文档增量地添加到索引中,而不用从头重建索引。
3 、对于每一个搜索请求而言,索引中的所有段都会被搜索,并且每个段会消耗CPU 的时钟周、文件句柄和内存。这意味着段的数量越多,搜索性能会越低。
4 、为了解决 这个 问题 , Elasticsearch 会合并小段到一个较大的段,提交新的合并段到磁盘,并删除那些旧的小段。

13、详细描述一下 Elasticsearch 更新和删除文档的过程。

1 、删除和更新也都是写操作,但是 Elasticsearch 中的文档是不可变的,因此不能被删除或者改动以展示其变更;
2 、磁盘上的每个段都有一个相应的 .del 文件。当删除请求发送后,文档并没有真的被删除,而是在.del 文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del 文件中被标记为删除的文档将不会被写入新段。
3 、在新的文档被创建时, Elasticsearch 会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del 文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。

14、详细描述一下 Elasticsearch 搜索的过程。

1 、搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch
2 、在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。
PS :在搜索的时候是会查询 Filesystem Cache 的,但是有部分数据还在 Memory Buffer,所以搜索是近实时的。
3 、每个分片返回各自优先队列中 所有文档的 ID 和排序值 给协调节点,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。
4 、接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。
5 、补充: Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch 增加了一个预查询的处理,询问 Term Document frequency ,这个评分更准确,但是性能会变差。*


15、在 Elasticsearch 中,是怎么根据一个词找到对应的倒排索引的?

SEE
Lucene学习总结之三:Lucene的索引文件格式(1) - 刘超觉先 - 博客园 (cnblogs.com)
Lucene学习总结之三:Lucene的索引文件格式(2) - 刘超觉先 - 博客园 (cnblogs.com)

16Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?

1 64 GB 内存的机器是非常理想的, 但是 32 GB 16 GB 机器也是很常见的。少于 8 GB 会适得其反。
2 、如果你要在更快的 CPUs 和更多的核心之间选择,选择更多的核心更好。多个内核提供的额外并发远胜过稍微快一点点的时钟频率。
3 、如果你负担得起 SSD ,它将远远超出任何旋转介质。 基于 SSD 的节点,查询和索引性能都有提升。如果你负担得起,SSD 是一个好的选择。
4 、即使数据中心们近在咫尺,也要避免集群跨越多个数据中心。绝对要避免集群跨越大的地理距离。
5 、请确保运行你应用程序的 JVM 和服务器的 JVM 是完全一样的。 在Elasticsearch 的几个地方,使用 Java 的本地序列化。
6 、通过设置 gateway.recover_after_nodes gateway.expected_nodes 、 gateway.recover_after_time 可以在集群重启的时候避免过多的分片交换,这可能会让数据恢复从数个小时缩短为几秒钟。
7 Elasticsearch 默认被配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。最好使用单播代替组播。
8 、不要随意修改垃圾回收器( CMS )和各个线程池的大小。
9 、把你的内存的(少于)一半给 Lucene (但不要超过 32 GB !),通过ES_HEAP_SIZE 环境变量设置。
10 、内存交换到磁盘对服务器性能来说是致命的。如果内存交换到磁盘上,一个100 微秒的操作可能变成 10 毫秒。 再想想那么多 10 微秒的操作时延累加起来。 不难看出 swapping 对于性能是多么可怕。
11 Lucene 使用了大量 的文件。同时, Elasticsearch 在节点和 HTTP 客户端之间进行通信也使用了大量的套接字。 所有这一切都需要足够的文件描述符。你应该增加你的文件描述符,设置一个很大的值,如 64,000
补充:索引阶段性能提升方法
1 、使用批量请求并调整其大小:每次批量数据 5–15 MB 大是个不错的起始点。
2 、存储:使用 SSD
3 、段和合并: Elasticsearch 默认值是 20 MB/s ,对机械磁盘应该是个不错的设置。如果你用的是 SSD ,可以考虑提高到 100–200 MB/s 。如果你在做批量导入,完全不在意搜索,你可以彻底关掉合并限流。另外还可以增加 index.translog.flush_threshold_size 设置,从默认的 512 MB 到更大一些的值,比如 1 GB,这可以在一次清空触发的时候在事务日志里积累出更大的段。
4 、如果你的搜索结果不需要近实时的准确度,考虑把每个索引的
index.refresh_interval 改到 30s
5 、如果你在做大批量导入,考虑通过设置 index.number_of_replicas: 0 关闭副本。

17、对于 GC 方面,在使用 Elasticsearch 时要注意什么?

1 SEE https://elasticsearch.cn/article/32
2 、倒排词典的索引需要常驻内存,无法 GC ,需要监控 data node segment memory 增长趋势。
3 、各类缓存, field cache, filter cache, indexing cache, bulk queue 等等,要设置合理的大小,并且要应该根据最坏的情况来看 heap 是否够用,也就是各类缓存全部占满的时候,还有 heap 空间可以分配给其他任务吗?避免采用 clear cache等“ 自欺欺人 的方式来释放内存。
4 、避免返回大量结果集的搜索与聚合。确实需要大量拉取数据的场景,可以采用scan & scroll api 来实现。
5 cluster stats 驻留内存并无法水平扩展,超大规模集群可以考虑分拆成多个集群通过 tribe node 连接。
6 、想知道 heap 够不够,必须结合实际应用场景,并对集群的 heap 使用情况做
持续的监控。

18、Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?

        Elasticsearch 提供的首个近似聚合是 cardinality 度量。它提供一个字段的基数,即该字段的 distinct 或者 unique 值的数目。它是基于 HLL 算法的。 HLL 会先对我们的输入作哈希运算,然后根据哈希运算的结果中的 bits 做概率估算从而得到基数。其特点是:可配置的精度,用来控制内存的使用(更精确 = 更多内存);小的数据集精度是非常高的;我们可以通过配置参数,来设置去重需要的固定内存使用量。无论数千还是数十亿的唯一值,内存使用量只与你配置的精确度相关

19、在并发情况下,Elasticsearch 如果保证读写一致?

1 、可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;
2 、另外对于写操作,一致性级别支持 quorum/one/all ,默认为 quorum ,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。
3 、对于读操作,可以设置 replication sync( 默认 ) ,这使得操作在主分片和副本分片都完成后才会返回;如果设置 replication async 时,也可以通过设置搜索请求参数_preference primary 来查询主分片,确保文档是最新版本。

20、如何监控 Elasticsearch 集群状态?

        Marvel 让你可以很简单的通过 Kibana 监控 Elasticsearch 。你可以实时查看你的集群健康状态和性能,也可以分析过去的集群、索引和节点指标。

21、介绍下你们电商搜索的整体技术架构。


22、介绍一下你们的个性化搜索方案?

SEE 基于 word2vec Elasticsearch 实现个性化搜索


23、是否了解字典树?

常用字典数据结构如下所示:

Trie 的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有 3 个基本性质:
1 、根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2 、从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
3 、每个节点的所有子节点包含的字符都不相同。

1 、可以看到, trie 树每一层的节点数是 26^i 级别的。所以为了节省空间,我们还可以用动态链表,或者用数组来模拟动态。而空间的花费,不会超过单词数× 单词长度。
2 、实现:对每个结点开一个字母集大小的数组,每个结点挂一个链表,使用左儿子右兄弟表示法记录这棵树;
3 、对于中文的字典树,每个节点的子节点用一个哈希表存储,这样就不用浪费太大的空间,而且查询速度上可以保留哈希的复杂度 O(1)

24、拼写纠错是如何实现的?

1 、拼写纠错是基于编辑距离来实现;编辑距离是一种标准的方法,它用来表示经过插入、删除和替换操作从一个字符串转换到另外一个字符串的最小操作步数;
2 、编辑距离的计算过程:比如要计算 batyu beauty 的编辑距离,先创建一个7×8 的表( batyu 长度为 5 coffee 长度为 6 ,各加 2 ),接着,在如下位置填入黑色数字。其他格的计算过程是取以下三个值的最小值:
如果最上方的字符等于最左方的字符,则为左上方的数字。否则为左上方的数字+1。(对于 3,3 来说为 0
左方数字 +1 (对于 3,3 格来说为 2
上方数字 +1 (对于 3,3 格来说为 2
最终取右下角的值即为编辑距离的值 3

对于拼写纠错,我们考虑构造一个度量空间( Metric Space ),该空间内任何关系满足以下三条基本条件:
d(x,y) = 0 -- 假如 x y 的距离为 0 ,则 x=y
d(x,y) = d(y,x) -- x y 的距离等同于 y x 的距离
d(x,y) + d(y,z) >= d(x,z) -- 三角不等式
1 、根据三角不等式,则满足与 query 距离在 n 范围内的另一个字符转 B ,其与 A 的距离最大为 d+n ,最小为 d-n
2 BK 树的构造就过程如下:每个节点有任意个子节点,每条边有个值表示编辑距离。所有子节点到父节点的边上标注 n 表示编辑距离恰好为 n 。比如,我们有棵树父节点是”book”和两个子节点 ”cake” ”books” ”book” ”books” 的边标号 1 ”book” ”cake” 的边上标号 4 。从字典里构造好树后,无论何 时你想插入新单词时,计算该单词与根节点的编辑距离,并且查找数值为 d(neweord, root)的边。递归得与各子节点进行比较,直到没有子节点,你就可 以创建新的子节点并将新单词保存在那。比如,插入”boo” 到刚才上述例子的树中,我们先检查根节点,查找 d(“book”, “boo”) = 1 的边,然后检查标号为 1 的边的子节点,得到单词 ”books” 。我们再计算距离 d(“books”, “boo”)=2 ,则将新单词插在”books” 之后,边标号为 2
3 、查询相似词如下:计算单词与根节点的编辑距离 d ,然后递归查找每个子节点标号为 d-n d+n (包含)的边。假如被检查的节点与搜索单词的距离 d 小于 n ,则返回该节点并继续查询。比如输入 cape 且最大容忍距离为 1 ,则先计算和根的编辑距离 d(“book”, “cape”)=4 ,然后接着找和根节点之间编辑距离为 3 到5 的,这个就找到了 cake 这个节点,计算 d(“cake”, “cape”)=1 ,满足条件所以返回 cake ,然后再找和 cake 节点编辑距离是 0 2 的,分别找到 cape 和cart 节点,这样就得到 cape 这个满足条件的结果。


要想了解更多:

千题千解·Java面试宝典_时光の尘的博客-CSDN博客

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

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

相关文章

阿里云服务器价格计算器(一键计算精准报价)

阿里云服务器价格计算器,鼠标选择云服务器ECS实例规格、地域、系统盘、带宽及购买时长即可一键计算出精准报价,阿里云服务器网分享阿里云服务器价格计算器链接地址: 目录 阿里云服务器价格计算器 阿里云服务器价格计算器 先打开阿里云服务…

【Java】猫和狗接口版本思路分析

目录 猫🐱和狗🐕(接口版本) 画图分析 案例代码 猫🐱和狗🐕(接口版本) 需求:对猫和狗进行训练,它们就可以跳高了,这里加入了跳高功能&#xff0…

Dubbo3应用开发—Dubbo注册中心引言

Dubbo注册中心引言 什么是Dubbo注册中心 Dubbo的注册中心,是Dubbo服务治理的⼀个重要的概念,他主要用于 RPC服务集群实例的管理。 注册中心的运行流程 使用注册中心的好处 可以有效的管理RPC集群的健康情况,动态的上线或者下线服务。让我…

计算机网络——计算机网络的性能指标(上)-速率、带宽、吞吐量、时延

目录 速率 比特 速率 例1 带宽 带宽在模拟信号系统中的意义 带宽在计算机网络中的意义 吞吐量 时延 发送时延 传播时延 处理时延 例2 例3 速率 了解速率之前,先详细了解一下比特: 比特 计算机中数据量的单位,也是信息论中信…

Elasticsearch数据操作原理

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎,设计用于云计算环境中,能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性,可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

《向量数据库指南》——用Milvus cloud搭建聊天机器人

作为向量数据库的佼佼者,Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。 举个例子,如果想要搭建一个聊天机器人,Milvus 一定是其进行数据管理的首选。那么,如何让这个应用程序开发变得易于管理及更好理解&#x…

力扣第226翻转二叉数 c++三种方法 +注释

题目 226. 翻转二叉树 简单 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出&am…

阿里云服务器镜像系统Anolis OS龙蜥详细介绍

阿里云服务器Anolis OS镜像系统由龙蜥OpenAnolis社区推出,Anolis OS是CentOS 8 100%兼容替代版本,Anolis OS是完全开源、中立、开放的Linux发行版,具备企业级的稳定性、高性能、安全性和可靠性。目前阿里云服务器ECS可选的Anolis OS镜像系统版…

Linux shell编程学习笔记8:使用字符串

一、前言 字符串是大多数编程语言中最常用最有用的数据类型,这在Linux shell编程中也不例外。 本文讨论了Linux Shell编程中的字符串的三种定义方式的差别,以及字符串拼接、取字符串长度、提取字符串、查找子字符串等常用字符串操作,,以及反…

Nacos 使用

大家好我是苏麟今天带来Nacos注册中心 . Nacos注册中心 国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的 注册中心。 认识Nacos Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比E…

【Spring笔记04】Spring中Bean的生命周期及Bean的后置处理器

这篇文章主要介绍的是Spring框架中Bean的生命周期,Bean的后置处理器、以及多个后置处理器的先后执行顺序。 目录 一、生命周期介绍 1.1、什么是Bean的生命周期 1.2、Bean生命周期的过程 (1)实例化阶段 (2)依赖注入…

PostgreSQL ash —— pgsentinel插件

一、 插件作用 众所周知,pg是没有像oracle那样的ash视图的,因此要回溯历史问题不太方便。pgsentinel插件会将pg_stat_activity与pg_stat_statements视图内容定期快照,并存入pg_active_session_history和pg_stat_statements_history视图中。 1…

【实操记录】Oracle数据整库同步至Apache Doris

本文是Oracle数据整库同步至Apache Doris实操记录,仅供参考 参考:https://cn.selectdb.com/blog/104 1、Oracle 配置 [rootnode1 oracle]# pwd /u01/app/oracle [rootnode1 oracle]# mkdir recovery_area [rootnode1 oracle]# chown -R oracle:dba re…

WPF中, 如何将控件的触发事件绑定到ViewModel

在DataGrid 等控件中, 有很多这种带闪电符号的触发事件. 如果用传统的事件驱动, 则直接在后台中建立 一个private PropertyChanged(Sender s, EventAgars Args) 即可. 但是如果需要绑定到ViewModel的话? 应该怎么做? 带闪电符号的触发事件 实现viewModel绑定前端触发事件的…

【C++设计模式之原型模式:创建型】分析及示例

简介 原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制已有对象来生成新的对象,而无需再次使用构造函数。 描述 原型模式通过复制现有对象来创建新的对象,而无需显式地调用构造函数或暴露对象的创建…

JAVA编程题-求矩阵螺旋值

螺旋类 package entity; /*** 打印数组螺旋值类*/ public class Spiral { // 数组行private int row; // 数组列private int col; // 行列数private int size; // 当前行索引private int rowIndex; // 当前列索引private int colIndex; // 行开始索引private int rowStart; //…

大模型部署手记(5)ChatGLM2+Jetson AGX Orin

1.简介: 组织机构:智谱/清华 代码仓:https://github.com/THUDM/ChatGLM2-6B 模型:THUDM/chatglm2-6b 下载:https://huggingface.co/THUDM/chatglm2-6b 镜像下载:https://aliendao.cn/models/THUDM/chat…

Java日期的学习篇

关于日期的学习 目录 关于日期的学习JDK8以前的APIDate Date常用APIDate的API应用 SimpleDateFormatSimpleDateFormat常用API测试 反向格式化(逆操作)测试 训练案例需求(秒杀活动)实现 Calendar需求痛点常见API应用测试 JDK8及以后的API(修改与新增)为啥学习(推荐使用)新增的AP…

ArcGIS Engine:鹰眼图的拓展功能-点击和矩形+坐标状态栏

目录 01 前言 02 鹰眼图的控制功能 03 显示当前鼠标的地理坐标 01 前言 说是拓展,不过是忘记了实验还有附加实验.这里补上. 前文不再赘述,上一节查看:ArcGIS Engine:视图菜单的创建和鹰眼图的实现_炒茄子的博客-CSDN博客 这里加上三个功能…

unity脚本_Vector3 c#

接下来学习 相对世界坐标 首先我们给场景物体一个空物体 修改新建空物体名字为GameObjectFather 修改GameObjectFather坐标 修改GameObject2坐标 然后将GameObjectFahter设置成GameObject2的父物体 我们观察到子物体的坐标改变了但是 运行显示的相对世界坐标this.transform.po…