1.简介
elasticsearch是一个基于lucene构建的开源分布式搜索引擎,作为elastic stack的核心,其还可以用于数据存储以及数据分析。7.5版本的官方文档链接。
2.Index(索引)
(1).简介
index是存储具有相同数据结构的文档。
(2).特性
- 一个index被唯一的小写字母名称标记
- 每个索引都有自己的mapping定义,用于定义字段和类型
- 一个集群可以建立多个index
3.Type(类型)
(1).简介
在一个Index中,可以定义多个type,同一个type中的数据会有相同的数据结构。type相当于关系型数据库中的表。
(2).特性
在elaticsearch6.x版本中,一个索引只有一个type,声明多个type会被标记为过期,但却仍可以使用,而elaticsearch在7.0之后的版本会完全移除这一特性。
4.Document(文档)
(1).简介
一个document是可以被索引的基本单元,通常document都是json形式的数据。document相当于关系型数据库中的记录。
(2).数据类型
一个document是由一个或多个字段组成的json对象。
(3).文档ID
每个文档都有唯一的id标识,类似于mysql中的主键。在插入数据时可以指定id,也可以不指定由elasticsearch自动生成。
(4).元数据
document中标注文档相关信息的数据称之为元数据。
- _index:文档所在的索引名
- _type:文档所在的类型名
- _id:文档唯一id
- _source:文档的原始json数据
- _all:整合所有字段内容到该字段,默认禁用(会对所有字段内容进行分词,占磁盘空间但效果并不好)
- _version:文档有变化的操作(新增、修改和删除)都会更新_version值,存在的意义相当于锁的机制,如果并行修改文档数据时,当更新操作的_version值小于当前文档的_version值时,此次的更新操作便是非法的
5.倒排索引
(1).简介
拿高性能mysql这本书举例,书中包括目录页(页码和章节标题)和内容页(页码和具体内容),目录页的作用是按照页码顺序介绍本书的核心知识点(即可以根据页码找到对应的内容),那么目录页便可以理解为正排索引。
本书的最后提供了一个索引的功能,列出了关键词所出现的页码,即可以根据关键词查找其所对应的页码,那么索引页便可以理解为倒排索引。
正排索引显示了文档id到文档内容、单词的关联关系,而倒排索引显示了文档内容、单词到文档id的关联关系。
(2).正排索引和倒排索引案例
正排索引:文档id到文档内容、单词的关联关系。
文档id | 文档内容、单词 |
1 | elasticsearch是最流行的搜索引擎 |
2 | php是世界上最好的语言 |
3 | 搜索引擎是如何诞生的 |
倒排索引:文档内容、单词到文档id的关联关系。将文档内容进行分词,找到单词出现的文档id存入文档id列表。
文档内容、单词 | 文档id列表 |
elasticsearch | 1 |
流行 | 1 |
搜索 | 1、3 |
引擎 | 1、3 |
搜索引擎 | 1、3 |
php | 2 |
世界 | 2 |
最好 | 2 |
语言 | 2 |
如何 | 3 |
诞生 | 3 |
(3).倒排索引组成
- 单词词典
单词词典是倒排索引的重要组成部分,主要特性如下。
- 文档单词的集合(一般比较大)
- 记录单词到倒排列表的关联关系
- 单词词典底层是通过b+树的数据结构来保障高效的查询效率的
- 倒排列表
倒排列表记录了单词对应的文档集合,由倒排索引项组成,倒排索引项主要包括以下信息。
- 文档id:用于获取原始信息
- 单词频率:记录单词在该文档中出现的次数,用于后续相关性算分
- 位置:记录单词在文档中的分词位置(可以是多个),用于做单词搜索
- 偏移:记录单词在文档中的起始位置,用于做高亮显示
(4).倒排索引项组成案例
以“搜索引擎”为例,阐述倒排索引项的构成。
文档id | 文档内容、单词 |
1 | elasticsearch是最流行的搜索引擎 |
2 | php是世界上最好的语言 |
3 | 搜索引擎是如何诞生的 |
假如文档1的内容被分词为elasticsearch、流行和搜索引擎三个单词,文档2的内容被分词为搜索引擎、如何和诞生三个单词,那么倒排索引项的构成如下(位置从0开始计数)。
文档id | 词频 | 位置 | 偏移量 |
1 | 1 | 2 | <18,22> |
3 | 1 | 0 | <0,4> |
(5).倒排索引搜索流程
- 搜索关键词时通过单词词典快速定位到其位置,通过倒排索引项获得搜索关键词所对应的文档id
- 通过正排索引查询文档id对应的完整内容
- 返回用户最终结果
这里为了文字排版,只列出了倒排索引项的单词位置,文档id、词频和偏移量未列出。
(6).ElasticSearch文档存储格式
elasticsearch的文档是以json格式存储的,json包含多个字段,那么elasticsearch会为每个字段建立一个倒排索引。