ElasticSearch.03 - 基本原理
基础概念
索引:含有相同属性的文档集合
类型:索引可以定义一个或多个类型
文档:必须属于一个类型文档文档是可以被索引的基本数据单位
与数据库的对应关系
索引——数据库/表。ES6 之前可以把索引理解为数据库,但是 ES6 之后一个索引只允许创建一个类型,因此类型的概念会在之后彻底消失,因此只要认为索引是一张表就好了。
类型——表
文档——一行记录
分片与备份
分片:每个索引都有多个分片,每个分片是一个 Lucene 索引
备份:拷贝一份分片就完成了分片的备份
默认情况下,创建一个索引会产生 5 个分片,1 个备份,分片数量可以指定,但索引被创建后就不能被修改。
倒排索引
倒排索引和正排(一般)索引的区别
正排索引:即我们一般想到的索引,比如书的目录,它是按照页码来告诉我们里面有什么内容。换种说法就是,建立 文档 ID 与文档内容、标题的联系。
倒排索引:它是先建立一个单词表,每个单词都指向有它存在页码。换言之,就是建立单词到文档 ID 的关联关系。
倒排索引组成
倒排索引由两部分组成:
单词词典(Term Dictionary)
倒排列表(Posting List)
注意:倒排索引会为 JSON 中每个字段建立单独的倒排索引
单词词典
单词词典有两个作用:
记录所有的单词
记录每个单词和倒排列表的关联信息
单词词典一般是通过 B+ Tree 来实现的,因为通过 B+ Tree 可以减少搜索引擎读取单词词典的次数,加快检索速度。
倒排列表
倒排列表由倒排索引项(Posting)组成,记录了单词对应的文档集合。
倒排索引项主要包括以下信息:
文档 ID:用于获取原始信息
单词词频(TF,Term Frequency):记录该单词在该文档中出现的次数,用于后续的相关性算分
位置:文档中会存在多个分词,用位置指明当前词语在所有分词中的哪个位置,用于词语搜索(Phrase Query)
偏移:记录单词在文档中的开始位置和结束位置,用于高亮显示
倒排列表如下所示:
如何整合使用
先通过单词字典找到对应的单词,这个单词会指向它在倒排列表中倒排索引项的位置
然后找到倒排索引项,通过索引将对应的 文档 ID 和需要显示的相关信息提取出来。
再通过文档 ID 到正排索引处获取文档详细内容,然后计算相关性得分,计算排序,返回给用户。
全文检索
由正排索引和倒排索引组合,即可实现全文检索。
比如,查询包含"搜索引擎"的文档
通过倒排索引获得"搜索引擎"对应的文档 Id 有 1 和 3
通过正排索引查询 1 和 3 的完整内容
返回用户最终结果
版权声明: 本文为 InfoQ 作者【insight】的原创文章。
原文链接:【http://xie.infoq.cn/article/146481cb1e918830d8b989309】。文章转载请联系作者。
评论