Elasticsearch 的基本概念

作者:Medcl 

转自链接

[三国] Elasticsearch 的基本概念

Original Medcl 弹性搜索 2019-06-27

Image

张飞带着笔记本来到会议室(今天的位置是关羽家),因为关羽今天要给大家讲讲 Elasticsearch 的调研成果。关羽部门的其他成员也都来了,其实也就关平和周仓(隔壁村硬拽的)两个人。没办法,创业初期,徐州草鞋网一共就这么几条枪,这不刘总经理今天去城门口摆摊搞线下直销业务去了,因为线上网站不是还在开发中嘛。

关羽把投影仪摆弄好,就开场了:“兄弟们,大哥、翼德和我前些日子见过茅庐的诸葛先生,诸葛先生给我们介绍了非常不错的工具,叫做 Elasticsearch(简称:ES),可以用来改进我们的网站搜索,非常有前途,今天我给大家介绍一下。”

张飞点点头:“二哥,你能不能给我们讲讲 Elasticsearch 和咱们用的的数据库有什么区别啊?”

“三弟,你不按套路出牌啊,我还没开始讲,你就问问题,我这不都准备了 PPT 么?”

“二哥,别整这些花里胡哨的,大哥今天又不在,我昨晚和兄弟们喝酒喝大了,头痛的要命,简单点,能不能简单点。”

“丫给老子出去。”关羽气的脸红脖子粗,张飞一听就老实了,“是是是,我不说话行了吧。”

ES 与数据库比较

“要说 Elasticsearch 和咱们现有数据库的区别,先从我们的数据库说起吧。”

“我们的数据库主要用来存储草鞋网的业务数据,如订单、商品介绍、会员等信息,数据库是由表组成的结构,一张表里面存放若干条记录,一张表有若干个列,每列就是一个字段。他们之间有各种关系,所以传统的这类数据库也叫关系型数据库, 因为我们可以进行多张表的联合查询。关平你上次写的几百行的 SQL 还记得吗,很溜啊,你这是在用 SQL 写散文啊。”

“就是速度稍微有点慢,呵呵。”关平挠了挠头,不好意思地说。

“呵,好笑,那是相当慢好吗。咱们先来看看这个 Elasticsearch 是干嘛的。它是一个专门的搜索引擎,大家平常用的曹阿蛮公司家的汉搜,就是搜索引擎的技术,底层技术原理都是一样的。大家用的数据库里面不是可以对字段创建索引嘛,这样查起来才快,而 Elasticsearch 则是专门存索引的,索引就是为了优化查询而生的,有了索引,查询起来自然就快啦。

在 Elasticsearch 中也有和库表类似的概念,不过叫作索引(Index),索引里面的每一条记录叫做一个文档,每个文档里面有多个字段,和数据库相比,Elasticsearch 不支持索引间的任意关联查询(Join),也不支持数据库的事务操作,无法满足对数据有强一致性要求的场景。”

周仓举手道:“少爷,看样子,Elasticsearch 和数据库不是一个东西哈,但是这些事务一致性可都是基本要求啊,Elasticsearch 居然不支持。”

“没错,咱们引入 Elasticsearch 本来就不是要替换掉咱们目前的数据库,我们只需要借助它提升我们的搜索查询性能就可以了。Elasticsearch 是一个JAVA 程序,运行在 JVM 虚拟机之上,可以说是跨平台的。”

RESTful + HTTP + JSON

“JAVA 的啊,咱们没人会 JAVA 啊!”张飞又叫起来,“又要学一门新语言啊,坑人不?”

“急什么啊。”关羽继续说,“虽然 Elasticsearch 是 JAVA 写的,但是它对外提供的是 RESTful API,所以,也就是我们都熟悉的 HTTP 协议,通过使用标准的 HTTP 接口来访问 Elasticsearch,不用 Java 语言也能用的。可以说是跨语言的。”

“妈呀,吓俺一跳,我们前端界的新东西我都忙不过来了,什么 React、Angular、Vue 已经把我累得够呛,可别再让我学什么 JAVA 了。”张飞这下总算是松了一口气。

“另外,Elasticsearch 各种语言的 SDK 也有提供,根本不用担心语言调用的问题,就算是自己封装一个 API 调用,也就是拼接出一个 HTTP 请求就可以了。Elasticsearch 的输入输出都是 JSON 数据结构,这是一种 JavaScript 里面常用的数据结构,翼德应该非常熟悉了。”

“JSON 当然熟练了,今天晚上谁请我喝酒,我就教他” 张飞一脸得意。

“额,地球人都知道,还要你教,让我给你们看看一个在 Elasticsearch 里面创建索引的例子啊。” 只见关羽快速的切换了一张早已准备好的幻灯片:

POST index/doc/1
{
 "name":"关羽",
 "age":32,
 "address":"徐州大道201号",
 "date":"2018-11-11"
}
张飞一看兴奋了:“恩,JSON 这个好,简洁易懂,也支持复杂的结构表达,一个对象包含若干属性,属性又可以是另外一个 JSON 对象,用来描述业务对象真的是非常方便。这个例子的双十一也比较符合二哥的身份。”

分布式、可伸缩

“找抽是吧,你还不是一样”,讲完了 ES 和数据库的区别,打消了语言调用的疑虑,关羽接着说了下去。

“咱们业务刚起步,没有多少数据量,可是咱大哥的目标是把咱徐州草鞋做到全国。你想想咱们全国有多少双脚,要是每个人脚上都是穿咱的草鞋,那业务量有多大啊,那订单,那客户资料还不海了去啊,所以咱们要考虑后续的扩容升级的问题。

这时从门口进来一位打扫卫生的大娘,“来来来,抬脚,让一让”。

被突如其来的干扰影响,关羽脸色有点不悦,无奈,打扫卫生的大娘就是他老娘。

“Elasticsearch 支持集群部署,Elasticsearch 的每一个进程叫做一个节点(Node),如果再启动另外一个节点,它们相互之间能够自动组成一个集群。”

“牛群倒是听说过,什么鸡群鸭群的。”大娘一脸疑惑。“小关,今天叫兄弟们在家里吃了晚饭再走啊”。

“这位大娘,你扫完就撤好吧,真是的,啥也不懂。" “兔崽子,回头收拾你”。

关羽继续给大家讲道"集群啊,就是让服务器在一起协作完成一件任务,也就是说,它们可以共享服务器资源,相互之间进行通信。在 Elasticsearch 的集群里,咱们通过访问任意节点的 RESTful API 端口,就可以访问到整个集群里面的所有索引信息,而不用去关心数据的具体分布,另外数据也有副本,能够自动分布和进行故障处理,就算其中一个机器节点挂了,另外的节点也还能继续对外提供服务,同时也能保证数据也是完整的不受故障影响,不丢数据,你们说是不是很神奇啊?”

“嗯,高级、高级!”几个人异口同声。

“Elasticsearch 里面的索引是以分片的方式来组织的,一个索引底层会有多个分片,以分片为单位分布在集群中。这样的分布方式,跟数据库的 Sharding 有一拼,同样的原理,目的是避免单个索引太大,拆分成若干分片就可以解决单个大索引的问题。

未来如果我们要支持搜索业务的增长,我们只需要增加 Elasticsearch 的节点,就能够给集群添加资源,Elasticsearch 还会自动迁移旧机器的部分数据到新节点上,从而充分利用硬件资源,扩充处理能力。我听说西域有人部署过成百上千个节点的规模呢,这么大规模,好家伙。”

QueryDSL、查询与聚合分析

“二哥,你快说说,Elasticsearch 到底怎么用,刚刚听你说了这么多,感觉牛逼轰轰的,像我一搞前端打杂的,能不能很快也用起来?”张飞有点着急地说。

“三弟,你是前端大将军,不是前端打杂好嘛,Elasticsearch 对外提供的是 RESTful API,你用它的时候,不用关心底层的诸多细节。你要创建索引,你就往里面 POST 一条 JSON 数据,你要查询,你就写一个查询的 GET 请求就行了。在 Elasticsearch 里面,有一个专门的查询表达式叫做 QueryDSL,也是用 JSON 描述的,支持很多的查询类型。

此外,我们还能对数据进行统计分析,比如可以对咱们网站的访问者统计分析他们的访问时段、所在州郡、以及点击过哪些页面,这些在 Elasticsearch 通过一个叫作“聚合”的功能就能实现。

不管是查询还是聚合,Elasticsearch 给你返回的结果也是 JSON 格式的文档,拿到返回结果之后,咱们就可以在前端进行展示了。这块儿主要是三弟你的工作了。”

“如此甚好,这个小 case ,交给俺了,前端对于俺那还不是分分钟的事情。”张飞拍着胸脯说。

插件与扩展

“Elasticsearch 功能还比较多,周仓、关平,你们俩要好好研究一下,我们的一些需求不一定都能满足,不过 Elasticsearch 有非常好的插件机制,它自己就提供了很多功能,就是以插件形式放出来的。

从前面的 API 查询到底层的网络通信都可以通过写插件来进行扩展,有些需求 Elasticsearch 没有提供的,我们也可以通过自己写插件来实现,不过插件需要用 JAVA 来编写。另外就是 Elasticsearch 的部署安装你们俩研究一下。”

“遵命,关将军!”周仓和关平一起点头。

“二哥,我好像有点饿了,你们家有啥吃的不。”

“拳头吃不吃?”

“来俩呗。”

“哎呀,不敢了。”

...

刘备在城门口卖完今天的第五双草鞋,抬头看到徐州今天上空的月亮感觉特别圆,心想明天肯定又是晴朗的一天。

欲知后事,且听下回。

                                                    

已标记关键词 清除标记