Elasticsearch简介

        术业有专攻!说Elasticsearch在搜索方面比mysql强大,倒不如说MySQL本身也不是为了查询大量的数据而诞生的,MySQL创建之初就是为了做大量数据存储来使用的!

        Elasticsearch是海量数据查询搜索引擎,广泛用于全文检索、日志分析、监控分析等场景。

        关于全文检索需要理解的就是:全文数据库是全文检索系统的主要构成部分。所谓全文数据库是将一个完整的信息源的全部内容转化为计算机可以识别、处理的信息单元而形成的数据集合。全文数据库不仅存储了信息,而且还有对全文数据进行词、字、段落等更深层次的编辑、加工的功能(也即是分词的功能),而且所有全文数据库基本都离不开有海量的信息数据库

 ES三大特点:

  • 轻松支持各种复杂的查询条件:分布式实时文件存储,采用倒排索引及自定义打分、排序能力与丰富的分词插件等,实现复杂查询条件的全文检索需求。
  • 可拓展性强:天然支持分布式存储,可简单实现上千台服务器的分布式横向火绒。
  • 高可用,容灾性能好:通过主备节点及故障自动检测与恢复,实现高可用。

Elasticsearch与mysql的概念对比:

Elasticsearch

MySQL

Index(索引)

Dotobase(数据库)

Type(类型)

Table(数据表)

Dcoument(文档)

Row(行)

Mapping

Schema

Fields(字段)

Column(列)

        那么Elasticsearch的索引为何这么高效,能在海量的数据中达到秒级甚至毫秒级的效果呢?最主要的原因就是它所用的倒排索引方式生成索引,避免全文扫描

倒排索引

说明:正排索引说的是通过文档来查找关键词,而倒排索引反之,是通过关键词来查找文档的形式

        通常 如果要正排索引,那么要把每个文档的内容拿出来查找是否有此单词,毫无疑问这样的话会导致全表扫描,那么用倒排索引会怎么查找呢,它首先会将每个文档内容进行分词,然后建立每个分词与包含有此分词的文档之前的映射关系,如果有多个文档包含此分词,那么就会按文档的权重将文档进行排序

关于查找数据时为什么要选Elasticsearch

        起初在创建项目的时候需要通过标题或是其他进行大量的模糊查询,数据量比较大,用MySQL进行查询就会相对吃力,这个时候就需要用到全文搜索的一种工具。而elasticsearch作为现如今非常火热的一种全文检索的工具,也就被优先使用了起来。

查询方面mysql的不足

说了这么多Elasticsearch的关于查询海量数据的好处,那么mysql在查询大量数据的时候到底有什么不足的地方。

带着这个问题跟大家说一下mysql对于查询数据来说所存在的不足

上述也提到了MySQL在当时诞生之初设计团队就希望它用来做海量数据存储,并不是为了应对海量数据下各种复杂条件的查询,说MySQL创建索引,不是可以提升查询速度吗,为什么说它不适合海量数据查询呢,有两个原因:

1、加索引确实可以提升查询速度,但我们知道存储都是需要成本的,如果你针对每一种情况都加索引,每加一个索引,就会创建一颗 B+ tree,如果是海量数据,将会大幅度增加存储成本,况且在 MySQL 中加多个索引最终在执行 SQL语句 的时候它依然会选择成本最低的那个索引,如果没有索引满足搜索条件,就会触发全表扫描,因此得出索引并不是建得越多越好。

2、依然会有些查询条件是 MySQL 加索引都没办法解决的!

结合这两点,我们知道,MySQL的查询能力还是有限的!

Elasticsearch其他有利于查询的功能

除了我们所提到的倒排索引以外,Elasticsearch分布式同样让其适合数据查询:

一个集群有多个node节点组成,每个index(索引)也是以分片的数据存在以多个node节点上,然后当有查询条件请求过来的时候,分别在各个node查询相应的结果并整合后便可。将查询压力分散到各个节点上,也避免了其对于磁盘、内存等处理能力与空间的不足

它还采用了主备分片提升搜索吞率,使用节点故障探测,RESTful的选主机制等提升了容灾能力等等(因为Elasticsearch是基于RESTful web接口),总之经过上面的简单总结大家只需要明白一点:Elasticsearch的分布式架构设计初衷就是为了支持海量数据查询

最后说一句,Elasticsearch在查询海量数据的时候占尽了优势,但是一般情况下在没有那么大的查询量时,也不一定要选用。因为Elasticsearch本身会占用了很大一部分运行内存!