ElasticSearch

Posted by OwlDawn on Tuesday, November 7, 2023

基础概念

索引、文档、RestAPI

文档

Elasticsearch 是面向文档的,文档是所有可搜索数据的最小单位(对应到关系型数据库的一条记录)

文档会被序列化成 json 格式,保存在 Elasticsearch 中

  • json 对象由字段组成
  • 每个字段都有对应的字段类型(字符串、数值、布尔、日期、二进制、范围类型)

每个文档都有一个 unique ID

  • 指定
  • 自动生成

元数据,用于标注文档的相关信息

  • _index 文档所属的索引名
  • _type 文档所属的类型
  • _id 文档唯一 ID
  • _source 文档的原始 json 数据
  • _all 整合所有字段内容到该字段,已被废除
  • _version 文档的版本信息
  • _scorce 相关性打分

索引

(对应到关系型数据库的表)

Index 索引时文档的容器,是一类文档的结合

  • index 体现了逻辑空间的概念:每个索引都有自己的 Mapping 定义,用于定义包含的文档的字段名和字段类型
  • Shard 体现了物理空间的概念:索引中的数据分散在 Shard 上

索引的 Mapping 定义文档字段的类型,Setting 定义不同的数据分布

Mapping 对应关系型数据库的 scheme,表定义

Type

  • 在 7.0 之前,一个 Index 可以设置多个 Types
  • 6.0 开始 Type 已经被 Deprecated,7.0 开始,一个索引只能创建一个 Type,即 _doc

节点、集群、分片、副本

节点类型

Master-eligible nodes、Master node

  • 每个节点启动后,默认就是一个 Master eligible 节点
    • 可以设置 node.master: false 禁止
  • Master-eligible 节点可以参加选主流程,成为 Master 节点
  • 当第一个节点启动的时候,它会将自己选举成 Master 节点
  • 每个节点上都保存了集群的状态,只有 Master 节点才能修改集群的状态信息
    • 集群状态(Cluster State),维护了一个集群中必要的信息
      • 所有的节点信息
      • 所有的索引和其相关的 Mapping 和 Setting 信息
      • 分片的路由信息
    • 任意节点都能修改信息会导致数据的不一致性

Data Node

  • 可以保存数据的节点,负责保存分片数据。

Coordinating Node

  • 负责接收 Client 的请求,将请求分发到合适的节点,最终将结果汇集在一起
  • 每个节点默认都起到了 Coordinationg Node 的职责

Hot & Warm Node

  • 不同硬件配置的 Data Node,用来实现 Hot & Warm 架构,降低集群部署的成本

Machine Learning Node

  • 负责跑寄去学习的 Job,用来做异常检测

Tribe Node

分片

主分片

  • 用以解决数据水平扩展问题,通过主分片,可以将数据分不到集群内的所有节点上

副本

  • 用以解决数据高可用的问题,是主分片的拷贝

分片的设定

  • 分片数设置过小
    • 导致后续无法增加节点,实现水平扩展;
    • 单个分片数据量太大,导致数据重新分配耗时
  • 分片数设置过大(7.0 开始默认主分片设置为 1,解决了 over-sharding 的问题)
    • 影响搜索结果的相关性打分,影响统计结果准确性;
    • 单个节点上过多的分片,导致资源浪费,同时影响性能

集群健康状况

Green

  • 主分片与副本都正常分配

Yellow

  • 主分片全部正常分配,有副本分片未能正常分配

Red

  • 有主分片未能分配
    • 例如,当服务器的磁盘容量超过 85% 时,去创建一个新的索引

倒排索引

正排索引

  • 文档 id -> 文档内容 -> 单词

倒排索引

  • 单词 -> 文档 id

倒排索引包含两部分

  • 单词词典(Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系

    单词词典一般比较大,可以通过 B+ 树或哈希拉链法实现

  • 倒排列表(Posting List)记录了单词对应的文档结合,由倒排索引项组成

    倒排索引项(Posting)

    • 文档 ID
    • 词频 TF 该单词在文档中出现的次数,用于相关性评分
    • 位置 Position 单词在文档中分词的位置,用于语句搜索(phrase query)
    • 偏移 Offset 记录单词的开始结束位置,实现高亮显示

Analysis 与 Analyzer

Analysis 文本分析,将全文本转换一系列单词(term/token) 的过程

Analysis 通过 Analyzer 实现

Analyzer 组成

Character Filters

  • 针对原始文本处理,例如去除 html

Tokenizer

  • 按照规则切分为单词

Token Filter

  • 将切分的单词进行加工,小写,删除 stop