简介
ElasticSearch 是当前流行的企业级搜索引擎,能够达到实时搜索,稳定,可靠,快速,安装使用方便,它提供了一个分布式多用户能力的全文搜索引擎。好官方啊,到底它是个啥鸟,咱们还是老规矩,干。
搜索
举个简单的例子,比如要买手机,你登陆京东后,在搜索框搜索”手机“,会出现N个手机和手机周边的搜索数据
image常见搜索
百度、Google:我们想寻找一个我们喜欢的电影或者书籍就会去百度或者Google搜索一下。
互联网搜索:电商搜索商品,招聘网站搜索简历或者岗位
OA系统的搜索:员工管理搜索,会议管理搜索
数据库搜索
数据都是存储在数据库里面的,如电商网站的商品信息,如果从消费者去做搜索功能,我们会这么设计。
image我们想要搜索手机,我们会这样写SQL
select * from tb_product t where t.`name` ='手机%'
存在问题
第一、如果数据量在几万或者几十万时候,咱们可以快速查出,大家有没有想过,如果数据量在百万千万亿级别的时候,这样的查询还能满足我们的业务?
从早上开始搜索,到晚上估计还没检索完毕,我估计客户会疯掉住院😔。
第二、不能将搜索词拆分开来,只能搜索名字是“手机”开头的手机商品,如果想搜出“华为手机”或者”手机壳“那是搜索不出来的。
第三、快速聚合,实时检索,咱们看京东搜索手机那个图,一输入手机,能实时检索出符合搜索内容有多少个商品。如果是数据库存储,实时与数据库交互,数据库早晚的崩的面目全非,估计的跑路了。
So 总体来说用数据库来实现搜索,不太靠谱,通常性能也会很差 。
全文检索,倒排索引和Lucene
倒排索引
倒排索引也叫反向索引,有反向索引必有正向索引。通俗来讲,正向索引是通过key找value,反向索引则是通过value找key。
倒排列表记录了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
比如我们百度大话西游,但是手抖动输入了”大话游“,看到返回的结果就是大话西游,结果确实是我想要找到的内容。
包括大话西游游戏,大话西游电影,大话西游电视剧等各种信息,倒排索引就是将数据或者文档中的关键词拆分构建一个大表,每个文档会记录文档编号(DocID),单词在这个文档中出现的次数(TF)及单词在文档中哪些位置出现过等信息,这样与一个文档相关的信息被称做倒排索引项(Posting)。所以我们一搜索关键词,这些文档全部都会查询出来。
全文检索
当我们输入“大话游”,会被拆分成”大”,“话游”2个词,用2个词去倒排索引里面去检索数据,检索到的数据返回。整个过程就叫做全文检索
image如果用数据库的思维来做,假如一共1000W的记录,按照之前的思路就是扫描1000W次,每次扫描,都需要匹配那个文本所有的字符,确认是否包含搜索的关键词,而且还不能将搜索词拆解来进行检索 。
如果是利用倒排索引的话,假设还是1000W,拆分出来的词语,假设有1亿个词语,那么在倒排索引中,就有1亿行。我们可能不需要检索1亿次,有可能检索1次或者N+1,就能找到我们需要的数据,也有可能是100W次,也有可能是1000W次.
Lucene
Lucene就是一个jar包库,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法,在我们就用java开发的时候会用到。
Elasticsearch的包含那些功能
第一、分布式的搜索引擎和数据分析引擎
搜索:百度,网站的站内搜索,IT系统的检索
数据分析:
电商网站,最近一周手机商品销量排名前10的商家有哪些;
新闻网站,最近1个月访问量排名前3的新闻版块是哪些
第二、 全文检索,结构化检索,数据分析
全文检索:我想搜索商品名称包含手机的商品,select * from products where product_name like "%手机%"
结构化检索:我想搜索商品分类为电子数码的商品都有哪些,select * from products where category_id='电子数码'
部分匹配、自动完成、搜索纠错、搜索推荐
数据分析:我们分析每一个商品分类下有多少个商品,select category_id,count(*) from products group by category_id
第三、对海量数据进行近实时的处理
分布式:ES自动可以将海量数据分散到多台服务器上去存储和检索
海量数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了
近实时:检索个数据要花费1小时(这就不要近实时,离线批处理,batch-processing);在秒级别对数据进行搜索和分析
跟分布式/海量数据相反的:lucene,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量
Elasticsearch的适用场景
(1)维基百科和百度百科,手机维基百科,全文检索,高亮,搜索推荐。
(2)The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
(3)Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案
(4)GitHub(开源代码管理),搜索上千亿行代码。
(5)电商网站,检索商品。
(6)日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
(7)商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅手机的监控,如果iphone的手机低于3000块钱,就通知我,我就去买
(8)BI系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化国内。
(9)国内:站内搜索(电商,招聘,门户,等等),IT OA系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)
ElasticSearch的特点
(1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司
(2)Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat)
(3)对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂
(4)数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch作为传统数据库的一个。
简介
接下来可以看下Windows 环境安装Elasticsearch
一步步去更好的学习Elasticsearch
网友评论