【数据库】elasticsearch

1、架构

 

es会为每个索引创建一定数量的主分片和副本分片。

分片(Shard):

将索引数据分割成多个部分,每个部分都是一个独立的索引。
主要目的是实现数据的分布式存储和并行处理,从而提高系统的扩展性和性能。
在创建索引时,可以指定主分片的数量,一旦索引创建完成,主分片的数量就不能再更改。每个主分片负责存储索引数据的一部分,并可以独立地处理搜索请求。
副本(Replica):
副本是主分片的完全复制,用于提供数据的冗余备份,增强数据的可用性和容错能力。
每个主分片可以有零个或多个副本分片。
副本分片与主分片分布在不同的节点上,当主分片所在的节点出现故障时,副本分片可以接管主分片的工作,确保服务的连续性。
此外,副本分片还可以用于提高搜索性能,因为搜索请求可以并行地在多个副本分片上执行。

此外,副本分片还可以用于提高搜索性能,因为搜索请求可以并行地在多个副本分片上执行。


2、存储


数据按照mapping序列化为json存储
倒排索引:相反于k-v结构,它从词(value)出发,记载了这个词在哪些文档中出现过


3、基本概念


mapping:相当于数据库定义、字段定义
index索引:相当于数据库
type类型:数据类型
document文档:一条数据
field:一个字段
shard:分片,多节点存储
replia:副本,用于故障恢复
分析器:预设分析器、自定义分析器


4、字段类型


keyword(关键词类型):用于精确匹配,不会分词,es直接根据keyword构建倒排索引,一般与term结合使用
text(文本类型):用于全文搜索,会被分词器处理,生成多个词条,支持模糊匹配
Numeric(数值类型):integer/long/short/byte/double/float
Date(日期类型):用于存储日期和时间数据,支持范围查询、日期格式化和日期计算等
Boolean(布尔类型)
Object(对象类型):用于存储复杂结构的数据,可以嵌套其他字段。
Nested(嵌套类型):用于存储对象数组,允许对数组中的每个对象进行独立的搜索。
IP:用于存储IPv4或IPv6地址,不会分词


5、查询方式


term精确查询:效率高,不会分词
match匹配查询:会分词,适用于text类型的字段
phrase短语查询:会分词,要求这些分词在文档中的顺序和间隔与查询短语一致,适用于保持短语顺序的搜索
wildcard通配符模糊查询:*?,性能低于phrase
fuzzy拼写错误模糊查询
prefix前缀查询
range范围查询
bool查询
nested嵌套查询:性能低于精确查询


6、搜索过程


query:定位到位置,但不取
请求打到每个shard,每个shard在本地搜索,并返回一个优先队列,包含docId, 打分值
返回队列数据给协调节点
协调节点进行数据合并、排序、分页
fetch:取数据
协调节点根据query结果,去各分片上查询docId的实际document内容,返回


7、索引优化


查询方面:
禁用wildcard通配符查询:会扫描大量文档,用高性能的term或phrase代替
对需要分词的字段,合理的设置分词器:中文分词,大小写等
充分利用倒排索引机制:对于需要精确匹配的字段,尽量用keyword(text会被分词器处理,适用于全文搜索)
减少动态索引:索引如果是基于时间动态生成,会越来越多
存储与部署:
冷热分离:热数据(如最近一周的数据),其余为冷数据。 对于冷数据不会再写入新数据
增加sharding


8、更新和删除过程


删除和更新都是写操作,但是Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更。

磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。

在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。

9、 大数据量(上亿量级)的聚合如何实现?

Elasticsearch 提供的首个近似聚合是cardinality 度量。

它提供一个字段的基数,即该字段的distinct或者unique值的数目。它是基于HLL算法的。HLL 会先对我们的输入作哈希运算,然后根据哈希运算的结果中的 bits 做概率估算从而得到基数。

其特点是:可配置的精度,用来控制内存的使用(更精确 = 更多内存);小的数据集精度是非常高的;我们可以通过配置参数,来设置去重需要的固定内存使用量。

无论数千还是数十亿的唯一值,内存使用量只与你配置的精确度相关。

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


可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C6.【C++ Cont】cout的格式输出

目录 1.头文件 2.使用 1.控制宽度和填充 setw函数(全称set field width设置字段宽度) setfill函数(全称Set fill character设置填充字符) 2.控制数值格式 3.控制整数格式 4.控制对齐方式 1.头文件 用cout进行格式化输出前,先引用头文件iomanip(全称input&output m…

【Unity】Unity拖拽在Android设备有延迟和卡顿问题的解决

一、介绍 在制作Block类游戏时,其核心的逻辑就是拖拽方块放入到地图中,这里最先想到的就是Unity的拖拽接口IDragHandler,然后通过 IPointerDownHandler, IPointerUpHandler 这两个接口判断按下和松手,具体的实现逻辑就是下面 public void On…

零基础快速入门MATLAB

文章目录 前言1.向量1.1 创建方式1.1.1 直接输入各个元素1.1.2 冒号创建1.1.3 使用linspace函数 1.2 向量的运算1.2.1 加法1.2.2 相乘 2.输入与输出2.1 输入函数--input()2.2 输出函数 3.分支结构3.1 if语句3.2 switch语句 4.循环结构4.1 for循环4.2 while循环4.3 特殊语句 5.函…

gitmakegdb

git git reset 命令 | 菜鸟教程 (runoob.com) 像嫁接一样 make Makefile | 爱编程的大丙 (subingwen.cn) # 举例: 有源文件 a.c b.c c.c head.h, 需要生成可执行程序 app ################# 例1 ################# app:a.c b.c c.cgcc a.c b.c c.c -o app################# 例…

记一次微信云托管搭建Redis服务

背景 最近在做一个微信小程序,规划服务全部部署在云托管上面,本次使用了对象存储、mysql、java服务、Redis服务(pc端用的)。 由于对部署Redis不理解,查看了官方文档,首先看到的是这个架构图,看…

gerrit 搭建遇到的问题

1、启动Apache,端口被占用 : AH00072: make sock: could not bind to address (0S 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: AH00072: make sock: could not bind to address 0.0.0.:443 a AH00451: no listening sockets available, shutti…

STM32之看门狗

STM32有独立看门狗(IWDG)和窗口看门狗(WWDG)。 采用窗口看门狗(WWDG),有一个死前中断,可以用来作一个报警的功能。 独立看门狗超时时间计算公式 假设LSI是32KHz,超时时间等于 预分频系数(4&…

Python爬虫基础-正则表达式!

前言 正则表达式是对字符串的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则的字符串”,此字符串用来表示对字符串的一种“过滤”逻辑。正在在很多开发语言中都存在,而非python独有。对其知识点…

lvgl白屏问题(LCD长时间白屏)和优化lvgl

开机白屏时间过长 -- 这里我们不考虑是lvgl占的内存太大的问题,这里考虑的是为什么lcd屏幕启动后会有长时间的白屏。 首先我们要了解lvgl的相关操作,主要集中在一个函数中。只有程序执行到了这个函数,lvgl的屏幕才会显现出来 总结来说就是l…

雷池社区版 7.1.0 LTS 发布了

LTS(Long Term Support,长期支持版本)是软件开发中的一个概念,表示该版本将获得较长时间的支持和更新,通常包含稳定性、性能改进和安全修复,但不包含频繁的新特性更新。 作为最受欢迎的社区waf&#xff0c…

【系统分析师】-案例综合知识大全

1、表示处理流程的工具 图形工具、表格工具和语言工具。 其中常见的图形工具包括程序流程图、IPO 图、盒图、问题分析图、判定树, 表格工具包括判定表, 语言工具包括过程设计语言 2、用例建模过程 识别参与者、合并需求获得用例、细化用例描述和调…

python爬取旅游攻略(1)

参考网址: https://blog.csdn.net/m0_61981943/article/details/131262987 导入相关库,用get请求方式请求网页方式: import requests import parsel import csv import time import random url fhttps://travel.qunar.com/travelbook/list.…

G. Welcome to Join the Online Meeting!【CCPC2024哈尔滨站】

G. Welcome to Join the Online Meeting 思路: 挺简单的BFS思路 图论题写的比较少&#xff0c;算是补题吧 代码: #include <bits/stdc.h> #define endl \n #define int long long #define pb push_back #define pii pair<int,int> const int MOD 1e97; const …

《图像滤波算法综述》

一、引言 在数字图像处理的世界里&#xff0c;滤波是一项关键技术。通过对图像应用滤波算法&#xff0c;可以有效去除噪声、增强图像的细节并显著提升图像质量。本篇内容将为您深入介绍几种常见的图像滤波算法及其原理和应用场景。 二、图像滤波算法的分类 图像滤波算法可以…

RK3568开发板静态IP地址配置

1. 连接SSH MYD-LR3568 开发板设置了静态 eth0:1 192.168.0.10 和 eth1:1 192.168.1.10&#xff0c;在没有串口时调试开发板&#xff0c;可以用工具 SSH 登陆到开发板。 首先需要用一根网线直连电脑和开发板&#xff0c;或者通过路由器连接到开发板&#xff0c;将电脑 IP 手动设…

(蓝桥杯C/C++)——基础算法(上)

目录 一、二分法 1.二分法简介 二分法简介-解题步骤 2.整数二分-简介 整数二分-模板 3.浮点二分-简介 浮点二分-模板 4.二分答案-简介 二分答案-模板​​​​​​​ 二、位运算 1.位运算简介 2.常见的位运算 按位与AND(&) 按位或OR( | ) 按位异或…

【RAG系列】KG-RAG 用最简单的方式将知识图谱引入RAG

目录 前言 一、引入知识图谱的作用 二、引入知识图谱的挑战 三、KG-RAG的理论 query多跳有限性 知识局部密集性 四、KG-RAG的方法 向量入库 向量相似搜索 扩展子图 LLM Rerank LLM response 五、效果比对 六、源码 总结 前言 本文介绍一种比较新颖的RAG范式&am…

6.《双指针篇》---⑥和为S的两个数字(中等但简单)(牛客)

题目传送门 方法一&#xff1a;暴力解法。双循环 方法二&#xff1a;双指针&#xff08;推荐&#xff09; 1.定义一个顺序表&#xff0c;定义左右双指针 2.while循环。判断array[left] array[right] 的值。 3.若等于则将这两个值加入数组。并break 4.若大于则right-- 5.若小于…

【学术论文投稿】Python网络爬虫全攻略:从零到一,打造你的数据收集利器

【IEEE出版 | 中国石油大学&#xff08;华东&#xff09;主办】第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 什么是网络爬虫&#xff1f; Python网络爬虫的…

LWIP通信协议UDP发送、接收源码解析

1.UDP发送函数比较简短&#xff0c;带操作系统和裸机一样。以下是udp_sendto源码解析&#xff1b; 2.LWIP源码UDP接收数据 2.1.UDP带操作系统接收数据&#xff0c;以下是源码解析&#xff1b; 2.2.UDP裸机接收数据&#xff0c;以下是源码解析