【后端面试题】【中间件】【NoSQL】ElasticSearch索引机制和高性能的面试思路

Elasticsearch的索引机制

Elasticsearch使用的是倒排索引,所谓的倒排索引是相对于正排索引而言的。
在一般的文件系统中,索引是文档映射到关键字,而倒排索引则相反,是从关键字映射到文档

如果没有倒排索引的话,想找到包含关键字“Elasticsearch”的文档,需要遍历所有的文档,然后筛选出包含了“Elasticsearch”关键字的文档。有了倒排索引,就可以直接从关键字出发,找到“Elasticsearch”关键字对应的文档。

Elasticsearch依赖Lucene来维护索引,基本原理如下:

  • 每次写入一个新的文档的时候,根据文档的每一个字段,Elasticsearch会使用分词器,把每个字段的值切割成一个个关键词,每一个关键词也叫做Term
  • 切割之后,Elasticsearch会统计每一个关键词出现的频率构建一个关键词到文档ID、出现频率、位置的映射,叫做posting list

在这里插入图片描述
从图片里可以看到几个关键点:

  • 每个字段是分散统计
  • Elasticsearch记录了两个位置信息,一个位置指的是它是第几个词,另一个偏移量指的是整个关键词的起始位置。比如World在文档0的desc里是第1个词(从0开始),它的位置是从Hello World的起始位置算的第6位字符到11位字符。
    存在Elasticsearch里的文档很多,一个字段会有非常多的关键词。假设要查询的是desc里包含Hello这个关键字的文档,首先在关键词表格里找到Hello这一条。如果关键词是随机的,肯定很难找。
    如果让你来设计的话,可以考虑把这些关键词排序,比如按字母来排序。但是这种类似查找单词的东西,在业界早就有成熟的方案,就是前缀树,也叫做字典树。
    这个关键词表格在Elasticsearch里叫Term Dictionary。它们的目标是尽可能地把全部关键词组成地索引整个装进内存里。

之所以是尽可能,而不是一定,是因为部分字段的关键词非常多,确定装不进去。

Elastiscearch更进一步用了一个优化,就是FST(Finite State Transducers),核心思想是连公共前缀、后缀也一起压缩了
最基本的概念如下:
假设有两个关键词cat和ct,两种数据结构看起来是这样的
在这里插入图片描述
当你找到3的时候,如果经过0-1-3,就知道前缀是ct,并且能够得到ct在Term Dictionary(关键词表格)的位置这个位置也是ct所在的Block

如果有其他的关键词,cta、ctb等,都是用这个前缀的,当几千个关键词都共享某个前缀的时候,在一个Block内部怎么找?

Elasticsearch会在Block内部有很多关键词的时候,进一步切割成所谓的Floor Block,每个Floor Block使用第一个关键词的首字母来加快查找。

在Block或Floor Block内部,是通过遍历来查找对应的关键词的,整个结构看起来是下面这样
在这里插入图片描述

可以把查找关键词的过程理解为两步

  1. 根据FST找到Block
  2. 在Block里遍历找到关键词。如果Block进一步细分为Floor Block,就先根据前缀找到Floor Block,然后再去遍历Floor Block。

找到了关键词,也就找到了这个关键词对应的posting list,可以根据文档ID来找到具体的文档了。

面试准备

还要清楚公司内部一些和Elasticsearch有关的数据

  • Elasticsearch是如何部署的?有几个节点?每个节点上面内存有多大?这些内存是怎么分配的?
  • Elasticsearch上JVM的配置是什么?垃圾回收用的哪个?垃圾回收停顿的实践多长?
  • Elasticsearch的哪些配置和默认值不一样,为什么修改?
  • Elasticsearch性能如何,能够撑住多大的读写流量

如果本身对Elasticsearch性能优化不是很了解的话,不特别建议在简历或自我介绍的时候提起Elasticsearch性能优化。但是如果很擅长,可以特意强调一下,足以称为竞争优势。

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

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

相关文章

001:开源交易系统开发实战开篇

本专栏采用融入【主力思维】的方法学,包含数据抓取、特征模型开发、历史验证回归测试、每日动态风险评估管理等技术,较大的增强股票投资胜率,让IT开发者拥有一套实用的属于自己思路的专用交易软件。 先简要介绍下系统运行的成果和项目架构&a…

不可编辑的加密word文件破解

文章目录 1 将word文件另存为xml格式2 使用记事本打开xml格式的word文件3 ctrlF查找w:enforcement4 将w:enforcement"1"改成w:enforcement"0"并保存5 用word打开xml格式的文件并另存为docx格式6 成功可以编辑 1 将word文件另存为xml格式 2 使用记事本打开x…

如何在PostgreSQL故障切换后找回丢失的数据

1. 背景 PostgreSQL的HA方案一般都基于其原生的流复制技术,支持同步复制和异步复制模式。 同步复制模式虽然可以最大程度保证数据不丢失,但通常需要至少部署三台机器,确保有两台以上的备节点。 因此很多一主一备HA集群,都是使用异…

简单shell

目录 预备知识 fork 进程等待 wait waitpid 环境变量 概念 分类 常见的环境变量及其用途 环境变量的查看与设置 exec系列 函数解释 命名理解 简单shell 预备知识 fork fork 是 Linux 和许多其他类 Unix 系统中的一个重要系统调用,它用于创建一个新的…

双指针-旋转链表

目录 一、问题描述 二、解题思路 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 1.先确定链表长度为len 2.注意当K>len时,如果每个节点都往右移动len个位置,等价于不移动,所以需要求KK%len。 3.所有元素右移K个位置&#xf…

uniapp运行到小程序Vue.use注册全局组件不起作用

真想吐槽一下小程序,uniapp运行到小程序使用Vue.use注册全局组件根本不起作用,也不报错,这只是其中一个问题,其他还有很多问题,比如vue中正常使用的没问题的语法,运行到小程序就不行,又是包太大…

【Python机器学习】自动化特征选择——单变量统计

添加更多特征会使所有的模型变得更加复杂,从而增大过拟合的可能性。 在添加新特征或处理一般的高位数据集时,最好将特征的数量减少到只包含最有用的那些特征,并删除其余特征,这样会得到泛化能力更好、更简单的模型。 对于如何判…

生成式人工智能和机器人技术是否即将取得最后的突破?

了解生成式人工智能与机器人技术的融合如何彻底改变从医疗保健到娱乐等行业 想象一下这样一个世界,机器人可以谱写交响乐、画出杰作、写出小说。这种创造力与自动化的迷人融合,由 生成式人工智能,不再是梦想;它正在以重大方式重塑…

1Panel开源面板项目GitHub Star数量突破20,000!

截至2024年6月25日9:00,FIT2CLOUD飞致云旗下开源项目——1Panel开源Linux服务器运维管理面板GitHub Star数超过20,000个! 继Halo和JumpServer之后,1Panel成为飞致云旗下第三个GitHub Star数量超过20,000个的开源项目,也是飞致云旗…

Python 类

文章目录 定义类与对象成员方法构造方法魔术方法私有成员继承复写父类成员调用父类成员 多态 定义 class 类名:成员变量成员方法变量类名()# 创建对象 变量.成员变量# 使用成员变量 变量.成员方法类与对象 类相当于设计图纸,规定了各种属性与行为。 对象也就是按照…

(单机架设教程)3D剑踪

前言 今天给大家带来一款单机游戏的架设:3D剑踪 如今市面上的资源参差不齐,大部分的都不能运行,本人亲自测试,运行视频如下: 3D剑踪 搭建教程 此游戏架设不需要虚拟机, 我们先解压 “3D剑踪.zip” &…

【Python】pycharm常用快捷键操作

目录 一.pycharm自定义修改快捷键 二.pycharm默认常用快捷键 一.pycharm自定义修改快捷键 在file-setting-keymap中可以修改快捷键,建议刚开始没特殊需求就不用修改,先熟悉系统默认的常用快捷键,但是以下情况可以考虑修改: 之前使用其他I…

因果解耦表征 | (香港理工ICLR24)联合学习个性化因果不变表示以应对异构联邦客户端

原文:Learning Personalized Causally Invariant Representations for Heterogeneous Federated Clients 地址:https://openreview.net/forum?id8FHWkY0SwF 代码:未知 出版:ICLR 2024 机构: 香港理工大学、香港科技大学 解读&…

JAVA期末速成库(12)第十三章

一、习题介绍 第十三章 Check Point:P501 13.3,13.17,13.28,13.29 Programming Exercise:13.1,13.6,13.11 二、习题及答案 Check Point: 13.3 True or false? a. An abst…

Nature Climate Change | 中国科学院地理资源所吴朝阳课题组发表生物多样性调控植被物候的研究成果!

本文首发于“生态学者”微信公众号! 植被春季物候对气候变化的响应通常是通过测量其温度敏感性(ST,温度每升高1度,植被提前展叶的天数)来量化。ST是植被在当地历史气候环境的选择压力下演化形成的最优策略,…

第一百三十四节 Java数据类型教程 - Java int数据类型

Java数据类型教程 - Java int数据类型 int数据类型是32位有符号Java原语数据类型。 int数据类型的变量需要32位内存。 其有效范围为-2,147,483,648至2,147,483,647(-231至231 - 1)。 此范围中的所有整数称为整数字面量。 例如,10&#xf…

Eclipse 悬浮提示:提升编程效率的利器

Eclipse 悬浮提示:提升编程效率的利器 引言 对于广大开发者而言,Eclipse 是一款功能强大的集成开发环境(IDE)。它不仅支持多种编程语言,还提供了丰富的插件和工具,以帮助开发者提高编程效率和代码质量。在本文中,我们将重点探讨 Eclipse 中的一个实用功能——悬浮提示…

刷算法Leetcode---7(二叉树篇)(前中后序遍历)

前言 本文是跟着代码随想录的栈与队列顺序进行刷题并编写的 代码随想录 好久没刷算法了,最近又开始继续刷,果然还是要坚持。 二叉树的题目比之前多了好多,就多分几次写啦~ 这是力扣刷算法的其他文章链接:刷算法Leetcode文章汇总 …

PyTorch读写模型(state_dict、torch.save、torch.load)

1. state_dict 在PyTorch中,state_dict 是一个简单的python的字典对象,将每一层与它的对应参数建立映射关系。(如model的每一层的weights及bias等) 首先,我们来定义一个MLP模型: import torch.nn as nnclass MLP(nn.Module):de…

494. 目标和 Medium

给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums [2, 1] ,可以在 2 之前添加 ,在 1 之前添加 - ,然…