学习技术的最好的办法就是看官网,不过官网往往比较“专业”,尤其是对我们来讲的英文官网。所以,在看官网之前,先通过网络了解一些概念,可以提高看官网的效率。
学习Elasticsearch,特别推荐《Elasticsearch权威指南》,官网地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_tutorial_conclusion.html
我找了个中文的pdf版本:
链接: https://pan.baidu.com/s/1jJzRoAvLJlnpmDR9hbZiVw
提取码: b3ax
写此博客,一方面记录自己学习的过程,通过总结,对于技术也有更深入的理解,另一方面,也希望可以帮助跟我很像的初学者,同时也希望得到大佬的指点。
1、网上找一些xxx入门,比如elasticsearch入门,了解一下基本概念
总结
2、跟着入门教程,下载对应的安装包,在本地跑起来hello world
总结
3、根据自己的需求,去查一下资料,快速解决当前的问题
总结
4、看官网文档/找本书,《权威指南》这种类型的比较适合实操类型的学习
总结
5、根据自己的水平,初中级者,建议找视频教程跟着从头学习一遍
总结
6、总结:
总结是最容易被忽略的一个步骤,大部分人不够重视总结,大部分人会“高看”自己,把学的当时“好像”明白了,当做真的深入理解了。还有一部分人,会因为懒。哈哈,强调总结很重要,这是一种看上去很慢,但可以走的更远的路。
总结,就像是在铺路,看上去很慢很慢,但总结的深度就是这条路铺的宽度,总结的越深刻,路越宽阔,将来就可以行走的越快,行走、自行车、汽车、高铁……
了解ES,必然要了解和它相关的几个概念:搜索、搜索引擎、Lucene、全文检索、倒排索引、分布式、数据分析、数据分析引擎、文档存储引擎。
把这几个概念加起来就是ES了。
(1)ES是基于Lucene开源框架开发的、底层数据结构为倒排索引,分布式的全文搜索引擎、数据分析引擎、文档存储引擎,支持PB级的数据量。
(2)ES可以大到部署千百台机器的分布式集群,也可以小到在个人电脑上部署单机。拆装即用,对于中小型企业来说,下载解压启动运行,3分钟,即可以满足生产环境的使用。
(3)与关系型数据库,如mysql,在全文检索、同义词处理、相关度排名、复杂数据分析、海量数据搜索分析等方面,作为数据库的补充。
嗯,这些概念,看上去不少,但是学习要循序渐进,对于生疏的概念,不必要立马都搞懂,可以带着问题往下学,哈哈。让自己开心最重要!
说到搜索,我们首先想到的大概就是百度、Google,没错这是非常典型的搜索引擎,我们可以称之为互联网搜索,搜索其实还有更广泛的概念,所有“搜”,“查”都可以叫做搜索。
比较常见的搜索还有站内搜索,如电商网站、新闻网站、社交网站、招聘网站等。
IT系统搜索,如企业的OA系统、财务管理软件中的搜索、政府政务网站等。
全文检索,一句话描述就是,对某个文档的任意内容、或对某个表的任意字段的任意内容都可以进行搜索。
相对的概念是 结构化检索
我们用一个例子来说明结构化搜索和全文检索的区别。
结构化检索:我想搜索商品分类为日化用品的商品有哪些。
sql:select * from products where category=‘日化商品'
全文检索:我想搜索商品名称包含牙膏的商品。
sql:select * from products wherename like '%牙膏%'
数据分析:我想分析每一个商品分类下有多少个商品
sql:select category_id, count(*) from products group by category_id
Lucene是一个全文检索的搜索引擎库,对它是个库。重要的是开源,感谢开源,否则ES可能没那么快出来了。
ES就是基于Lucene开发的,隐藏了Lucene调用的复杂性,并实现了分布式,提供了简单易用的restful api接口、java api接口。是的,Lucene本身只是一个库,是没有提供restful接口的。
倒排索引也叫反向索引,通俗来讲正向索引是通过key找value,反向索引则是通过value找key。
比如我有这样三条数据:
id | username | remark | age |
---|---|---|---|
1 | 张三 | 爱好:唱歌、跳舞、打羽毛球 | 15 |
2 | 李四 | 爱好:踢球、篮球、打羽毛球 | 16 |
3 | 张三 | 喜好:看电影、跳舞 | 16 |
关系型数据库,我们会对id建立索引,查询数据的时候是先知道id,然后根据id查找整条数据。
select * from user_info where id = 1;
ES的倒排索引怎么做呢?
先对每个字段进行分词,之后将分词与id进行对应,如下:
(1)首先是username字段
term | posting list |
---|---|
张三 | 1 3 |
李四 | 2 |
(2)其次是remark字段
term | posting list |
---|---|
爱好 | 1 2 3 |
唱歌 | 1 |
跳舞 | 1 3 |
打羽毛球 | 1 2 |
踢球 | 2 |
看电影 | 3 |
(3)最后是age字段
term | posting list |
---|---|
15 | 1 3 |
16 | 2 |
全文检索的时候,根据字段的term直接定位到id所对应的当前数据。关于倒排索引,这里只做简单的了解,后面还会继续深入探索。比如倒排索引的数据结构,为什么会搜索快?查找term的速度为什么快?
很难解释清楚为什么要写这几个概念,上来就罗列这几个概念,似乎有些唐突,那么就做个白话说明,尽我最大的力量,说明一下。
既然ES是一个分布式的搜索引擎、数据分析引擎,那么它是基于什么搜索、分析的呢?当然是数据,那么数据哪里来的?当然是我们保存的,那么我们保存到哪里了呢?是的,在硬盘中,以文档的形式保存在机器(服务器或者个人电脑的)上的硬盘中。
OK了,既然是保存在硬盘中,和我们的word、excel、pdf等文件有什么区别呢?是的就是这点区别。word文件后缀为.doc、.docx,excel文件的后缀是.xls,.xlsx,那么ES保存的文件是不是也有个后缀?在windows系统下是的。跟mysql也有自己的数据库文件一样,ES也有自己的文件。
那么,如何mysql有自己的一套格式,来解析自己的文件,ES也有自己的一套格式来解析自己的文件,并有与之对应的操作相关概念:
于是就有了以下几个概念::
ElasticSearch | RDBMS |
---|---|
索引(index) | 数据库(database) |
类型(type) | 表(table) |
文档(document) | 行(row) |
字段(field) | 列(column) |
映射(mapping) | 表结构(schema) |
全文索引 | 索引 |
索引在ES中有两层意思,一方面 索引(index)是ElasticSearch存放具体数据的地方,是一类具有相似特征的文档(document)的集合,相当于关系数据库中的一个数据库实例。另一方面,索引还可以作为动词,表示对数据进行索引操作。
在6.0之前的版本,一个ElasticSearch索引中,可以有多个类型;从6.0版本开始,一个ElasticSearch索引中,只有1个类型。一个类型是索引的一个逻辑上的分类,通常具有一组相同字段的文档(document)组成。ElasticSearch的类型概念相当于关系数据库的数据表。
文档是ElasticSearch可被索引的基础逻辑单元,相当于关系数据库中数据表的一行数据。ElasticSearch的文档具有JSON格式,由多个字段组成,字段相当于关系数据库中列的概念。
ElasticSearch | RDBMS |
---|---|
查询DSL | SQL |
GET | select |
PUT | insert/update |
POST | update |
DELETE | delete |
从这几个概念上也能看出,ES的restful风格,哈哈。
稍微介绍一下,这个PUT和Post的区别,PUT可以insert也可以update,但是如果想做update操作的话,必须把document的所有字段都带上,而POST是对应update操作,即,想修改哪个字段,只写该字段即可。
具体的实例,后面的文章会给出。
另外,由于是分布式的,ES要管理分布式,所以和ES分布式相关的几个概念如下:
与所有分布式概念一样,集群和节点。每启动一个进程叫做一个节点,一般我们每台机器上起一个节点,所以可以理解为一台启动着ES的机器叫做一个节点,所有的节点组成一个集群。
shared 是primary shared的简称,指的是主节点
replica 是replica shard的简称,指的是备份节点
shared 好处:
1、横向扩展:比如数据量由3T 增加到了4T,可以从原来的3个shared,重新建立一个有4个shared的索引,将数据导入进去。这一切ES都已经帮我们做好了,对使用者来讲是透明的。
2、数据分布到多个shared,也就是多台服务器上,所有的操作,都会在多台服务器上进行并行分布式执行,提升吞度量和性能。
既然是散步到不同的服务器,那么,某些机器宕机,如何保证数据不丢失?对,就是replica。
(1)每个index包含多个shard
(2)每个shard都是一个最小工作单元,承载部分数据,lucene实例,完整的建立索引和处理请求的能力
(3)增减节点时,shard会自动在nodes中负载均衡
(4)primary shard和replica shard,每个document肯定只存在于某一个primary shard以及其对应的replica (5)shard中,不可能存在于多个primary shard
(6)replica shard是primary shard的副本,负责容错,以及承担读请求负载
(7)primary shard的数量在创建索引的时候就固定了,replica shard的数量可以随时修改
(8)primary shard的默认数量是5,replica默认是1,默认有10个shard,5个primary shard,5个replica shard
(9)primary shard不能和自己的replica shard放在同一个节点上(否则节点宕机,primary shard和副本都丢失,起不到容错的作用),但是可以和其他primary shard的replica shard放在同一个节点上
即使其中某个shared宕机,不会丢失数据。
默认一个index有5个primary shared,每个primary shared有一个replica shared,并行处理,提高请求的吞吐量和性能。
写入数据到被读取1秒,数据分析秒级,即两个意思:搜索秒级、分析秒级
介绍概念略显啰嗦,后面的文章会精简很多。希望读者见谅。由于个人能力有限,如有问题,敬请指教。
参考文章:
https://www.jianshu.com/p/bcffe33f55ab
https://blog.csdn.net/weixin_41290471/article/details/90318123