流程概览

es 依靠 Logstash 作为一个中间层,从数据库,文件系统或者是应用产生的实时的信息中读如数据,这些数据的最小单位是一个文档,以 json 格式表示。

组成

文档

文档是 es 数据的基本单元,以一个 Json 的格式表示。es 支持对指定文档(单个或者批量)的 CRUD。

es 中的数据表示比 Json 多(比如 Json 没有表示日期的特定的数据格式,而是使用一个字符串表示,es 会自定的解析 Json 的内容转换成对应的数据格式)。

不同于关系型的数据数据库,数据的关系不使用外键表示,而是使用内部对象(数组)表示。

类型

类型是文档的数据结构的表示,在没有手动创建的情况下,es 会根据文档的类型自动创建。

在 es 5 之前,一个索引中可以存在多个类型,也就是一个索引中可以包含多种类型的文档,在 es 6 之后采用相同的做法将会得到一个 warning。

索引

索引是保存文档的逻辑容器,一个索引包含多个分片(主分片,从分片),多个主分片共同维护索引中的文档,每个主分片可以有多个分片副本,每个分片是一个 Apache Lucene 实例。

一个索引多个分片的目的是提高分区容错性和可用性,一个索引的多个分片一般来说是在不同的节点上,通过网络进行状态的同步。

索引大致包含设置,映射,别名 3 个属性。索引的设置可以参考:Elasticsearch Index Setting一览表【转】 - 象牙酥 - 博客园 (cnblogs.com),映射即定义模式定义,大多数的设置是用来配置分片的,别名将多个 RESTful 的 URI 指向同一个索引。

数据流

分片

分片包含主分片和分片副本,在 es 集群中保存(多个节点),es 集群的健康状态如下:

翻译一下

红:存在分片未分配或者就绪
黄:分片都已经分配但是存在未就绪的分片(一般是分片副本还没有由主节点中向集群中的其他节点复制)
绿色:所有分片都已经分配并就绪

集群当前的健康信息可通过 GET _cluster/health 查询。

节点和集群

节点角色

角色 主要作用
主节点 管理集群中的节点
数据节点 数据的持久化和查询
提取节点 负责通过管道提取的数据的索引前的转化或者填充
机器学习节点 机器学习
转换节点 类似于数据库中的视图,由几个已经存在的索引创建一个聚合的索引
定位节点 (默认角色)处理来自客户端的请求

倒排索引

相关性

在查询结果存在多个文档时,es 依据相关项分数(一个浮点数)将结果排序,默认使用 BM25 计算相关性分数。

BM 25 算法的结果主要由 TF,IDF,field length norm 决定。

  • TF:Term Frequency,关键词在指定字段上出现的次数
  • IDF:Inverse Document Frequency,关键词在整个文档(不止统计指定的字段上的关键词)中的出现次数的逆(出现的越多相关性越小)
  • field-length norm,字段的长度,字段的长度越短,相关性越高

对于类型上的不同字段,es 可以单独设置相关性算法以及对应的参数。

路由算法

shard_number = hash(id) % number_of_shards

伸缩