跟我学Elasticsearch(1) 什么是Elasticsearch
这是我的es系列文章开篇,我会尽量用聊天的方式跟大家去聊明白这门技术。
说到底mysql,redis,lucene,hadoop本质上就是一个存储介质,核心功能就是CRUD,只是各自的实现方式不一样,es同理,不过是去透彻理解ES的CRUD细节的一个过程,just so so。。
不同技术有它在特定场景下的优势,比如mysql在于事务特性保证数据强一致性,redis在于使用内存作为存储介质所以速度快,lucene在于提供了全文检索以至于我们可以根据"变金刚"关键字查到"变形金刚"内容的魔力,hadoop在于自动把数据分散存储在可自动扩容的多节点上就是俗称的存储海量数据的能力。
基于这4个技术点,我们来评估一下es的能力值:
事务特性:无
存储在内存:可以
全文检索:可以
存储海量数据:可以
基于以上对es的基本认识,进一步聊聊什么是es:
1、什么是搜索?
百度,淘宝,拉钩,腾讯新闻,管理系统,各种app都有搜索的功能,我想得到我要的信息,输入一个关键字,找出这个关键字相关的信息。
2、如果用数据库做搜索会怎么样?
比如影片表里面有100万条数据(100万部电影),其中有一部电影的描述是"变形金刚是非常好看的一部电影....省略1000字",这时候我们使用"变金刚"关键字去搜索的话
问题1:全表去扫100万条数据并依次匹配每条数据的1000字电影描述里面有没有包含"变金刚",性能会很差。
问题2:电影描述里包含的是“变形金刚”,而用"变金刚"关键字产生的sql条件是"like %变金刚%",因此查不出任何数据,所以说这个搜索是不靠谱的。
全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理,这些都是数据库的缺陷。es作为传统数据库的补充,提供了数据库所不能提供的很多功能。
3、什么是倒排索引、全文检索和Lucene?
(1) 比如我们往es写入id=1的"变形金刚电影"和id=2的"变形金刚海报"两条数据,es会自动生成一个倒排索引,结构很简单类似行转列:
关键词 | ids |
---|---|
变形 | 1,2 |
金刚 | 1,2 |
电影 | 1 |
海报 | 2 |
(2) 而全文检索就是在我们查"变金刚"的时候,es给自动拆成了"变"和"金刚"两个关键字去倒排索引里面检索,发现"变"的关键词没有检索到数据,"金刚"的关键词检索到第一条索引拿到ids为1,2的两条数据,这就是全文检索,搜索"变金刚"拿到了"变形金刚电影"和"变形金刚海报"两条数据。当然这里举例是为了更好地理解这个检索过程,更多细节会在后面去讲。利用倒排索引,假设有100万条数据,拆分后假设有1000万个词语,那么在倒排索引中就有1000万行,进行全文检索的时候,可能并不需要检索到第1000万行索引,可能第一行索引就检索到了我们拆分后的关键词取到这次查询的数据。
(3) lucene,就是一个jar包,里面包含了封装好的各种建立倒排索引以及搜索的算法和java代码。作为开发人员,可以利用它提供的api来将已有数据建立索引,lucene会在本地磁盘上给我们组织索引的数据结构。但是直接基于lucene开发的话它的api是非常复杂的,实现一些简单的功能也要写大量的java代码,此外lucene只能在单台服务器上使用,最多可以处理单台服务器可以处理的数据量。
4、什么是Elasticsearch?
先贴一下ES的概念:讲一下es的概念:分布式,高性能,高可用,可伸缩的搜索和分析系统。下面依次讲解:
分布式:这里假设有P1,P2,P3,P4,P5,P6六台服务器,代表ES的六个节点。我们写入10条数据,可能会把3条数据写入到P1,3条数据写入到P2,4条数据写入到P3,这就是分布式存储,不会把数据集中扔到一台机器上撑爆磁盘。然后P1,P2,P3写入的数据会分别产生一个副本写入到P4,P5,P6。这是由ES自动给我们把数据路由过去的,作为开发人员不需要关心我们的数据最终存储在了哪台机器上。分布式以后,就可以采用大量的服务器去近实时(秒级别)存储/检索/分析PB级的数据。
高性能:这时候当我们一个查询过来了,ES发现这次查询的数据存储在P2上,同时P5上有一份P2数据的副本,于是这次查询可能会去P2或P5上拿数据,这就是ES的高性能(读负载均衡)。
高可用:假如这时候P2服务器的网线被老鼠咬断了(宕机),我们再一个查询打过来的时候就直接去P5拿数据而不用依赖P2,这就是ES的高可用(容错)。
这里要注意的是P1和P4不能是同一台机器,P1和P5可能是同一台机器。
可伸缩:假如这时候我们往里面加P7,P8节点,往ES写入新数据的时候ES可能会帮我们把数据自动分配到P7,P8上去。
搜索:全文检索,敲黑板!!!回去看1,2,3。
分析:比如我要查淘宝最近1个月访问量排名前十的品类是哪些,这就是一次数据分析。ES提供了分组,统计,筛选,排序之类的api,对开发人员而言,都是开箱即用的,非常简单。
es基于lucene,把lucene的单机缺陷封装成分布式,并且隐藏了lucene的复杂性,提供简单易用的restful api接口、java api(以及其它语言)接口,开箱即用,优秀的默认参数,不需要任何额外设置,完全开源,只需要几分钟部署就能直接用于生产环境。
总结:其实es不是什么新技术,就是将全文检索、数据分析以及分布式等技术合并在一起。通过以上描述大致把ES的关键特性给讲清楚了,之后章节我会给你们逐步揭开Elasticsearch的神秘面纱,看看它不化妆的样子~~