基础概念
索引、文档、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 信息
- 分片的路由信息
- 任意节点都能修改信息会导致数据的不一致性
- 集群状态(Cluster State),维护了一个集群中必要的信息
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