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

【数据库】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来查询主分片,确保文档是最新版本。


http://www.kler.cn/a/382375.html

相关文章:

  • Redis 持久化机制详解
  • 抢单人机交互「新红利」!哪些细分赛道“多金”?
  • 怎么实现柔性动态自适应IVR功能
  • JVM系列(十二) -常用调优命令汇总
  • Nuc9 Truenas 和 Macmini4组雷电网桥 上传速度异常 1Mbp/s 解决
  • Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络
  • 前端_安裝 json server
  • 记录新建wordpress站的实践踩坑:wordpress 上传源码新建站因权限问题导致无法访问、配置新站建站向导以及插件主题上传配置的解决办法
  • 【LeetCode】【算法】139. 单词拆分
  • 推荐一款非常好用的C/C++在线编译器
  • asp.net+uniapp养老助餐管理系统 微信小程序
  • JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
  • webworker
  • 如何使用uniswap v2 获取两个代币的交易对池子
  • 实习冲刺Day15
  • golang学习3
  • leetcode206. Reverse Linked List
  • 理解 Transformer 中的编码器-解码器注意力层(Encoder-Decoder Attention Layer)
  • 【测试语言篇一】Python进阶篇:内置容器数据类型
  • 24年配置CUDA12.4,Pytorch2.5.1,CUDAnn9.5运行环境
  • 【C++】踏上C++学习之旅(五):auto、范围for以及nullptr的精彩时刻(C++11)
  • 【LeetCode热题100】哈希表
  • 【大模型LLM面试合集】大语言模型架构_bert细节
  • [ DOS 命令基础 3 ] DOS 命令详解-文件操作相关命令
  • 三周精通FastAPI:27 使用使用SQLModel操作SQL (关系型) 数据库
  • 视图-数据库sqlserver