分享

空间属性一体化全文检索方案:4.关键技术之Elasticsearch简介

 godxiasad 2023-04-21 发布于北京

前文再续,书接上一回。

今天是空间属性一体化全文检索系统设计的第四节,介绍全文检索引擎Elasticsearch(以下会简称为ES),当然如果你已经用过ES,乃至于号称精通ES,这一节也可以跳过。

在第二节的时候,我们曾经简单的介绍了一下啥是ES。

——ES是一个以Lucene为基础开发出来的开源的、分布式、高可扩展的全文检索、数据分析引擎,它对外提供Restful风格的API,并且具有实时、稳定、可靠、快速、安装使用方便等多种特性。

在讲ES之前,先说一个在IT业界广为流传的段子:

话说,有一天爬起来,发现ES更新发布了一个新版本,决定下下来看看,点击开始下载,还没有下载完,卧槽,又更新新版本了……

从这个段子,就可以看出,ES最出名的就是他的更新速度了,那是真的没事就更新,频率直追手机APP的干活

因为我们整个全文检索系统,基本上都是构建在ES上面的,所以今天我们具体来介绍一下ES到底是啥,有些什么特点。

要说ES,不得不先说一下Lucene,这个东西也是大名鼎鼎的Doug Cutting开发的,而Doug同学有一个更加大名鼎鼎的称呼:hadoop之父:

Lucene是用JAVA写成了一个全文检索底层功能框架,而不是一个可以直接使用的软件,但是它已经具备了全文检索系统的所有功能。现在包括ES也都是架构在Lucene上面的。

那么看到这里,有同学就会,Lucene已经能够实现所有的全文检索功能,为什么我们还要用ES呢?答案是Lucenen是纯JAVA开发,而且也只对外提供JAVA开发接口,你想用它, 就得全部使用JAVA来继续开发。而且它仅仅是一个功能框架,你想用,从往里面写数据开始,到查询,到持久化、数据备份等等功能,都得自己编程来做,这样就非常麻烦。

所以,一个叫做 Shay Banon 的码农,就在Lucene上面,重新包装和开发了一套可以直接使用软件,最后被命名为Elasticsearch

ES是一个相当相当强大的全文检索架构神器,我们来看看它的特点。

ES主打的特点有以上五个:

1、强调实时分析能力,这个实时的概念有两个,一个是即席分析,即你输入条件之后,马上给你返回结果,不需要等待;二就是数据入库之后马上就可以进行查询分析,不需要复杂处理很等待。ES可以最大限度的发挥出软硬件性能,实现实时分析和处理。

2、实时存储,数据入库之后,就自动进行分片,无论有多少台机器组成的集群,内部都通过实时并发进行同步和更新,具有极高的安全性。

3、分布式集群:ES可以根据需求,很轻松进行横向扩展,支持最大达到PB级别的规模。并且利用分布式集群的计算能力,大大提升快速检索的速度。

4、快速搜索:ES可以并发从N台机器组成的集群中去获取数据,可以在秒级完成数十亿级别规模的数据的快速查询检索。

从上面这几个特点,实际上很明显的可以看出,ES主打的就是海量数据的快速搜索,可以看成,它就是一个专门负责查询的利器。

我们来看看ES的一些基本概念,首先我们通过数据库的概念来进行直观的对比

我们都知道,数据库架构自上而下分别是数据库——表——字段——记录,ES从逻辑上也可以直接来分,最上层叫做索引(index)对应的是数据库,在6.x版本之前,每个索引里面可以多个type(对应表),在6.x版本之后,废弃了type,也就是直接理解一个Index就一个表即可。

之后数据库还有字段(表结构),在ES里面叫做Mapping,也可以启动定义字段的作用。最后数据库的表里面记录的是一条条的记录,而在ES里面叫做文档(document),一个文档可以看成是一条记录。

当然,这里仅仅是用来对比,让大家有个直观的感受,实际上数据库上面的概念和ES里面的概念,无论从技术实现还是从原理上来说,都是有显著的差别的,比如两个数据库要做联合查询,是一件非常麻烦的事情,而ES里面,两个甚至多个索引可以同时在一个查询任务里面,被同时检索,这就是因为ES的index本身设计的原理了,这里不详述,有兴趣的同学可以去查阅相关的技术文档。

ES的集群组织模式,与普通集群的组成模式是一样,只是称呼不同,每个ES服务器在集群里面,叫做一个节点(node),多个节点,会组成一个集群(cluster),然后每个节点下面,有若干个分片,每个分片里面就存储着我们的信息。

说到ES的集群,用过的同学都不得不点赞他的设计,不用于其他集群服务器的复杂部署,ES的集群部署特别简单,只要在配置文件里面,把多个节点的集群ID设置为一样,就可以了,ES会自动把这些具有相同ID的节点给组织起来,变成一个集群(当然,网络能相互通的情况下)。具体的,有兴趣的同学去用用就知道。

下面再来介绍一下ES的一个基本概念,就是索引(index)。开始我们简单的介绍一下,可以类比对应数据库中的库的概念,但是实际上,ES的里面索引有多种解释。

首先从结构上来说,索引就是一个逻辑概念,它实际上并不是物理存在的,我们的数据放在每个节点的分片上,索引只是指向这些分片的一个逻辑命名空间。当我们需要进行查询的时候,系统会把命中的数据所在索引返回给我们,让我们可以按图索骥。

下面这个GIF动画图,就是索引的工作方式的示例:

ES里面采用的索引技术称之为倒排索引,我们简单的介绍一下啥叫倒排,首先来看看传统意义上正排索引。

比如我们要在数据库里面查询一条记录,如要找“name = jack”这个条件的记录,如果name这个字段已经做了索引的化,首先肯定是找j开头的单词在,然后在j开头的词里面,去找第二位是a,即ja的词,之后再试第三位c,依次类推,最终把jack全部找到位置,这种自上而下的查询方式,称之为正排索引。

而ES里面的倒排索引却恰恰相反。倒排索引是一种专门用于全文检索的索引方式。

首先,系统会把你输入的所有文本都切分成一个个细粒度的词(ES的专业术语叫做term),然后把这些term作为key,包含这些term的文本作为value,组成一个hash列表。

之后你要查询的时候,首先就通过key,直接索引到了你需要的词,然后反过来,从这些词去寻找,他来自哪个doc,又隶属于那个Index,最后这条数据存储在哪个shards上面,最终完成搜索。

下面我们来看看ES数据分片机制,下面这个动画就是整个分片的流程。

首先我们的数据可以直接写入到标记为Master的节点的分片里面,然后系统会自动并发,把这个分片同步到其他的节点上,同样的,你可以把数据写入不是Master的节点上,也就是说,ES的任意节点都可以自由的写入数据,它会自动进行同步。

接下去要查询的时候,首先是由被标记为Master的节点来处理用户请求和组合查询结果,当我们的Master节点意外挂掉之后,会由其他的节点动态选举产生新的Master,保证系统的高可用性。

下面简单介绍一下ES的功能和API。

ES提供标准的Restful风格的的API,所以也就是四种标准操作:增(POST)、删(DELETE)、改(PUT)、查(GET)。

要注意的是,ES的数据写入(增),相对于数据库来说,并不太快,因为设计到分片同步和索引,我这的测试(ES6.x版本),单节点,用Python API写入,每秒钟大约只能写入6000条件记录左右(当然,也有一些加速的手段),但是对于关系型数据库用标准集合或者模板进行导入,每秒百万条这种,就没法比了。

ES的删除也不是物理意义上的删除,它的操作是在你要删除的地方给打上一个逻辑标记,而并非真实删除掉,这样在某些特殊情况下,你就可以有机会去找回你误删的东西。

ES的修改,也与数据库不一样,他不支持普通意义上的修改,他的修改实际上是由删除和新增两个操作来完成的,首先把你需要修改的数据删掉(打上逻辑删除标记),然后再新增一条你修改之后的记录,所以ES里面的修改,实际上是最消耗资源的。

最后是ES的拿手绝技,就是查询。可以说,ES就是天生为查询而设计,首先它支持全套的标准结构化查询方式(数据库能查的功能,他都能查),而且还提供了各种复杂的脚本能力(ES的查询脚本叫做painless……你没有看错,就是painless abortion的那个无痛……),这个脚本的语法有点像Javascript,可以在更加复杂和精确的情况下,操作ES。

最后来聊一聊ES的属性存储模型。ES采用的Key-Value存储模型,你可以把ES里面的doc,都看成是一个个的json就行。

json是一种比较灵活宽泛和松散的轻量级数据模型,它没有强制的格式要求,所以我们在ES里面,也无需对于每一条记录(doc)都保存完全一样的结构,哪怕他们在同一个index里面,也可以结构不同。

如上所示,我们要记录四个人的信息,比如名字、性别、生日和兴趣,这四个字段都是一样,但是每个人还可以有不同的信息,比如李玲她可以记录她的相片,而王铁锤可以记录他的博客地址以及学籍,最后赵A可以记录他的职业。这些结构都可以共存在一个index里面,不会产生任何问题。

这种存储结构,也就是所谓的列式存储的表达方式之一,有兴趣的同学可以去了解一下列式数据库。

预知后事如何,请听下回分解。

最后还是广告:

有需要的详细咨询了解其中的一些关键的技术细节的同学,可以与虾神单独联系。

联系方式:关注公众号,然后发送2,获取虾神的个人邮箱。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多