流程概览
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