ElasticSearch 基本概念
文档(Document)
ElasticSearch是面向文档的,文档是可搜索的最小单位。
好比
- 日志文件中的日志
- MP3播放的一首歌
文档会被序列化成JSON格式,保存在ElasticSearch中
每个文档都有一个Unique ID
- 你可以自己制定ID
- 或者ElasticSearch自动生成。
文档元数据
元数据用于标注文档的相关信息
- _index: 文档所属的索引名
- _type: 文档所属的类型名(目前版本只有一种类型_doc)
- _id: 文档唯一ID
- _source: 文档的原始Json串
- _version: 文档的版本信息
- _score: 相关性打分
索引
Index是文档的容器。是一类文档的集合。
每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型。
索引中的数据分散在Shard上。
传统数据库与ElasticSearch对比
分布式特性
- 水平扩容
- 高可用(部分节点停止服务,整个集群服务不受影响)
节点
-
Master Node
修改集群状态,集群状态包括- 所有的节点信息
- 所有的索引和其相关的Mapping与Setting信息
- 分片的路由信息
- Master-eligible Node
每个节点启动后,默认就是一个Master-eligible Node - Ingest Node
数据预处理节点,默认每个节点都启用Ingest - DataNode
负责保存分片数据的节点 - Hot Node & Warm Node
不同硬件配置的DataNode,用来实现Hot&Warm架构,降低集群部署的成本 - Coordinating Node
负责接受Client的请求,将请求分发到合适的节点,最后将结果汇集在一起 - Machine Learing Node
负责跑机器学习的节点,用来做异常检测 - Tribe Node
Tribe Node可以连接到不同的集群,并且支持将这些集群当成一个单独的集群处理
节点配置
分片
- 主分片
用于解决数据水平扩展,通过主分片,将数据分布到集群内所有节点之上。一个分片就是一个Lucene实例,主分片数在索引创建时指定,后续不允许修改,除非Reindex - 副本
用于解决数据高可用的问题。分片是主分片的拷贝。
副本分片数,可以动态调整
增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
正排索引和倒排索引
- 正排索引:文档ID到文档内容和单词的关联
- 倒排索引:单词到文档ID的关系
倒排索引核心成员
- 单词词典
记录所有文档的单词,记录单词到到排列表的关联关系 -
倒排列表
记录了单词对应的文档集合,由倒排索引项组成倒排索引项
- 文档ID
- 词频TF
该单词在文档出现的次数,用于相关性评分 - 位置
单词在文档中分词的位置,用于语句搜索 - 偏移
记录单词的开始结束位置,实现高亮显示
如下图Elasticsearch的倒排列表
分词(Analyzer)
- Character Filters
针对原始文本处理,例如去除html - Tokenizer
按照规则切分为单词 - Token Filter
将切分的单词进行加工,小写,删除stopwords,增加同义词
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。