目录

常见原理

ES从使用到原理.pdf

ES从使用到原理

es基本概念

ES一条请求的链路

Elasticsearch 7.3常用的字段类型

es常用查询curl

架构

查询

  • 当客户端应用发起搜索请求,请求会先发到集群中的协调节点。
  • 协调节点根据 index name 的信息,可以了解到 index name 被分为了几个 分片,以及这些分片 分散哪个数据节点上,将请求转发到这些数据节点的 分片 上面。
  • 搜索请求到达分片后,分片 底层的 lucene 库会并发搜索多个 segment,利用每个 segment 内部的倒排索引获取到对应文档 id,并结合 doc values 获得排序信息。分片将结果聚合返回给协调节点。
  • 协调节点对多个分片中拿到的数据进行一次排序聚合,舍弃大部分不需要的数据

  • 协调节点再次拿着文档 id 请求数据节点里的 分片,分片 底层的 lucene 库会从 segment 内的 Stored Fields 中取出完整文档内容,并返回给协调节点。
  • 协调节点最终将数据结果返回给客户端。完成整个搜索过程。

数据建模(快速版)

segment基本组成(快速版)

倒排索引用于搜索,Term Index 用于加速搜索,Stored Fields 用于存放文档的原始信息,以及 Doc Values 用于排序和聚合。这些结构共同组成了一个复合文件,也就是所谓的"segment", 它是一个具备完整搜索功能的最小单元

倒排索引(Inverted Index) ​

分词后的每部分,我们称为一个词项,也就是 term。记录词项和文本 id 的关系

词项按字典序从小到大排序,查找可以进行二分,即Term Dictionary

前缀索引**(Term Index)**

Term Dictionary 数据量很大,放内存并不现实,因此必须放在磁盘中。但查询磁盘是个较慢的过程。

将 Term Dictionary 的部分词项提取出来,用这些 词项 的前缀信息,构建出一个精简的目录树

目录树的节点中存放这些词项在磁盘中的偏移量,也就是指向磁盘中的位置。这个目录树结构,体积小,适合放内存中,它就是所谓的 Term Index。可以用它来加速搜索

行式存储(Stored Fields)

倒排索引,搜索到的是文档 id,我们还需要拿着这个 id 找到文档内容本身,才能返回给用户。
因此还需要有个地方,存放完整的文档内容,它就是 Stored Fields(行式存储)

(Doc Values)

有了 id,我们就能从 Stored Fields 中取出文档内容。

再构造一个列式存储结构,将散落在各个文档的某个字段,集中存放,当我们想对某个字段排序的时候,就只需要将这些集中存放的字段一次性读取出来,就能做到针对性地进行排序。这个列式存储结构,就是所谓的 Doc Values

segment合并

段合并知识点整理

分词

ES分词导致数据检索不到

filter与query区别

Elasticsearch不支持的场景