.1 天然分片,天然集群
ES 把数据分成多个 shard,下图中的 P0-P2,多个 shard 可以组成一份完整的数据,
这些 shard 可以分布在集群中的各个机器节点中。随着数据的不断增加,集群可以增加多
个分片,把多个分片放到多个机子上,已达到负载均衡,横向扩展。
在实际运算过程中,每个查询任务提交到某一个节点,该节点必须负责
将数据进行整理
汇聚,再返回给客户端,也就是一个简单的节点上进行
Map
计算,在一个固定的节点上进
行
Reduces
得到最终结果向客户端返回。
这种集群分片的机制造就了 elasticsearch 强大的数据容量及运算扩展性。
1.4.2 天然索引
ES 所有数据都是默认进行索引的,这点和 MySQL 正好相反,MySQL 是默认不加索
引,要加索引必须特别说明,ES 只有不加索引才需要说明。
而 ES 使用的是
倒排索引
和 MySQL 的 B+Tree 索引不同。
➢
传统关系性数据库
弊端:
◼
对于传统的关系性数据库对于关键词的查询,只能逐字逐行的匹配,性能非常差。
◼
匹配方式不合理,比如搜索“小密手机”,如果用 like 进行匹配, 根本匹配不到。
但是考虑使用者的用户体验的话,除了完全匹配的记录,还应该显示一部分近似匹
配的记录,至少应该匹配到“手机”。
➢
倒排索引是怎么处理的
全文搜索引擎目前主流的索引技术就是
倒排索引
的方式。
传统的保存数据的方式都是:记录→单词
而倒排索引的保存数据的方式是:单词→记录, 基于分词技术构建
倒排索引
,每个记录保
存数据时,都不会直接存入数据库。系统先会对数据进行
分词
,然后以倒排索引结构保存。
如下:
搜索“红海行动”
,
那么搜索引擎是如何能将两者匹配上的呢?
等到用户搜索的时候,会把搜索的关键词也进行分词,会把“
红海行动
”分词分成:
红
海
和
行动
两个词。
这样的话,先用红海进行匹配,得到 id=1 和 id=2 的记录编号,再用行动匹配可以迅
速定位 id 为 1,3 的记录。
那么全文索引通常,还会根据匹配程度进行打分,显然 1 号记录能匹配的次数更多。
所以显示的时候以评分进行排序的话,1 号记录会排到最前面。而 2、3 号记录也可以匹配
到。
➢
索引结构对比
可以看到 Lucene 为倒排索引(Term Dictionary)部分又增加一层 Term Index 结构,
用于快速定位,而这 Term Index 是缓存在内存中的,但 MySQL 的 B+tree 不在内存中,
所以整体来看 ES 速度更快,但同时也更消耗资源(内存、磁盘)。