共计 972 个字符,预计需要花费 3 分钟才能阅读完成。
1.前言
大数据时代,海量数据搜索,Elasticsearch算是Java的一个重要实现了,相比于我们常用的RDBMS,比如Mysql,有和不同呢?为什么不直接用Mysql直接搜索呢?整个Elasticsearch还要数据同步,没事找事?
2.查询的魔术
在Mysql中,一个高效的查询通常得益于高效的索引;首先查询命中了索引(索引是构建在我们定义的字段上的),然后通过索引去定位我们的磁盘数据,经过反复倒腾,最终得到我们查询的结果集
现有一个查询:查询字段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的索引作了些许对比