Elasticsearch:ES 倒排索引为啥查询速度会这么快

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:ES 倒排索引为啥查询速度会这么快相关的知识,希望对你有一定的参考价值。

参考技术A

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,它建立在全文搜索引擎 Apache Lucene™ 的基础上。Elasticsearch 之所以可以实现近乎实时的检索,依靠的技术手段是非常多的,本文将从 反向索引、Term Index 两块知识点入手,分析 Elasticsearch 之所以那么快的原因。

在上表所展示的 “文档-关键词” 矩阵索引中,如果用户使用搜索引擎查找目标关键字(比如 火星 ),搜索引擎就会从索引库中所有的关键字包含 火星 的文档,也就是 web_x_1、web_x_2 ,并根据网页文件自身的价值评分高低(比如关键词出现的次数)按顺序展示给用户,用户得到的就是 按顺序 展示的 web_x_2 web_x_1 两个网页。这就是正向索引实现的大致流程。

在这个矩阵中, 火星 关键词对应的所有网页都被提前找到,甚至网页文档的权重都被提前计算好并排序,当用户输入 火星 关键词时,就会立刻到 web_x_2, web_x_1 的反馈结果。
这里有些人会有疑问,关键词数量会不会太多,以至于超过网页问的数量,这样效率不会反而变低了么,其实不然,人类的语言词汇数量是相对有限、且固定的,但网页数量却没有上限。比如汉语中,汉字30000个、词汇大概40万,但汉语网站数量却远远不止这么些。
需要注意的是,由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。

针对这个表,Elasticsearch 会创建如下的索引:
索引一: Name

索引二: Color

索引三: Rate

在这个索引中,Name、Color、Rate 这些字段被称为 filed , iphone 666 plus、blue、middle 这些被称作 Term ,而 Term 对应的所有商品的 id 比如 [1, 3] 就是 Posting List
当用户要查找 Color=blue 的商品时,通过索引三的 Term 和 Posting List 很快就可以找到,目标是 id 为 2 的商品,进而通过索引一找到商品 Name 为 华为 mate 98k。

上面简单解释了 Term 和 Posting List,但实际生产中 Elasticsearch 需要面对的是数以亿计的数据记录,数据的 Term 的数量是惊人的,这样往往需要花费大量时间才能命中,而且多数时候查找是多条件查找,这就需要多次进行重复查找,效率仍然不高。
这时就需要对 Term 进行优化排序,即使用 二分查找 查找 Term,这种查找方法类似于通过字典查找,被称为 Term Dictionary 。
同样是上面的例子,Name、Color、Rate 三个索引下所有的 Term,按照 首字母在英语字母表中位置 排序后如下:

当用户想要查找 rate 为 high 的商品时,通过二分法很快就可以查到,查找过程的时间复杂度为 log N,这样就大大提高了查找的速度。关于二分查找,细节这里就不做赘述了,如果不清楚的朋友们可以自行百度,或点击 二分查找 获取更多信息。

到这里很多人会有疑问,那这和传统的 B-tree 有什么区别呢,这就需要引入另一个概念 Term Index。
Term Index 其实也可以理解为一个树形结构,从 Term 的第一个字母开始进行第一层排序,如果有多个 Term 首字母相同,则从该字母为起始点进行第二层排序,如果以该字母为首的只有一个 Term,则不再进行第二次排序。
同样是上面的例子,其 Term Index 如下图所示:

在上图中,字母 b 为首的 Term 有两个,分别为 blue 和 black,这时就需要进行第二层排序,即对第二位字母进行排序,这时我们发现两个 Term 的第二位字母都为 l,于是进行第三层排序,第三层排序的结果是 bla、blu ,分别对应 black、blue 两个 Term,并对应 [1, 3]、2 两个 Posting List。对应关系如下图所示:

在 Term Index 中需要保存的是 Term 的前面部分字段,以及与 Term Dictionary 之间的映射关系,这使得存储的信息量减少。再结合 FST(Finite State Transducer)压缩技术,Term Iindex 可以被压缩到足够小,以至于可以被缓存进服务器内存中。这样,在用户查找的时候,先在内存里从 Term Index 找到 Term Dictionary 中的位置映射关系,然后再去磁盘上找对应的 Term,进而查找对应的 Posting List,这就大大减少了磁盘的读取次数,也就提高了效率和速度。

关于 FST 压缩技术,请参考这篇文章: https://www.shenyanchao.cn/blog/2018/12/04/lucene-fst/ ,英语好的可以看下这篇论文 https://cs.nyu.edu/~mohri/pub/fla.pdf ,里面对FST有详细的解释。

这里先埋一个坑,将来有时间再来填。

es笔记全文搜索倒排索引路由分片理解

笔记参考《Elasticsearch技术解析于实战》

Elasticsearch入门知识

对应书本第一章

1.1全文搜索

全文搜索是指计算机搜索程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数位置,查询时根据索引进行查找。

理解:

就是将文章中的关键字提取出来,建立索引,然后查询。类似字典的偏旁部首查询、拼音查询。

在线新华字典部首查询:点我

在线新华字典拼音查询:点我

1.2Luence倒排索引

根据属性值来查找记录。(倒排索引的概念就这一句话)

理解:

一篇文章的倒排索引类似于这个样子,实际的索引比这个复杂的多。

属性值:对应下面的关键词,记录:对应下面的一行数据。

关键词出现的频率出现的位置
roczhang2第三章第二节第五个单词
dlage4第二章第二节第五个单词
张三1第六章第二节第五个单词

当你查到关键词之后,关键词有两个指向它出现频率和出现位置的指针,一下子就找出它的位置了。

理解:

为什么称为倒排索引?

一般我们查找我们需要的知识是这个步骤:先找书,再找我们需要的知识点。倒排索引是把知识点都建立了索引(上表),根据知识点(关键词),我们就能找到在哪本书里面(出现的位置)。

1.3建立倒排索引的步骤

取得关键词:使用ik分词器,将文章里面的关键词提取出来。github链接🔗

建立倒排索引:如上表。

1.4术语及概念

  • 索引词

    一个能够被索引的精确值。上表的关键词。

  • 文本

    文本会被分成一个个的索引词。

  • 分析

    分析是将文本转换成索引词的过程

  • 路由

    具体将文档放到哪个分片中由路由决定

    参考官方文档:点我

  • 分片

    如果一个索引很大,有一个TB的数据,一台服务器存储不下,可以分片存储。每个分片都有完整的功能。

    参考官方文档:点我

  • 主分片

    一个索引有5个主分片,存储一个文档的时候,系统会首先储存在主分片中(存储在哪个主分片中由上述的路由决定)。然后会复制到不同的副本中(备份)。

  • 副本分片

    两个作用:主分片失败时,可以将副本分片设置为主分片。查询可以到副本分片查询(主分片查询压力大的时候)

  • 复制

    主分片使用副本分片时会复制数据到副本分片。

  • 类型

    一个索引中存储两种数据,就是存储两种类型。比如一种博客数据,一种评论数据。

  • 文档

    mysql中表的一行数据

  • 映射

    mysql中的表,定义字段类型用的。

  • 字段

    mysql中的列

  • 来源字段

    原文档被存储在_source这个字段中。成为来源字段

  • 主键

    文件唯一标识。和mysql类似。

我的github链接:点我

ref:https://www.elastic.co/guide/cn/elasticsearch/guide/current/routing-value.html

以上是关于Elasticsearch:ES 倒排索引为啥查询速度会这么快的主要内容,如果未能解决你的问题,请参考以下文章

推荐系统[九]项目技术细节讲解z1:Elasticsearch 如何进行快速检索(ES倒排索引和分词原理)以及倒排索引在召回中的应用。

Elasticsearch 倒排索引

es笔记全文搜索倒排索引路由分片理解

Elasticsearch 分布式搜索引擎 -- 初识elasticsearch(了解ES倒排索引es的一些概念安装eskibana)

ElasticSearch

Elasticsearch之存储原理