写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
参考内容:
《Elasticsearch顶尖高手系列-快速入门篇》,中华石杉
--------------------------------------------------------------------
主要内容包括:
- 什么是搜索?
- 如果用数据库做搜索会怎么样?
- 什么是全文检索、倒排索引和Lucene?
- 什么是Elasticsearch?
- Elasticsearch的功能,干什么的?
- Elasticsearch的适用场景,能在什么地方发挥作用?
- Elasticsearch的特点,跟其它类似的东西不同的地方在哪里?
- Luence和Elasticsearch的关系
- Elasticsearch的核心概念
- Elasticsearch的核心概念 VS 数据库核心概念
--------------------------------------------------------------------
1、什么是搜索
谈起搜索的话,可能我们的第一印象就是 百度搜索、谷歌搜索、360搜索、搜狗搜索等等
如果我们想找寻任何的消息,就可以去上面几个搜索引擎中搜索,比如说找一部自己喜欢的电影,或者说找一本喜欢的书,或者找一条喜欢的新闻。但是呢,搜索并不仅仅有上面的几个搜索引擎,还包括下面的内容:
垂直搜索(站内搜索)
互联网的搜索:电商网站,比如 淘宝、京东; 新闻网站;招聘网站;各种app
IT系统的搜索:OA软件,办公自动化软件、
搜索,就是在任何场景下,寻找你想到的消息,这个时候,会输入一段你要搜索的关键字,然后就期望找到这个关键字相关的消息。
--------------------------------------------------------------------
2、如果用数据库做搜索会怎么样?
做软件开发的话, 大家都知道,数据都是存储在数据库里面的,比如电商网站的商品消息、招聘网站的职位消息、新闻网站的新闻消息 等等,所以说,很自然的一点,如果说从技术的角度去考虑,如何实现如:电商网站内部的搜索功能的话,就可以考虑去使用数据库进行搜索。
- 比如说用户在"电商网站的前端"搜索框里面输入"java开发"
- "电商网站的前端"将关键字"java开发"发送到后端系统
- 后端系统会拼装查询的sql "select * from product where product_name like '%java开发%'"
- 然后就会去数据库里面一条一条的比对
上面的执行过程会有上面问题呢:
- 比方说,每条记录的指定文本,可能会很长,比如说"商品描述"的字段的长度,有长达数千个,甚至数万个字符,这个时候,每次都要对每条记录的所有文本进行扫描,来判断说,你包不包含我指定的这个关键字(比如说:"java开发")
- 还不能将搜索词拆分开来,尽可能去搜索更多的符合你的期望的结果,比如输入"java开发",就搜索不出来"java高级教程"
所以说,用数据库来实现搜索,是不太靠谱的,通常来说,性能会很差的。
--------------------------------------------------------------------
3、什么是全文检索、倒排索引和Lucene?
(1)全文检索(倒排索引)
比如有如下的信息:
1 生化危机电影
2 生化危机海报
3 生化危机文章
4 生化危机新闻
首先对信息进行拆分:
1 生化危机电影 ---> 生化 危机 电影
2 生化危机海报 ---> 生化 危机 海报
3 生化危机文章 ---> 生化 危机 文章
4 生化危机新闻 ---> 生化 危机 新闻
建立倒排索引如下:
关键字 ids
生化 1、2、3、4
危机 1、2、3、4
电影 1
海报 2
文章 3
新闻 4
当进行搜索时输入“生化机”,首先会对信息进行拆分 “生化” “机”,然后去倒排索引中查询,会发现“生化”关键字对应有ids---> 1、2、3、4
(
ps:如果数据库的数据,一共有100W条,按照前面数据库的查询的思路,其实就是要扫描100W次,而且每次扫描,都需要匹配那个文本所有的字符,确认是否包含搜索的关键词,而且不能将搜索词拆解开来进行检索
)
(2)Lucene
就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。我们就用java开发的时候,引入lucene jar,然后基于lucene的api进行开发就可以了。用luence,我们就可以去将已有的数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结构。另外的话,我们也可以用Lucene提供的一些功能和api来针对磁盘上的索引,进行搜索。
--------------------------------------------------------------------
4、什么是Elasticsearch?
Elasticsearch是分布式,高性能,高可用,可伸缩的搜索和分析系统。
(1)Lucene封装了搜索引擎的功能(部署在单台机器上,假设磁盘就500G空间)
(2)这个时候可能就会有问题,如果我们的数据量很大,比如有1个T的数据。那这个时候在一台机器上是放不下1T的数据的。
(3)这个时候我们需要添加一个机器来存放,这个时候我们的系统就变成了分布式的了,1T的数据散落在了多个机器上。、
(4)这个时候电商网站前端要进行搜索的时候,会跟多台机器进行通信,这个过程是很麻烦的;另外还需要考虑在建立索引时放到哪台机器上面去,这个过程需要我们自己来管理;而且搜索数据时还要考虑在哪台机器上面去搜索;还有就是我们如何去保证数据不丢失,所以我们就需要保证数据的高可用性。
(5)你如果说,数据量很大的话,超过了单台机器的承受范围,你就必须得用多台机器去进行数据的存储和搜索,如果我们自己来实现会很麻烦的。
(6)所以这个时候Elasticsearch就出现了,它底层封装了Luence,并且能够建立多个分布式节点,然后对外提供统一的访问接口;这时我们在创建索引和搜索数据时会有Elasticsearch自动帮助我们选择在哪个节点上进行。
--------------------------------------------------------------------
5、Elasticsearch的功能,干什么的?
(1)分布式的搜索引擎和数据分析引擎
搜索引擎:百度、网站的站内搜索、IT系统的检索
数据分析引擎:电商网站,最近7天牙膏这种商品销量排名前10的商家有哪些;新闻网站,最近一个月访问量排名前3的新闻版块是哪些。
三个关键词: 分布式、搜索、数据分析
(2)全文检索、结构化检索、数据分析
结构化检索:我想搜索商品分类为日化用户的商品都有哪些 ---> select * from products where category_id = '日化用品'
全文检索:我想搜索商品名称包含牙膏的商品 ---> select * from product where product_name like '%牙膏%'
部分匹配、自动完成、搜索纠错、搜索推荐
数据分析:我想分析每一个商品分类下有多少个商品 ---> select category_id,count(*) from products group by category_id
(3)对好了数据进行近实时的处理
分布式:ES自动可以将海量数据分散到多台服务器上去存储和检索
海量数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而言就可以实现海量数据的处理了。
近实时:检索个时间要花费1小时(这就不是近实时了,这是离线批处理,batch-processing);近实时是在秒级别进行搜索和分析。
跟分布式/海量数据相反的:Luence,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量。
--------------------------------------------------------------------
6、Elasticsearch的适用场景,能在什么地方发挥作用?
国外:
- 维基百科,类似百度百科,牙膏,牙膏的维基百科,全文检索,高亮,搜索推荐
- The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
- Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案
- GitHub(开源代码管理),搜索上千亿行代码
- 电商网站,检索商品
- 日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
- 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买
- BI系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化
国内
站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)
--------------------------------------------------------------------
7、Elasticsearch的特点,跟其它类似的东西不同的地方在哪里?
- 可以作为大型分布式机器(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司。
- Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术 合并在一起了,才形成了独一无二的ES。
- 对用户而言,ES是开箱即用的,非常简单,作为中小型应用直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂。、
- 数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索、同义词处理、相关度排名、复杂数据分析、海量数据的近实时处理;ES作为传统数据库的一个补充,提供了数据库所不能提供的很多功能。
--------------------------------------------------------------------
8、Luence和Elasticsearch的关系
(1)Luence是最先进、功能最强大的搜索库,直接基于lucene开发,非常复杂,api复杂(实现一些简单的功能,需要些大量的java代码),需要深入理解原理(各种索引结构)。
(2)Elasticsearch,基于luence,隐藏复杂性,提供简单易用的restful api接口,java api接口(还有其他语言的api接口)
(2.1)分布式的文档存储引擎
(2.2)分布式的搜索引擎和分析引擎
(2.3)分布式、支持PB级数据
Elasticsearch开箱即用,优秀的默认参数,不需要任何额外配置,完全开源。
--------------------------------------------------------------------
9、Elasticsearch的核心概念
(1)Near Realtime(NRT): 近实时,两个意思:从写入数据到数据可以被搜索到有一个小延迟(大概1秒); 基于es执行搜索和分析可以达到秒级。
(2)Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常。
(3)Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配),节点名称很重要,默认节点会去加入一个名称为"elasticsearch"的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。
(4)Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据、一条商品分类数据、一条订单数据,通常用JSON数据结构表示,每个index下的type中都可以去存储多个document。一个document里面有多个field,每个filed就是一个数据字段。
product document
{
"product_id":"1",
"product_name":"高露洁牙膏",
"product_desc":"高效美白",
"category_id":"2",
"category_name": "日化用品",
}
(5)Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引、商品分类索引、订单索引。索引有一个名称。一个index中可以包含很多document,一个index就代表了一类类似的或相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。
(6)Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,包含用户数据type,博客数据type,评论数据type。
商品index,里面存放了所有的商品数据,商品document。
但是商品分类有很多种类,每个种类的document的field可能不太一样,比如说电器商品,可能还包含一些诸如售后时间范围这样的特殊field;生鲜商品,还包含一些诸如生鲜保质期之类的特殊field。
type: 日化用品type、电器type、生鲜商品type
日化商品type: product_id、product_name、product_desc、category_id、category_name
电器商品type:product_id、product_name、product_desc、category_id、category_name、service_period
生鲜商品type:product_id、product_name、product_desc、category_id、category_name、eat_period
每一个type里面都会包含一堆document。
(7)shard: 单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提高吞吐量和性能。每个shard都是一个lucene index.
(8)replica : 任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。 primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数据,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard。 最小的高可用配置是2台服务器。
--------------------------------------------------------------------
10、Elasticsearch的核心概念 VS 数据库核心概念
Elasticsearch 数据库
Document 行
Type 表
Index 库
--------------------------------------------------------------------