《一本书讲透Elasticsearch:原理、进阶与工程实践》读书笔记

1:es的组成部分:

Elasticsearch 引擎:核心组件,处理索引和搜索请求

Kibana:es的可视化的数据界面,用于分析和展示数据

Beats(可选)轻量级的日志采集器

2:基本概念

es开源的分布式搜索(分布式架构)引擎,常用于全文搜索、大数据搜索等场景

index 索引:索引是一个逻辑结构,可以看作是数据库中的表,用于存储和管理文档。每个索引都有一个名称,并且可以配置映射、分片等属性。

document 文档:文档是存储在索引中的基本单位。它是一个 JSON 格式的数据对象,可以看作是数据库中的一行记录。

Field 字段:字段是文档中的数据项,相当于数据库表中的列。每个字段都有一个名称和值

shard 分片:分片是索引的基本组成部分,每个索引都可以被分割成多个分片。每个分片是一个独立的 Lucene 索引,可以在集群中的不同节点上分布存储。

replica 副本:副本是分片的副本,用于提高数据的可靠性和查询的负载均衡(如果某主分片1出了问题,对应的副本分片1会提升为主分片,保证集群的高可用。)

mapping映射:映射定义了索引中每个字段的数据类型及其属性(定义age字段为integer类型)

type 类型(7.0之前的):在一个索引中,可以有多个类型,每个类型可以有自己的映射

3:倒排索引

倒排索引

是一种用于全文检索的索引结构;创建倒排索引是对正向索引的一种特殊处理,流程: 将每一个文档的数据利用算法分词,得到一个个词条 ,创建索引(表),每行数据包括词条、词条所在文档id、位置等信息 ;

在查询的时候:

对搜索语句进行分词----》去词条列表查询文档id----〉根据文档id查询文档---》存入结果集

根据词条搜索、模糊搜索时,速度非常快

上表中部分倒排索引表:

4:DocValues的作用

倒排索引在做聚合操作,如排序分组的时候,如果排序的数量大容易找成内存溢出和性能缓慢

DocValues 就是 es 在构建倒排索引的同时,构建了正排索引,从而实现根据指定字段进行排序和聚合的功能,排序高效,快速的聚合计算,节省内存

默认开启: Elasticsearch 默认启用 DocValues,对于大多数字段类型(如数值、日期和关键字字段),都会使用 DocValues

文本字段: 对于 text 类型字段,DocValues 并不会存储其分词后的值,因为这些字段主要用于全文检索。对于 text 字段,通常会使用 DocValueskeyword 子字段来支持排序和聚合操作。

5:text 和 keyword类型的区别

es中两种常用的字段类型

两个的区别主要分词的区别:keyword 类型是不会分词的,直接根据字符串内容建立倒排索引,keyword类型的字段只能通过精确值搜索到;Text 类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建立倒排索引

6:停顿词过滤

停顿词可以看成是没有意义的词,比如“的”、“而”,这类词没有必要建立索引

7:query 和 filter

1)query: 查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;

(2)filter: 查询操作仅判断是否满足查询条件,不会计算任何分值,也不会关心返回的排序问题,同时,filter 查询的结果可以被缓存,提高性能。

8:ES 写数据的过程

  1. 客户端发起写请求

  2. 集群路由请求到合适的主分片(Primary Shard)

  3. 主分片执行写操作,生成倒排索引,并写入内存缓冲区和事务日志

  4. 主分片将数据同步到所有副本分片(Replica Shard)

  5. 客户端收到写操作的确认响应

  6. 后台进程定期将内存缓冲区数据刷入磁盘,事务日志清空

9:ES的更新和删除流程

因为es的数据是不可变的,这意味着在更新或删除数据时,并不会直接修改或删除原来的文档,而是使用“标记删除”和“追加更新”的方式来实现

(1)如果是删除操作,文档其实并没有真的被删除,而是在 .del 文件中被标记为 deleted 状态。该文档依然能匹配查询,但是会在结果中被过滤掉。

(2)如果是更新操作,就是将旧的document标识为 deleted 状态,然后创建一个新的 doc。

数据的写入 每 refresh 一次,就会产生一个 segment 文件 ,所以默认情况下是 1s 生成一个 segment 文件,然后定期执行 merge。

每次 merge 的时候,会将多个 segment 文件合并成一个,同时这里会将标识为 deleted 的 doc 给物理删除掉,然后将新的 segment 文件写入磁盘

10:ES的搜索流程

搜索过程被分为两个阶段:

1:查询阶段(Query)

查询请求分发到分片

每个分片执行查询:每个分片会在其本地执行查询,利用倒排索引查找符合条件的文档,并为每个匹配的文档计算相关性评分

返回最相关的文档 ID 和评分

主要是为了找到哪些文档符合查询条件,并计算每个文档的相关性评分,但不涉及文档的具体内容。

2:获取阶段(Fetch)

协调节点汇总查询结果

请求文档内容

返回最终结果

获取在 Query Phase 中确定的文档的实际内容,协调节点负责从各个分片中提取这些文档的具体数据。最终结果会按相关性排序,并返回给客户端。

11:ES在高并发下保证读写一致性

1)对于更新操作

通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖

每个文档都有一个_version 版本号,这个版本号在文档被改变时加一。Elasticsearch使用这个 _version 保证所有修改都被正确排序。当一个旧版本出现在新版本之后,它会被简单的忽略。

利用_version的这一优点确保数据不会因为修改冲突而丢失。比如指定文档的version来做更改。如果那个版本号不是现在的,请求就失败了。

2)对于写操作

一致性级别支持 quorum/one/all,默认为 quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。

one: 要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行

all: 要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作

quorum: 默认的值,要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作

3)对于读操作

可以设置 replication (将数据从主分片复制到副本分片的过程)为 sync(默认同步),这使得操作在主分片和副本分片都完成后才会返回;如果设置replication 为 async(异步) 时,也可以通过设置搜索请求参数_preference 为 primary 来查询主分片,确保文档是最新版本。

12:es分布式原理

Elasticsearch 会对存储的数据进行切分,将数据划分到不同的分片上,同时每一个分片会保存多个副本,主要是为了保证分布式环境的高可用。在 Elasticsearch 中,节点是对等的,节点间会选取集群的 Master,由 Master 负责集群状态信息的改变,并同步给其他节点。

13:es写入性能会不会很低

只有建立索引和类型需要经过 Master,数据的写入有一个简单的 Routing 规则,可以路由到集群中的任意节点,所以数据写入压力是分散在整个集群的。

14:es 如何选举 Master

Elasticsearch 通过 Zen Discovery 机制选举 Master 节点,选举过程依赖于候选节点之间的相互发现和投票,确保集群有一个唯一的主节点来管理集群的状态。在集群中,minimum_master_nodes设置是防止脑裂的关键,确保只有获得多数支持的节点才能成为 Master。

15:es是如何避免脑裂现象

discovery.zen.minimum_master_nodes:这是防止脑裂的关键参数。脑裂现象可能导致不同的节点组分别选出自己的 Master 节点,从而导致数据不一致。通过设置 minimum_master_nodes,可以确保只有足够多的 Master 候选节点才可以参与选举。

16:ES的深度分页与滚动搜索scroll

深度分页其实就是搜索的深浅度,搜索得太深,就会造成性能问题,会耗费内存和占用cpu(第1页,第2页,第10页,第20页,是比较浅的;第10000页,第20000页就是很深了)

我们应该避免深度分页操作(限制分页页数),比如最多只能提供100页的展示,从第101页开始就没了,毕竟用户也不会搜的那么深。

滚动搜索:在查大量数据的时候会影响性能,这个时候可以使用滚动搜索,也就是 scroll;滚动搜索可以先查询出一些数据,然后再紧接着依次往下查询。

在第一次查询的时候会有一个滚动id,相当于一个锚标记 ,随后再次滚动搜索会需要上一次搜索滚动id,根据这个进行下一次的搜索请求。每次搜索都是基于一个历史的数据快照,查询数据的期间,如果有数据变更,那么和搜索是没有关系的。

17:列出与 es有关的主要可用字段数据类型

  1. text: 用于全文搜索的字符串。它被分析为词条或令牌,以便进行搜索和聚合操作。

  2. keyword: 用于精确值匹配的字符串,不会被分析。通常用于过滤、排序和聚合操作。

  3. date: 用于日期和时间的字段,可以指定不同的格式。

  4. boolean: 用于存储布尔值(true 或 false)。

  5. integerlong: 用于存储整数。

  6. floatdouble: 用于存储浮点数。

18:es的 NRT

NRT(Near Real-Time, 近实时)

指 Elasticsearch 在索引数据和查询数据之间的延迟非常短,但不是完全实时的。这种近实时性意味着,当数据被写入 Elasticsearch 后,可能需要几秒钟才能在搜索结果中查询到,在性能与实时性之间的平衡

Elasticsearch 的 NRT 特性依赖于底层的 Lucene 引擎。Lucene 的写入操作和搜索操作是分离的

文档写入缓冲区,刷新操作:Elasticsearch 默认每隔 1 秒会进行一次自动刷新操作,将内存缓冲区中的数据刷新到一个新的 segment(段) 中,并将其写入磁盘。

优点:

高效的写入性能:通过先将数据缓存在内存中,Elasticsearch 可以非常高效地进行批量写入操作。

查询的快速响应:即使是近实时的模式,Elasticsearch 的数据可见性延迟很短,通常在 1 秒以内,对于大多数应用场景来说已经足够实时。

缺点
  • 数据延迟:虽然是“近实时”,但并非完全实时。写入的数据在刷新的间隔期内是不可见的。

  • 增加的系统开销:频繁的刷新操作会增加 I/O 开销,因为每次刷新都会生成新的段文件并需要进行磁盘写操作。

19:精准匹配检索和全文检索

精确匹配用于:是否完全一致(生份证之类的)

  • 全文检索用于:是否相关?

es支持精确匹配和全文检索匹配

20:es 中的相关性和得分

搜索apple:水果,苹果公司

ES 会将相关的内容都返回给你,只是:计算得出的评分高的排在前面,评分低的排在后面。

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

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

相关文章

[React 进阶系列] 组合组件 复合组件

[React 进阶系列] 组合组件 & 复合组件 今天写个人项目练手的时候搜到了一个比价有趣的实现,于是用了一下,发现这个 concept 不是特别的熟,于是上网找了下,返现了一个叫 复合组件(compound components) 的概念。搜索了一下后…

HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库(Database)是一个以特定方式组织、存储和管理数据的集合,通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库,还通过一定的…

用HTML和CSS生成炫光动画卡片

这个效果结合了渐变、旋转和悬浮效果的炫酷动画示例&#xff0c;使用HTML和CSS实现。 一、效果 二、实现 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&quo…

蓝桥杯第10届 后缀表达式

题目描述 给定 N 个加号、M 个减号以及 NM1 个整数 A1,A2,⋅⋅⋅,ANM1​&#xff0c;小明想知道在所有由这N 个加号、M 个减号以及 NM1 个整数凑出的合法的 后缀表达式中&#xff0c;结果最大的是哪一个&#xff1f; 请你输出这个最大的结果。 例如使用 1 2 3 -&#xff0c…

常见框架漏洞攻略-ThinkPHP篇

漏洞名称&#xff1a;Thinkphp5x远程命令执行及getshell 第一步&#xff1a;开启靶场 第二步&#xff1a;准备工具 第三步&#xff1a;启动工具&#xff0c;进行漏洞检测 #存在漏洞 1.目标存在tp5_invoke_func_code_exec_1漏洞2.目标存在tp5_dbinfo_leak漏洞payload:http://47…

sql长时间卡在gc current request事件

问题描述 凌晨跑批出现超时。SQL f0ng33agbpzhs业务需要执行160w次左右。现场人员杀掉该sql&#xff0c;重新发起业务&#xff0c;业务批次成功跑完。 问题分析 总体sql分析 分析对比sql的awrsqrpt&#xff0c;对比昨天3月8日的。 总体执行次数没有变化。Cpu时间、物理读等均…

MOSN(Modular Open Smart Network)-04-TLS 安全链路

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN&#xff08;Modular O…

使用 Python 开发 MCP Server 及 Inspector 工具详解

使用 Python 开发 MCP Server 及 Inspector 工具详解 前言 模型上下文协议 (Model Context Protocol, MCP) 是一种新兴的协议&#xff0c;旨在让大型语言模型 (LLM) 更容易地与外部工具和服务集成。本文将介绍如何使用 Python 开发一个 MCP Server&#xff0c;并详细讲解如何使…

深入剖析 IS - IS 路由协议的原理、配置及与 OSPF 的对比

目录 ISIS概述 NSAP&#xff08;类似于IP地址&#xff09; NET NET配置举例 IS-IS 和OSPF区域划分的区别 区域和区域的分界点 IS-IS路由器的分类 Level-1路由器 Level-2路由器 Level-1-2路由器 ISIS支持的网络类型 ISIS开销值 IS-IS报文格式 IS-IS报文类型概述…

【deepseek 学c++】weakptr引用场景

std::weak_ptr 是 C 中与 std::shared_ptr 配合使用的智能指针&#xff0c;它本身不拥有资源的所有权&#xff0c;仅观察资源的状态&#xff0c;主要用于解决 shared_ptr 的循环引用问题和临时访问共享资源的需求。以下是 weak_ptr 的典型应用场景和核心价值&#xff1a;![ 为…

23种设计模式-适配器(Adapter)设计模式

适配器设计模式 &#x1f6a9;什么是适配器设计模式&#xff1f;&#x1f6a9;适配器设计模式的特点&#x1f6a9;适配器设计模式的结构&#x1f6a9;适配器设计模式的优缺点&#x1f6a9;适配器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

R语言对偏态换数据进行转换(对数、平方根、立方根)

我们进行研究的时候经常会遇见偏态数据&#xff0c;数据转换是统计分析和数据预处理中的一项基本技术。使用 R 时&#xff0c;了解如何正确转换数据有助于满足统计假设、标准化分布并提高分析的准确性。在 R 中实现和可视化最常见的数据转换&#xff1a;对数、平方根和立方根转…

REC一些操作解法

一.Linux命令长度突破 1.源码如下 <?php $param $_REQUEST[param];if ( strlen($param) < 8 ) {echo shell_exec($param); } 2.源码分析 echo执行函数&#xff0c;$_REQUEST可以接post、get、cookie传参 3.破题思路 源码中对参数长度做了限制&#xff0c;小于8位&a…

16个气象数据可视化网站整理分享

好的&#xff01;以下是关于“16个气象数据可视化网站整理分享”的软文&#xff1a; 16个气象数据可视化网站整理分享 气象数据可视化已成为现代气象研究、决策支持以及公众天气服务的重要组成部分。从天气预报到气候变化监测&#xff0c;全球许多气象数据可视化平台为专业人士…

Stereolabs ZED Box Mini:机器人与自动化领域的人工智能视觉新选择

在人工智能视觉技术快速发展的今天&#xff0c;其应用场景正在持续拓宽&#xff0c;从智能安防到工业自动化&#xff0c;从机器人技术到智能交通&#xff0c;各领域都在积极探索如何利用这一先进技术。而 Stereolabs 推出的ZED Box Mini&#xff0c;正是一款专为满足这些多样化…

LeetCode热题100|128.最长连续序列,283.移动零

128.最长连续序列 题目链接&#xff1a;128. 最长连续序列 - 力扣&#xff08;LeetCode&#xff09; 这里要求的一个乱序的数组里连续数字的个数&#xff0c;比如【100 &#xff0c;4&#xff0c;200&#xff0c;1&#xff0c;3&#xff0c;2】 里面连续的数字就是【1&#…

Unity-RectTransform设置UI width

不知道有没人需要这样的代码&#xff0c;就是.sizeDelta //不确定是不是英文翻译的原因&#xff0c;基本很难理解&#xff0c;sizeDeltaSize&#xff0c;//未必完全正确&#xff0c;但这么写好像总没错过 //image 在一个UnityEngine.UI.Image 的数组内foreach (var image in l…

GZCTF平台搭建及题目上传

前言 我用手里的Ubuntu虚拟机搭建的&#xff0c;大家根据自己的实际情况来吧 安装及部署 首先&#xff0c;你的虚拟机需要有Docker和Docker-Compose&#xff0c;前者可以看我之前的文章&#xff0c;另外一个可以输入下面的命令安装&#xff0c;注意先获取管理员权限&#xff…

记录Jmeter 利用BeanShell 脚本解析JSON字符串

下载org.json包(文档说明) #下载地址 https://www.json.org/ # github 地址 https://github.com/stleary/JSON-java # api 文档说明 https://resources.arcgis.com/en/help/arcobjects-java/api/arcobjects/com/esri/arcgis/server/json/JSONObject.htmlBeanShell脚本 import…

在Centos 7环境下安装MySQL

前言&#xff1a;在安装与卸载MySQL时&#xff0c;用户需切换为root&#xff0c;这样安装之后&#xff0c;普通用户也能够使用。 Tips:我们在刚开始学习时&#xff0c;尽量全部使用root进行&#xff0c;适应mysql语句&#xff0c;后面学了用户管理&#xff0c;就可以考虑新建普…