深度思考ES面经

news2024/12/23 12:51:38

1 推荐文章

2万字详解,吃透 Elasticsearch

2 什么是倒排索引,为什么这么叫?

倒排索引(Inverted Index)是一种为快速全文搜索而设计的数据结构。它被广泛应用于搜索引擎,其中 Elasticsearch(简称 ES)是一个主要的使用者。

2.1 什么是倒排索引?

传统的索引(例如书的索引或数据库的B-Tree索引)是“正向”的:它们从“文档到词汇项”的映射。换句话说,你查找文档,然后列出文档中的词汇项。

相反,倒排索引从“词汇项到文档”的映射。这意味着,对于索引中的每一个唯一的词汇项,都有一个相关的文档列表,这些文档包含该词汇项。

例如,考虑以下简单文档集:

1. Apple is tasty.
2. Banana is tasty.
3. Apple and banana are fruits.

一个简单的倒排索引可能是:

Apple -> 1, 3
Banana -> 2, 3
tasty -> 1, 2
...

2.2 为什么叫“倒排索引”?

这个名称的由来是因为它与“正向索引”相对立。正向索引直接映射文档到其中的词汇项,而倒排索引则相反,映射词汇项到包含它们的文档。

2.2 为什么使用倒排索引?

倒排索引尤其对于全文搜索很有用,因为:

  1. 速度:它允许快速查找包含特定词汇项的文档。
  2. 空间效率:只为唯一的词汇项保存索引,并与相关的文档关联,这避免了重复。
  3. 排名和相关性:使用倒排索引,可以很容易地为搜索结果进行排名,基于词频、文档频率等。

Elasticsearch 作为一个分布式搜索和分析引擎,大量使用倒排索引来实现其高速和高效的文本搜索功能。

3 ES的内部FST索引

在这里插入图片描述
Elasticsearch 为了能快速找到某个 Term,先将所有的 Term 排个序,然后根据二分法查找 Term,时间复杂度为 logN,就像通过字典查找一样,这就是 Term Dictionary。

现在再看起来,和前缀树非常类似, 共享前缀,但是FST还能够共享后缀。但是如果 Term 太多,Term Dictionary 也会很大,放内存不现实,于是有了 Term Index。

就像字典里的索引页一样,A 开头的有哪些 Term,分别在哪页,可以理解 Term Index是一棵树。

这棵树不会包含所有的 Term,它包含的是 Term 的一些前缀。通过 Term Index 可以快速地定位到 Term Dictionary 的某个 Offset,然后从这个位置再往后顺序查找。

在内存中用 FST 方式压缩 Term Index,FST 以字节的方式存储所有的 Term,这种压缩方式可以有效的缩减存储空间,使得 Term Index 足以放进内存,但这种方式也会导致查找时需要更多的 CPU 资源。

对于存储在磁盘上的倒排表同样也采用了压缩技术减少存储所占用的空间。

3.1 ES中什么是FST

在Elasticsearch中,FST(Finite State Transducer)是一个数据结构,用于优化和压缩Term Dictionary。它是一种特殊的有限状态机,不仅可以表示键(在Elasticsearch的场景中,键通常是词项或term),还可以同时表示与该键关联的值。

以下是关于Elasticsearch中FST的一些核心点:

  1. 压缩:FST非常适合于压缩词典,因为它可以共享前缀和后缀。考虑到词汇中很多词项有共同的前缀和后缀,这种压缩方法是非常高效的。

  2. 快速查找:除了存储优势,FST还提供了快速的查找能力。当用户查询一个词项时,Elasticsearch可以迅速通过FST找到与该词项对应的元数据或其他相关信息。

  3. 存储键和值:与传统的前缀树(trie)不同,FST不仅存储词项(键)还可以存储与之关联的值。在Elasticsearch中,这些值可能是关于词项的元数据,例如其在倒排索引中的位置。

  4. 减少内存使用:由于其压缩特性,FST能够大大减少Term Dictionary在内存中的占用。这使得更多的数据可以被缓存在内存中,从而提高查询性能。

总之,在Elasticsearch中,FST是一个用于表示和压缩Term Dictionary的高效数据结构,使得Term Dictionary的存储更加高效,查询更加快速。

3.2 为什么前缀树也是一种有限状态机(FSM)

确切地说,前缀树(Trie)并不是FST(Finite State Transducer),但它们都属于有限状态机的范畴。FST是有限状态机的一个扩展,可以同时表示键和值。然而,Trie和FST都是基于有限状态机的数据结构,并且都能够有效地表示键的集合,这也是它们之间的相似之处。

让我们深入了解一下它们之间的区别和联系:

  1. 前缀树(Trie)

    • Trie是一个树形数据结构,专门用于存储一个字符串集合。
    • 它通过共享公共前缀来优化存储空间。
    • 每个节点代表一个字符,从根节点到叶节点的路径表示一个字符串。
    • Trie不直接存储与键关联的值,但可以将值附加到叶节点或某些特定节点上。
  2. 有限状态转换器(FST)

    • FST是有限状态机的一个扩展,它可以表示状态之间的转换(即键)以及与每个转换关联的输出值。
    • FST不仅可以共享前缀,还可以共享后缀,从而进一步压缩数据。
    • 在FST中,一个状态可以代表一个字符串的前缀或后缀,或者代表一个完整的字符串。
    • FST直接在其结构中表示与键关联的值。

由于FST能够共享前缀和后缀,并直接表示键和值,它比Trie更加灵活和高效,特别是在表示大量数据时。

简而言之,虽然Trie和FST都是基于有限状态机的数据结构,并有共享前缀的特性,但FST提供了更多的功能和更高的存储效率。在某些上下文中,如Elasticsearch的实现,FST由于其压缩和表示能力而被优先选择。

3.3 前缀树和FST的差异

FST和前缀树(Trie)在共享前缀的策略上是相似的。它们都会通过为字符串的每个字符建立路径来存储信息。在这种结构中,相同前缀的词汇会共享存储路径,直到它们的字符开始有所不同为止。

不过,FST与传统的前缀树有以下主要区别:

  1. 后缀共享:除了前缀共享,FST还试图共享后缀。这意味着,与前缀树可能会为相似的词后缀存储多次不同,FST会尝试重用和共享这些后缀,进一步减少所需的存储空间。

  2. 存储值:FST还能存储与键相关联的值。这使得FST可以被视为键-值映射,其中键是词项,值可以是任何相关数据,如词项在倒排索引中的位置。在Elasticsearch的上下文中,这通常是词项的元数据。

  3. 压缩:FST还采用了多种压缩技巧,以减少实际的存储需求。

总体而言,虽然FST和前缀树在共享前缀的基本策略上相似,但FST包含了更多的优化和扩展功能,使其在某些应用中更为高效。

3.4 FST是如何做到后缀共享的

让我们来详细讨论后缀共享。

共享后缀在复杂的词集中更常见。考虑一组更复杂的词,例如:["attempt", "attempts", "attempted", "attempting", "doing", "seated"]

在这些词中,我们看到了前缀"attempt"的共享,但还有后缀"s", "ed", 和"ing"

为了构建一个考虑到后缀共享的FST:

  1. 从开始状态,我们首先连接到字符a,然后依次到t,t,e,m,p
  2. 到此为止,我们已经表示了词"attempt"
  3. "attempt"的最后一个字符"t",我们可以分叉到三个不同的后缀:
    • "s"表示"attempts"
    • "ed"表示"attempted"
    • "ing"表示"attempting"
  4. 为"doing"建立树中节点时,会依次向下层建立d->o节点,然后o节点的指针会指向3中的ing节点,这时ing实现了后缀共享
  5. 同理,为seated词条建立4个层级的节点,ed直接复用3中早已经建立的后缀

每个后缀都在FST中只存储一次,从而实现了后缀的共享。

共享前缀和后缀是FST高效性的关键。在真实的数据集中,这种共享可以极大地压缩存储需求,特别是当词集包含许多变种和派生词时。

可以如下图所示,看到上面这个例子中的后缀共享方法
在这里插入图片描述

3 使用ES查找流程

3.1 先弄清楚ES的主要数据结构

在这里插入图片描述

3.2 使用ES作为搜索引擎的查找流程

Elasticsearch(ES)是一个基于Lucene库的搜索引擎。当你在ES上执行搜索时,它会经过以下主要步骤:

  1. 查询解析:

    • 用户发出查询请求,通常是一个JSON结构。
    • ES解析这个请求,将查询语句转换为适合Lucene处理的内部格式。
    • 这包括分析查询字符串、识别查询类型(如match, term, range等)和其他可能的查询参数。
  2. 文本分析:

    • 如果查询涉及到文本搜索,那么输入的文本会被分析。
    • 分析器(Analyzer)会将文本拆分为单个的词条也称分词(tokens),并可能执行其他操作,如小写化、去除停用词或应用词干提取。
    • 这个过程确保查询的词条和索引中的词条在相同的格式下。
  3. 查找Term Dictionary:

    • 对于每个词条,ES首先会查找词汇表(Term Dictionary)来找到该词条的元数据和位置信息。这通常使用FST(Finite State Transducer)来优化查找速度。
  4. 倒排索引查找:

    • 一旦找到词条,ES会查阅倒排索引来找出包含该词条的所有文档ID。
    • 对于多词条查询,ES会为每个词条执行此操作,并根据查询类型(例如布尔查询)组合结果。
  5. 打分和排序:

    • 使用BM25算法(默认)或其他相关性算法,ES为每个匹配的文档计算一个分数。
    • 这个分数表示文档与查询的相关性。
    • 所有匹配的文档根据分数进行排序。
  6. 获取文档:

    • ES从主索引中获取与最高分匹配的文档的完整版本。
    • 可以根据查询的需要返回所有或部分字段。
  7. 高亮和聚合(如果请求):

    • 如果查询请求中包含高亮指令,ES会标记查询匹配的部分。
    • 如果请求中包含聚合,ES会根据指定的字段和聚合类型计算统计信息。
  8. 返回结果:

    • ES构建一个JSON响应,其中包含匹配的文档、分数、可能的高亮和聚合结果,并将其返回给客户端。

这就是ES的基本搜索流程。当然,实际操作可能会涉及更多的复杂性,例如分片的处理、多节点查询和结果合并、过滤器的应用等。

3.3.1 一般的浏览器的搜索引擎就是使用ES的吗?

不是。浏览器中的主要搜索引擎如Google、Bing、Yahoo等都使用的是他们自己的专有搜索技术。Elasticsearch通常用于网站内的搜索、日志分析、实时应用监控和其他场景,而不是为全球范围的网页搜索设计的。

3.3.2 ES返回的结果是docid对应的文档的元数据信息吗?还是文档内容?

ES返回的结果既可以是文档的元数据,也可以是文档的实际内容。当执行搜索查询时,你可以指定需要哪些字段作为返回结果。如果没有指定,那么默认情况下,ES会返回整个文档。

3.3.3 ES的BM25算法是什么?

BM25是一种现代的、基于概率的文档排序算法,被认为比传统的TF-IDF方法更有效。BM25考虑了词条频率(TF)和逆文档频率(IDF)来计算文档的相关性分数,但与TF-IDF相比,它对高频词条有一个上限,这可以避免某些词条过度影响文档的相关性得分。

3.3.4 获取文档: 这里的主索引是什么索引和FST的区别

当我们提到Elasticsearch的“主索引”,我们是指存储文档的数据结构类似于OS中的索引节点方式,主索引节点只存储文档的元数据信息和一个指向文档位置的指针。在这里,文档是按照其ID存储和检索的。FST是用于存储和查找词汇表中词项的数据结构。简单来说,主索引关注的是整个文档,而FST关注的是文档中的词条。

3.3.5 为什么仅仅只返回部门字段,这里的字段包含什么?

在某些场景下,为了提高效率和减少网络传输,你可能只对文档的某些字段感兴趣,而不是整个文档。例如,如果你的文档是一个包含多个字段的用户资料,但你只需要姓名和电子邮件地址,那么可以指定只返回这两个字段。在ES查询时,可以使用"_source"参数指定返回哪些字段。这里的“字段”指的是文档内的任何属性,例如标题、作者、发布日期等。

4 一般的浏览器的搜索引擎就是使用ES的吗

不是。浏览器中的主要搜索引擎如Google、Bing、Yahoo等都使用的是他们自己的专有搜索技术。Elasticsearch通常用于网站内的搜索、日志分析、实时应用监控和其他场景,而不是为全球范围的网页搜索设计的。

5 为什么ES是准实时的

为什么ES是准实时的

6 ES怎么用

ElasticSearch在项目中具体怎么用?

6.1 Elasticsearch是否单独建一个项目,作为全文搜索使用,还是直接在项目中直接用?

这取决于你的需求和项目的复杂性。很多公司和项目都选择将Elasticsearch作为一个单独的服务或微服务运行,与主应用分开。这样做的好处是,它可以独立于主应用进行扩展,维护和更新,从而实现了解耦。但如果你的应用较小,或者你只是想快速地进行原型开发,那么可以直接在应用中集成Elasticsearch。

6.2 新增数据时,插入到mysql中,需不需要同时插入到es中?

如果你依赖Elasticsearch进行搜索或其他需要快速读取的操作,当你在MySQL中插入数据时,你也应该将这些数据插入到Elasticsearch中。这样,你可以确保当用户尝试搜索新添加的内容时,Elasticsearch的索引是最新的。有多种方法可以做到这一点,例如使用日志文件同步或使用工具和库,如Logstash或Debezium。

当你在MySQL中新增数据并希望这些数据在Elasticsearch中可搜寻,你需要确保这些数据也被同步到Elasticsearch。关于数据同步的触发方式,有几种常见的方法:

  1. 客户端发起的双重写入: 当应用程序(客户端)在MySQL中插入数据后,它也可以负责将同样的数据发送到Elasticsearch。这种方法的挑战在于确保两边的写入都成功,否则可能出现数据不一致的情况。

  2. MySQL的binlog监听与同步: 使用如Debezium或Logstash等工具监听MySQL的binlog(二进制日志),当检测到有新的数据变更时,自动将变更推送到Elasticsearch。这种方式相对客户端双重写入更为可靠,因为它确保了即使应用程序出现问题,数据也能被正确同步。

  3. 周期性的数据同步: 设定一个定时任务,例如每隔几分钟,检查MySQL的新数据,并同步到Elasticsearch。这适用于数据实时性要求不高的场景。

  4. 触发器: 在MySQL中设置触发器,当有新的数据插入或变更时,触发某些操作进行同步。但这种方法可能影响MySQL的性能,并且需要额外的工作来确保同步的成功。

总的来说,选择哪种方法取决于你的具体需求和系统的架构。但通常,监听binlog的方式因其相对的可靠性和低延迟而被广泛采用。

6.3 搜索时直接返回es搜索的结果,还是需要根据es的结果中的id,回mysql中重新查一遍?

这同样取决于你的应用和需求。在某些场景下,用户可能只需要从Elasticsearch中获取的元数据,所以直接返回Elasticsearch的结果就足够了。在其他情况下,可能需要返回更多详细的信息,那么可以使用Elasticsearch提供的ID在MySQL中进行查找。

关于使用MySQL:Elasticsearch主要是为搜索和分析设计的,并不是为了替代传统的关系数据库。MySQL(或其他RDBMS)提供了事务性、完整性、备份和恢复等功能,这些都是Elasticsearch不擅长或不支持的。而Elasticsearch主要针对的是大量数据的快速搜索和分析。所以,一般来说,MySQL用作主要的数据存储,而Elasticsearch用作搜索和分析工具。

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

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

相关文章

报错处理:Docker镜像无法启动

报错环境: Linux Docker 具体报错: standard_init_linux.go:211: exec user process caused "no such file or directory" 排错思路: 当尝试启动Docker镜像时,如果出现 no such file or directory 的错误,可…

简单记录一下Splunk ES 升级

1: 背景: 现在有些app 产品对splunk ES (enterprise security) 的版本有要求,这个就要求splunk ES 随着Splunk enterprise 也一起升级,下面先列一下各个版本的兼容: Splunk products version compatibility matrix - Splunk Documentation 下面列出的8.2.11 的版本: 2:…

Electron和vue3集成

本篇我们仅实现Electron和vue3通过先运行起vue3项目,再将vue3的url地址交由Electron打开的方案,仅由Electron在vue3项目上套一层壳来达到脱离本机浏览器运行目的 1、参考快速上手 | Vue.js搭建起vue3初始项目 npm install -g vue npm install -g vue/c…

【拯救大学生计划】:我做了一个QQ分组神器

文章目录 😊前言😃使用教程第一步:获取好友网名和备注第二步:文件设置第三步:自动选择好友 😆停顿问题解决方法😄结束语📚资源 专栏Python零基础入门篇🔥Python网络蜘蛛&…

【改进算法】【IHAOAVOA】天鹰优化算法和非洲秃鹫混合优化算法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《IHAOAVOA: An improved hybrid aquila optimizer and African vultures optimization algorithm for global optimization problems》,天鹰优化算法(AO)和非洲…

智慧工地: 建筑施工一体化信息管理系统源码

智慧工地管理云平台系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段,实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地管理系统让工程施工智能化 1、内容全面&a…

区块链技术与应用 - 学习笔记3【比特币数据结构】

大家好,我是比特桃。本系列笔记只专注于探讨研究区块链技术原理,不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划,在“加快数字发展 建设数字中国”篇章中,区块链被列为“十四五”七大数字经济重点产业之一&#…

(二十五)大数据实战——kafka集群及Kafka-Eagle控制台安装与部署

前言 本节内容我们主要介绍一下搭建kafka集群以及kafka集群的一个web客户端组件Kafka-Eagle的部署安装,使用的kafka版本是kafka_2.12-3.0.0。在搭建kafka集群之前,我们要预先搭建好zookeeper集群,这里作者默认zookeeper的集群环境已经搭建完…

飞行动力学 - 第18节-全机航向稳定性与隐身性 之 基础点摘要

飞行动力学 - 第18节-全机航向稳定性与隐身性 之 基础点摘要 1. 全机航向静稳定性2. 垂尾与隐身3. 参考资料 1. 全机航向静稳定性 机翼贡献 上反角 复杂、极小幅降低 后掠角 增加稳定性 机身贡献 降低稳定性 尾翼贡献 航向静稳定性的最大来源 平尾 类似机翼贡献 垂尾 最大来…

DAMO-YOLO训练自己的数据集,使用onnxruntime推理部署

DAMO-YOLO训练自己的数据集,使用onnxruntime推理部署 DAMO-YOLO 是阿里达摩院智能计算实验室开发的一种兼顾速度与精度的目标检测算法,在高精度的同时,保持了很高的推理速度。 DAMO-YOLO 是在 YOLO 框架基础上引入了一系列新技术&#xff0…

wpf C# 用USB虚拟串口最高速下载大文件 每包400万字节 平均0.7s/M,支持批量多设备同时下载。自动识别串口。源码示例可自由定制。

C# 用USB虚拟串口下载大文件 每包400万字节 平均0.7s/M。支持批量多设备同时下载。自动识别串口。可自由定制。 int 32位有符号整数 -2147483648~2147483647 但500万字节时 write时报端口IO异常。可能是驱动限制的。 之前用这个助手发文件,连续发送&#xff0…

Vim9和其他软件的文本复制、粘贴

大家都知道:在Vim9中使用y和p命令来进行文本的复制和粘贴,今天我来说一说Vim和其他软件之间的文本复制、粘贴操作。 Vim9和其他软件进行复制、粘贴,其原理就是通过系统剪贴板作为中介来执行操作。 一、从Vim9复制文本内容 按住鼠标左键滑出…

局域网内部如何实现文件夹共享

这里写自定义目录标题 1.创建文件夹test2.选择共享--添加用户3.选择高级共享 1.创建文件夹test 2.选择共享–添加用户 3.选择高级共享

《python趣味工具》——酷炫二维码(3)计算机二级考试题

昨天我们学习了如何批量制作合适的二维码,今天来刷几道题练练手! 文章目录 1. 制作名单2. 年会抽奖来啦3. 精准查找 1. 制作名单 秋招来了!hr部门需要获得简历初筛后的候选者名单,所有候选者简历都按照“小明_xx大学.pdf”命名放…

第8章_瑞萨MCU零基础入门系列教程之SCI SPI

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

DBSCAN 揭秘:了解此算法的工作原理

一、说明 DBSCAN 代表 基于密度的带噪声应用程序空间聚类。它是一种流行的聚类算法,用于机器学习和数据挖掘,根据数据集中紧密排列在一起的点与其他点的距离对点进行分组。 二、DBSCAN的算法原理 DBSCAN 的工作原理是将数据划分为由密度较低的区域分隔的…

数据结构与算法:数据结构基础

目录 数组 定义 形式 顺序存储 基本操作 读取元素 更新元素 插入元素 删除元素 扩容 初始化 时机 步骤 优劣势 链表 定义 单向链表 特点 双向链表 随机存储 基本操作 查找节点 更新节点 插入节点 删除元素 数组VS链表 栈与队列 栈 定义 基本操作…

分类预测 | Matlab实现SO-RF蛇群算法优化随机森林多输入分类预测

分类预测 | Matlab实现SO-RF蛇群算法优化随机森林多输入分类预测 目录 分类预测 | Matlab实现SO-RF蛇群算法优化随机森林多输入分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SO-RF蛇群算法优化随机森林多输入分类预测(完整源码和数据&…

notepad++去除每一行第二个等号之后的内容解决ResolvePackageNotFound

([^])$ 正则表达式用第一行的 https://blog.csdn.net/Charlotte_Si/article/details/132333988 原文的正则表达式不知道为什么没用

XXE-Lab for PHP

环境配置 1.将靶场进行下载.... https://github.com/c0ny1/xxe-lab 2.将PHPStudy的中间件与版本信息调制为php-5.4.45Apache访问以下地址开始练习... http://127.0.0.1/xxelabs/php_xxe/ 靶场实操 1.在登录界面输入账号密码并抓取数据包.... 2.尝试读取本地文件.... <…