写点什么

ElasticSearch.03 - 基本原理

用户头像
insight
关注
发布于: 2021 年 02 月 17 日
ElasticSearch.03 - 基本原理

基础概念

  • 索引:含有相同属性的文档集合

  • 类型:索引可以定义一个或多个类型

  • 文档:必须属于一个类型文档文档是可以被索引的基本数据单位


与数据库的对应关系

  • 索引——数据库/表。ES6 之前可以把索引理解为数据库,但是 ES6 之后一个索引只允许创建一个类型,因此类型的概念会在之后彻底消失,因此只要认为索引是一张表就好了。

  • 类型——表

  • 文档——一行记录


分片与备份

  • 分片:每个索引都有多个分片,每个分片是一个 Lucene 索引

  • 备份:拷贝一份分片就完成了分片的备份

默认情况下,创建一个索引会产生 5 个分片,1 个备份,分片数量可以指定,但索引被创建后就不能被修改。


倒排索引

倒排索引和正排(一般)索引的区别

正排索引:即我们一般想到的索引,比如书的目录,它是按照页码来告诉我们里面有什么内容。换种说法就是,建立 文档 ID 与文档内容、标题的联系。


倒排索引:它是先建立一个单词表,每个单词都指向有它存在页码。换言之,就是建立单词到文档 ID 的关联关系。

倒排索引组成

倒排索引由两部分组成:

  • 单词词典(Term Dictionary)

  • 倒排列表(Posting List)

注意:倒排索引会为 JSON 中每个字段建立单独的倒排索引


单词词典

单词词典有两个作用:

  1. 记录所有的单词

  2. 记录每个单词和倒排列表的关联信息

单词词典一般是通过 B+ Tree 来实现的,因为通过 B+ Tree 可以减少搜索引擎读取单词词典的次数,加快检索速度。


倒排列表

倒排列表由倒排索引项(Posting)组成,记录了单词对应的文档集合。


倒排索引项主要包括以下信息:

  • 文档 ID:用于获取原始信息

  • 单词词频(TF,Term Frequency):记录该单词在该文档中出现的次数,用于后续的相关性算分

  • 位置:文档中会存在多个分词,用位置指明当前词语在所有分词中的哪个位置,用于词语搜索(Phrase Query)

  • 偏移:记录单词在文档中的开始位置和结束位置,用于高亮显示

倒排列表如下所示:


如何整合使用

  1. 先通过单词字典找到对应的单词,这个单词会指向它在倒排列表中倒排索引项的位置

  2. 然后找到倒排索引项,通过索引将对应的 文档 ID 和需要显示的相关信息提取出来。

  3. 再通过文档 ID 到正排索引处获取文档详细内容,然后计算相关性得分,计算排序,返回给用户。


全文检索

由正排索引和倒排索引组合,即可实现全文检索。

比如,查询包含"搜索引擎"的文档

  1. 通过倒排索引获得"搜索引擎"对应的文档 Id 有 1 和 3

  2. 通过正排索引查询 1 和 3 的完整内容

  3. 返回用户最终结果


发布于: 2021 年 02 月 17 日阅读数: 15
用户头像

insight

关注

不要混淆行动与进展、忙碌与多产。 2018.11.17 加入

永远都是初学者

评论

发布
暂无评论
ElasticSearch.03 - 基本原理