当前位置: 首页 > article >正文

《一本书讲透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 会将相关的内容都返回给你,只是:计算得出的评分高的排在前面,评分低的排在后面。

相关文章:

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

1:es的组成部分: Elasticsearch 引擎:核心组件,处理索引和搜索请求 Kibana:es的可视化的数据界面,用于分析和展示数据 Beats(可选)轻量级的日志采集器 2:基本概念 es开…...

Android15查看函数调用关系

Android15 Camera3中打印函数调用栈 1.使用CallStack跟踪函数调用 修改涉及三个内容: Android.bp中添加对CallStack的引用。CallStack被打包在libutilscallstack.so。代码中包含CallStack的头文件。代码中调用CallStack接口,打印函数调用栈。 例子&am…...

Spring Boot(十七):集成和使用Redis

Redis(Remote Dictionary Server,远程字典服务器)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Spring Boot 中集成和使用Redis主要涉及以下几个步骤: 添加依赖 在项目的pom.xml文件中添加Redis的依赖。Spring Boot提供了对Redis的集…...

macOS 15 通过 MacPorts 安装 PHP 7 构建错误找不到符号在 dns.o 中解决方法

构建遇到的问题如下: "_res_9_dn_expand", referenced from:_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_zif_dns_get_mx in dns.o..."_res_9_dn_skipname&…...

练习:猜数字小游戏

需求: 程序自动生成一个 1 - 100 之间的随机数字,使用程序实现猜出这个数字是多少? 代码: //猜数字小游戏 package demo01; import java.util.Random; import java.util.Scanner; public class HelloJava {public static void …...

EMQX Dashboard

EMQX Dashboard EMQX理论基础 https://blog.csdn.net/liudachu/article/details/146495030 1 Dashboard简介 EMQX 提供了一个内置的管理控制台,即 EMQX Dashboard。方便用户通过 Web 页面就能轻松管理和监控 EMQX 集群,并配置和使用所需的各项功能。 访…...

PC名词解释-笔记本的S0,S1,S2,S3,S4,S5状态

​🎓作者简介:程序员转项目管理领域优质创作者 💌个人邮箱:[2707492172qq.com] 🌐PMP资料导航:PM菜鸟(查阅PMP大纲考点) 💡座右铭:上善若水,水善利…...

uniapp自定义目录tree(支持多选、单选、父子联动、全选、取消、目录树过滤、异步懒加载节点、v-model)vue版本

先看案例: 效果: 数据结构如下: const themeList ref([{id: 1,name: 内蒙古,children: [{id: 3,name: 街道1,children: [{id: 4,name: 小区1}]}]},{id: 2,name: 北京,children: [{id: 6,name: 街道2}]} ]) 参数配置: 属性名类…...

【10】Strongswan collections —— array

//array 代码解释与测试 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <stdarg.h>#define INIT(this, ...) ({ (this) malloc(sizeof(*(this))); \*(this) (typeof…...

ESP32S3 WIFI 实现TCP服务器和静态IP

一、 TCP服务器代码 代码由station_example_main的官方例程修改 /* WiFi station ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an &q…...

docker中安装 python

ubuntu 1、安装源码编译所需依赖 apt-get install -y gcc g make cmake libsqlite3-dev zlib1g-dev libssl-dev libffi-dev 2、下载python安装包 python-release安装包下载_开源镜像站-阿里云 3、解压安装 tar -zxvf Python-3.7.5.tgz cd Python-3.7.5 ./configure --prefix…...

VSCode Flutter 快捷键

扩展安装&#xff1a; Flutter Widget Snippets Flutter Flutter Files 1.StatelessWidget切换StatefulWidget快捷键 1.1 将光标放在 StatelessWidget 上。 1.2 按下快捷键&#xff1a; Windows/Linux: Ctrl . macOS: Cmd . 1.3 在弹出的菜单中选择 "Convert to Stat…...

Java面试黄金宝典18

1. 如何找到一条单链表的中间结点 定义 单链表是一种常见的数据结构&#xff0c;每个节点包含数据和指向下一个节点的指针。找到单链表的中间结点&#xff0c;即找出链表中位于中间位置的节点。可借助快慢指针法达成&#xff0c;快指针每次移动两步&#xff0c;慢指针每次移动…...

设计秒杀系统(高并发的分布式系统)

学海无涯&#xff0c;志当存远。燃心砺志&#xff0c;奋进不辍。 愿诸君得此鸡汤&#xff0c;如沐春风&#xff0c;事业有成。 若觉此言甚善&#xff0c;烦请赐赞一枚&#xff0c;共励学途&#xff0c;同铸辉煌&#xff01; 思路 处理高并发 流量削峰&#xff1a;限流&#xf…...

【面试题】利用Promise实现Websocket阻塞式await wsRequest() 请求

逻辑实现过程 1. 目标与基础设计 目标&#xff1a;实现一个类似 HTTP 请求的阻塞式调用接口&#xff08;如 await wsRequest(...)&#xff09;&#xff0c;让开发者无需手动处理 WebSocket 的事件回调&#xff0c;而是通过 Promise 和 async/await 获得同步体验。 基础设计&a…...

数据库----单表、多表

数据库 create database 数据库名称;---创建数据库create database 数据库名称 default charsetutf8mb4;---创建数据库&#xff0c;同时指定编码show databases;---查看当前数据库管理下存在多少数据库show databases like "db_%";---查询以db_开头的数据库select d…...

ubuntu 22.04 一键安装 lxd

LXD系列 LXD是一个现代、安全且功能强大的系统容器和虚拟机管理器。 它为在容器或虚拟机中运行和管理完整的 Linux 系统提供了统一的体验。LXD 支持大量 Linux 发行版的映像(官方 Ubuntu 映像和社区提供的映像),并且围绕...

HO与OH差异之Navigation三

在上一篇内容中我们介绍了HO与OH差异之Navigator&#xff0c;我们也了解了Navigator的基本概念和大致了解了一下他的基础用法&#xff0c;既然谈到差异肯定就不止这两种差异&#xff0c;今天就让我们来了解第三种差异NavRouter&#xff0c;其中在HO中我们并没有这种路由方式但是…...

Zookeeper运维指南:服务端与客户端常用命令详解

#作者&#xff1a;任少近 文章目录 1 Zookeeper服务端常用命令2 Zookeeper客户端常用命令2.1Ls命令2.2创建节点create2.3Get命令2.4删除命令2.5修改命令 1 Zookeeper服务端常用命令 启动ZK服务: bin/zkServer.sh start # ./zkServer.sh startZooKeeper JMX enabled by defau…...

linux scp复制多层级文件夹到另一服务器免密及脚本配置

文章目录 生成 SSH 密钥对将公钥复制到目标服务器验证免密登录scp 多级文件夹复制脚本 生成 SSH 密钥对 在本地机器上&#xff0c;使用 ssh-keygen 命令生成 SSH 密钥对。打开终端并执行以下命令&#xff1a; ssh-keygen -t rsa 按提示连续按回车键&#xff0c;默认会在 ~/.ss…...

模型压缩与迁移:基于蒸馏技术的实战教程

1.前言 模型蒸馏&#xff08;Model Distillation&#xff09;&#xff0c;又称为知识蒸馏&#xff08;Knowledge Distillation&#xff09;&#xff0c;是一种将大型、复杂的模型&#xff08;通常称为教师模型&#xff0c;Teacher Model&#xff09;的知识转移到小型、简单模型…...

XSS通关技巧

目录 第一关&#xff1a; 第二关&#xff1a; 第三关&#xff1a; 第四关&#xff1a; 第五关&#xff1a; 第六关&#xff1a; 第七关&#xff1a; 第八关&#xff1a; 第九关&#xff1a; 第十关&#xff1a; 第十一关&#xff1a; 第十二关&#xff1a; 第十三关&#xff1a…...

el-tree树多选,将选中的树对象中某个字段值改为true,并过滤出所有为true的对象,组成新的数组

功能实现&#xff1a; el-tree树多选&#xff0c;将选中的树对象中某个字段值改为true,并过滤出所有为true的对象&#xff0c;组成新的数组提交给后端 <template><div><!-- 树形菜单 --><el-tree:data"stageList"show-checkboxdefault-expand-…...

大文件版本管理git-lfs

1. 安装 Git Large File Storage (LFS) 是一个 开源的 Git 扩展&#xff0c;用于替换 Git 仓库中的大文件&#xff0c;用指针文件替代实际的大文件&#xff0c;可以在保持仓库轻量级的同时&#xff0c;有效地管理大型文件。 如果install提示失败&#xff0c;多试几次&#xf…...

Android RemoteViews:跨进程 UI 更新的奥秘与实践

目录 一、RemoteViews 的舞台:使用场景 (一)通知栏:动态交互的窗口 (二)桌面小部件:桌面上的动态名片 二、RemoteViews 的本质:定义与架构 (一)什么是 RemoteViews? (二)架构设计:层次分明的协作 (三)操作限制:能力边界在哪里? 三、RemoteViews 的引擎…...

es 3期 第27节-运用Script脚本实现复杂需求

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…...

玩转python: 掌握Python常用库之数据分析pandas

pandas是Python中最强大的数据处理和分析库之一&#xff0c;它提供了高效、灵活且易于使用的数据结构&#xff0c;使数据清洗、转换和分析变得简单直观。 1、pandas库简介 pandas由Wes McKinney于2008年开发&#xff0c;名称来源于"panel data"&#xff08;面板数据…...

融合YOLO11与行为树的人机协作智能框架:动态工效学优化与自适应安全决策

人工智能技术要真正发挥其价值&#xff0c;必须与生产生活深度融合&#xff0c;为产业发展和人类生活带来实际效益。近年来&#xff0c;基于深度学习的机器视觉技术在工业自动化领域取得了显著进展&#xff0c;其中YOLO&#xff08;You Only Look Once&#xff09;算法作为一种…...

Postgresql源码(142)子查询提升pull_up_sublinks

1 案例 drop table t_fun01; create table t_fun01 (image_id numeric primary key, content_id varchar(50), file_code varchar(20)); create index idx3 on t_fun01(content_id); create index idx4 on t_fun01(file_code); insert into t_fun01 select t.i, t.i%10, t.i%1…...

通过 ECNWP 洋流、海浪可视化开发的方法和架构

第一篇:ECNWP 洋流、海浪可视化开发方法 1. 数据获取与预处理 ECNWP(Eastern Central North Pacific)区域的洋流和海浪数据通常来源于 NOAA、EMC 等权威机构。数据包括流速、流向、波高、波向、周期等。 代码示例:数据下载与预处理 import pandas as pd import numpy as…...