【es学习】

发布于:2024-08-16 ⋅ 阅读:(128) ⋅ 点赞:(0)

1. 倒排索引

每条数据都是一个文档,对文档内容进行分词,得到多个词项term,构建term与文档id的索引表如下:
在这里插入图片描述

这种表格中,查找指定term时需要o(n)遍历,所以按照字典序排序,二分查找指定tern

词项叫作term dictionary,词项对应的列表叫作posting list,他们两个组成的结构就叫作倒排索引

在这里插入图片描述
term dictionary太多了,利用前缀树的思想进一步优化其存储、构建一颗目录树(目录树的节点存放这些词项在磁盘中的偏移量),体积小,可以放进内存中,这就是term index,加速了搜索:
在这里插入图片描述
这样可以通过term index快速获取词项在term dictionary中的大概位置,然后再通过少量检索定位到词项即可

2. stored fields 用于存储文档信息

到此为止实现了查找功能,但是我们现在拿到的是文档的id,需要将完整的文档返回给用户

这些文档就是存储在stored fields中,是个行式存储结构

3. doc values 用于排序和聚合

场景:用户需要对文档进行排序,原始做法是先筛选出符合条件的文档,再根据文档中的指定字段进行排序
doc values可以加速这个功能(空间换时间):将待排序的字段集中存放,需要用到的时候再重新排序。这种列式存储结构就是doc values

4. segment 具备完整搜索功能的最小单元

在这里插入图片描述

5. lucene单机文本搜索库

一批文档组成上面一个segment,新来的文档如果想加入,那么旧segment就要修改四个组件中的好多内容,太麻烦了
所以新来的一批文档会写入新的segment中

多个segment也会定期进行合并,这就构成了一个最简单的单机文本检索库 lucene

es就是在此基础上,提供了高性能、高可用

6. 从lucene到es:高性能 高扩展性 高可用

高性能

分为多个索引名,每个索引分shard,每个shard是一个独立的lucene库,将读写操作分到多个shard中去

高扩展性

不同shard分到多台机子上

在这里插入图片描述
高可用

给每个分片多加几个副本,分为primary shard & replica shard 主分片和副本分片,主分片同步数据给副本,副本提供读操作,主挂了它顶上

7. node角色分化

如果每个节点都具备这些能力,比较冗余
在这里插入图片描述
集群小或者压力不大的时候可以一个节点身兼数职

选主过程:去中心化
node之间互相同步数据,让所有node看到的集群数据状态都是一致的
这样集群中所有节点都能参与选主过程,也能知道集群中某个node是不是挂了

8. es写入流程

客户端请求过来发送到协调节点,协调节点通过hash路由判断数据应当写入到哪个数据节点里的哪个shard分片(注意是主分片),分片底层是lucene,所以这一步是写入到lucene中的segment内,将数据固化为倒排索引、stored fields、doc values等多种结构。
主分片写完后同步给副本分片,副本也写完后会响应给协调节点一个ack

9. es搜索流程

index name就是你的索引叫啥名

两个阶段:
1.query phrase

请求发到协调节点,协调节点根据index name信息查询有几个shard分片,这些shard分片分布在哪些节点上,将请求转发到这些node的shard上,到这里底层就是lucene了,lucene底层并发搜索多个segment,利用每个segment内部的倒排索引获取到文档id,并结合doc values获得排序信息。
分片将结果聚合返回(文档id)给协调节点,协调节点再聚合一次(文档id)

2.fetch phrase

协调节点再次拿着文档id请求数据节点中的shard,shard底层的lucene库会从segment中的stored fields中读取完整的文档信息并返回给协调节点,协调节点再返回给客户端

10. 倒排索引涉及的数据结构

参考

参考!!!

FOR:压缩posting list,用差分数组的思想降低存储所需空间 参考

RBM:参考

11. scroll

scroll使用:适合那种需要一次性或分批拉出大量数据做离线处理、迁移等。可以提升点效率。

设置scroll有效期,表示需要保持搜索的上下文环境多久

如果把 From + size 和 search_after 两种请求看做近实时的请求处理方式,那么 scroll 滚动遍历查询显然是非实时的。数据量大的时候,响应时间可能会比较长。

Scroll 和 PIT(Point in Time)是 Elasticsearch 中两个不同的概念,它们在一定程度上可以关联起来,但是有着不同的作用和用途。

scroll用于滚动搜索全量数据:参考

pit用于支持一段时间内的数据一致性,es7.10之后才支持:参考


网站公告

今日签到

点亮在社区的每一天
去签到