Elasticsearch 倒排索引?

1,177次阅读
没有评论

共计 972 个字符,预计需要花费 3 分钟才能阅读完成。

1.前言

大数据时代,海量数据搜索,Elasticsearch算是Java的一个重要实现了,相比于我们常用的RDBMS,比如Mysql,有和不同呢?为什么不直接用Mysql直接搜索呢?整个Elasticsearch还要数据同步,没事找事?

Elasticsearch 倒排索引?

2.查询的魔术

在Mysql中,一个高效的查询通常得益于高效的索引;首先查询命中了索引(索引是构建在我们定义的字段上的),然后通过索引去定位我们的磁盘数据,经过反复倒腾,最终得到我们查询的结果集

Elasticsearch 倒排索引?

现有一个查询:查询字段column1等于1的结果;

首先命中column1的索引,根据B-Tree能够快速定位数据;这个过程中,我们要的结果1不是主动的,它只是column1的一个值,解释器根据column1同时结合1判断能不能使用索引,使用索引后再去选择column1=1的数据,也就是通过column1的索引去找column1的值

还有一个查询:查询字段column1包含1的结果;

这时候会发现column1的索引对查询作用不大了,默认会直接全表扫描,再怎么优化,也难有质的飞跃

通过对Mysql的查询分析,我们发现痛点在于要查询的值处于被动地位,被值对应字段的索引牵着走,能不能让值占据查询的主导地位呢?也就是说根据值预先做些特殊处理,这样下次查询这个值时能够快速的定位到数据,这不就快起来了?

Elasticsearch中,就是预先根据分词器处理了我们需要索引的字段,不同的分词器造成的查询效率也会不同

现在我们有个字段field1,有好几个文档这个字段值如下:

小明喜欢吃辣椒

小明喜欢吃西瓜

小张不喜欢吃西瓜

小海喜欢吃辣椒

某个分词器分词后发现文档中各个词的出现频率如下:

文档1 文档2 文档3 文档4
小明 出现一次 出现一次 没有出现 没有出现
小张 没有出现 没有出现 出现一次 没有出现
小海 没有出现 没有出现 没有出现 出现一次
喜欢 出现一次 出现一次 没有出现 出现一次
不喜欢 没有出现 没有出现 出现一次 没有出现
出现一次 出现一次 出现一次 出现一次
西瓜 没有出现 出现一次 出现一次 没有出现
辣椒 出现一次 没有出现 没有出现 出现一次

这时候我们发现只需要根据词出现的频率构建索引,这样下次出现查询小明这个词,直接就定位到文档1和文档2了,要查询的值占据了主导!看起来做了一个翻转索引!

3.小结

本文简述了Elasticsearch的索引逻辑,并与Mysql的索引作了些许对比

正文完
 
mysteriousman
版权声明:本站原创文章,由 mysteriousman 2022-07-16发表,共计972字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)