ElasticSearch 学习系列之(1)- 初识ElsticSearch

415 阅读11分钟

ElasticSearch简介

说起ElasticSearch,大家的第一反应就是这是一款主要用于搜索的高性能分布式引擎,我们可以使用这个有点重的家伙来完成一个检索功能。当然这是一个普遍的认知,我在这里重复描述也只是为我等小白扫个小盲,大佬可忽略这自嗨。
目前搜索市面上也不仅仅只有ElasticSearch,抛开ElasticSearch这款引擎本身来想一下,我们理想中的搜索引擎是怎么样子的,想必有很多的点吧,也许每个人的见解不同,在这里我阐述一下本人有限脑容量下面的一个对于搜索的理解:

  1. 第一点搜索必须快吧,这肯定是必须的必呀,要是花了好几分钟才出来,这玩意谁愿意用啊,所以使用搜索引擎的第一个指标就是快速检索出结果。
  2. 第二点必须准确吧,假如我搜索关键词电脑,结果搜索出来的结果是一些奇奇怪怪的东西,要是在这时候投屏怕不是会陷入社死的尴尬吧。
  3. 第三点对于我这种比较粗心的人还是需要有一点的容忍度,哪怕输错其中一个字,也可以给出相关的搜索结果。
  4. 第四点对于大部分人而言,相信大多数人都会希望进行搜索的时候可以有相关的搜索选项提供选择,而不是都是需要自己相办法去思考所有的关键词,毕竟人都是喜欢偷懒的,从某种程度上而言,人们的偷懒促进了现代社会的发展。

说完这几点相信很多的搜索引擎都是奔着这几个目标去的吧,显而易见,ElasticSearch满足了上面所有的搜索的基本要求,相信小白(包括我啦)到这里都很想去尝试一下,这玩意是怎么操作实现上述的一些功能的,按照以前的说法就是入门一个新东西就要”Hello world“一下,那么让我们来开始尝试一下,ElasticSearch版本的helloWorld吧。

安装

首先ElasticSearch是由Java编写的,所以运行需要相关JRE环境,这里不重复叙述JRE的安装,当然要是以前安装过就不用安装了,其实安装的教程也有很多,只是这里笔者给出自己在安装过程中的遇到的一些坑和问题。笔者使用的服务器是腾讯的云服务器linux(ps:不是打广告) 第一步当然是下载相关的包

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.1.tar.gz这里使用版本是6.4.1

切到自己的文件夹 mv elasticsearch-6.4.1.tar.gz upload/

之后是进行解压 tar -zxvf elasticsearch-6.4.1.tar.gz -C /root/work/es/

然后就可以愉快的进入bin开启启动了 敲击 ./elasticsearch 然而,额,好吧,是我的锅,开了太多应用,内存不太够用了这个时候肿么搞呢 93F8FF2C-B223-4F30-BF35-B567F70FC314.png 这个时候我能做的只是压缩一下ElasticSearch需要的内存空间了,找到相关的需要内存的配置,找到es下面的config 配置文件夹,修改里面的jvm.option文件,修改相关的分配内存

58CB601F-FE39-4AA0-986F-4CA2154DBCFF.png

5427A2B9-AE24-4767-B944-1B26FB100BF6.png 好了,解决完内存的问题,开始启动试试 A442D1BB-4672-45FA-9600-FBF23AD87FA0.png 好吧,又跪了,不能以root 用户访问了,这我就郁闷了,为啥不能以root用户进行es的启动,查了一下原来是es可以接受上传的脚本并执行,好吧,为了安全起见,所以只能控制他的权限问题,好吧既然如此我们也只能设置一下用户了 useradd elsticSearch(ps:elsticSearch为用户名) passwd elsticSearch 并把解压文件转移到相应目录下,所以移动到相对应的用户目录下 mv /root/work/es /home/elasticSearch 开始继续操作,啊咧又挂了,好吧,这还是我原来的配置没有配好,修改/etc/.bash_profile 把、etc/profile下的Java的相关配置加进去就可以了。

FB90476E-BAD9-4381-A136-370678CC1E3D.png

55D1D819-03AF-4345-A23A-ECDE79EA276D.png启动成功了使用curl http://localhost:9200便是如下返回

246D1FE5-9562-434D-99BD-933432EB4692.png 现在需要开启远程访问控制,需要配置es下面的config文件加入以下一行代码

46E7A4D0-A2D8-4512-B821-878D3B2A846F.png 此时重新启动,发现又不成功,好失败啊,但是还是得继续干不是

5A1D1119-3324-4014-B1D6-03CC8625CB02.png 按照提示修改相关的参数 vi /etc/sysctl.conf
sysctl -p 此时使用外网进行访问ElasticSearch 终于经过艰难的历程可以安装好了,上述的端口都是默认的(友情提示,使用云服务器有安全规则控制,记得把相关的端口开启),可以开始我们愉快的hello world 之行了

894E2707-1B54-4CE1-B5E6-70825092B595.png

体验HelloWorld

在进行ElasticSearch进行helloworld前,首先需要对几个相关概念进行说明,包括他的存储方式啊,以何种数据结构进行存储:

文档:ElasticSearch是面向文档的,这样是ElasticSearch中进行搜索的最小单元,如果比喻的话就是一篇文档相当于一个Excel中的一行,当然这描述的不准确,因为每一行的字段都并不是一样的,一篇文档通常是用JSON来表示,所以简而言之就是一个json串就是一篇文档,每个json串里面的内容不一样,好像没啥毛病。文档在其中有时候会有一个ID来进行一个唯一的标识。

类型映射:类型属于一个逻辑意义上的描述,很像Java类中父类的感觉,就是所有的文档都有着相似的一些特性点,因此类型可以作为逻辑意义上对文档的一个集合,换做还是EXCEL的比喻就相当于一个sheet,类似的数据统一放在同一个sheet中,这样方便进行管理,简而言之就是分分类。里面存储了一些相关字段的类型信息,比如某个字段的类型是string或者Long或者是像C语言中的结构体一样也就是嵌套另外一个json,然后这个json就可以用递归的方式来进行一个描述。

索引:而索引则顾名思义就是用来查找数据的一种数据结构,通过这种数据结构可以快速查找关键词对应的文档,获取相关地址,最后快速的定位文档,这和一些关系型数据库的索引具有相同的作用,只不过这里的数据结构不一致而已,索引也是类型的一个容器。

上面三者的关系如下图所示,当然这是逻辑意义上的关联关系,实际物理上的存储方式肯定不是这样子的,肯定是只存储了文件相关的唯一id和对应的地址。

image.png

描述玩了一些基本的概念模型之后就开始干活了,现在需要进行搜索不是嘛,而搜索很显然易见需要一些数据去被搜索啊,不然搜索啥,所以进行helloworld 的第一步就是创建文档。因为ElasticSearch支持HTTP方式进行访问,对我们开发非常的友好,当然也可以直接使用HTTP类的工具进行使用访问。在此处 我们首先发送一条curl 命令到ElasticSearch,这条命令的作用是创建相关的文档,成功之后会有的相应的返回,表示这篇文档在ES中创建完成。 C4D86ED1-7AC5-4A1F-8B39-A01FF03C8B10.png 上述的命令中 -d 后面就是文档的内容即json串,以PUT方式进行一个新增操作,其中get-together表示一个索引,而group则表示他的映射类型,最后的2表示这篇文档的id,索引+类型+文档id 可以唯一的确定一篇文档。 现在已经有相关的基本数据文档了,那么接下来都不用我多说了,肯定是建立相关的索引和映射类型啊,令人非常贴心的是,ElasticSearch有默认的设置自动创建了相关联的索引和映射类型,相关的创建特定和删除索引和映射类型下期再说,毕竟这里只是helloworld。好了,激动人心的时候到了,我要开始搜索了分别使用了全部,精确匹配搜索,和模糊搜索这三种类型。

0420BE65-9DC3-42E9-BB65-8F5F96BCB5CB.png (全部搜索) C44AA6E0-9622-4E64-BC81-DAB4F807C7EA.png (精确匹配搜索) 72D40623-A998-46D5-BDA7-2FA5482D9FE2.png (模糊搜索)

倒排索引

既然HelloWorld完之后我们就要思考,他是如何把这部分数据进行一个搜索的过程,可以观察看到几乎很多的搜索用的是Luence这个全文检索引擎工具,从这里也可以看出这个工具的高效之处,高效的原因肯定和他的设计有关系,因此都绕不开一个数据结构-倒排索引。 按照我们正常的思路进行搜索都是一个全部数据的搜索,就是一个个文件轮询过去,就像是单链表中查询有哪几个节点满足条件,当然这在数据量比较小的时候并不会有什么问题,但是当文档的数量以百万级以上时,用上面的方法进行一个数据的检索,简直是一种让人难以接受的事情,因此出现了倒排索引的数据结构,那么这种数据结构是怎么样的呢,首先我们给出一个抽象的示意图。

image.png

倒排索引对刚进来的文档进行一个索引的构建,把一份文档中所有出现过的关键字放入一个列表中,这个列表被称为单词辞典也就是对应上图的绿色部分,而相对应的文档则是如右侧的红色节点所示,当然,对应的文档不一定是按照列表显示的,也可以选择其他的数据结构比如B+树之类的,当然文档1,这个节点并不是说就存储了相对应的文档,而是存储了这个文档的唯一标志id,通过这个id可以快速的定位文档的位置。当然除此之外还要可能红色节点存储了相应的出现的频次,这为后续的给出的排序提供了依据括号表示相应的频次,当然节点里面的数据不一定只有这么一点,肯定还是有很多其他的统计。 那么肯定会有人问如果是模糊搜索是怎么排序,那么肯定是检索绿色的这排,给出相关的文档,排序什么的是按照自己定义的一些规则来进行匹配,后续文章会给出相关性的算法。

大致倒排索引的理论是这样子的,那么就给出相关的例子进行说明一下,以我们之前给出的helloword版本进行说明 两个文档的json 如下

{
  "id" : "2",
  "name" : "second Helloworld 2",
  "organizer" : "wangwu",
  "version" : "1.0"
}
{
	id" : "1",
	"name" : "ElasticSearch Helloworld",
	"organizer" : "qingtong",
	"version" : "1.0"
	}

ElasticSearch会为了每一个字段建立一个倒排索引,那么我们以name这个字段的倒排索引为例

关键词文档
second2:1
Helloworld2:1;1:1
22:1
ElasticSearch1:1

进行搜索的时候就按照这个方式先选择搜索项对应的单词列表,在列表中查询相关的值,最后给出相关的文档中的一些内容。上面过程引用网上的一张图片可以描述为

image.png

上述描述的都是逻辑意义上的数据,现在给出相关的物理机器上的数据流动。

image.png 搜索应用程序请求相关的ElasticSearch集群,指定相应的索引。显而易见,ElasticSearch对外描述的就是一个高性能高可用的搜索引擎,高可用体现在多个节点,每个节点都备份有其他节点的副本,当应用程序进行搜索的时候,指定相关的索引分片,集群会关联到相关的索引,图中的索引分片是同一个索引,每个索引进行查询的时候会打到物理节点1,物理节点会调用物理节点2,这样子就查询了索引分片0和1,然后在物理机节点1中将两者的数据进行一个整合,这样子就可以获取到一个完整的数据,分片也是实现其高性能的一种方式。

本次就给出ElsticSearch学习过程中的一些初步想法,如有错漏之处还请各位大佬指正。