本文简单介绍4个问题:
目录
1、什么是搜索
首先需要了解什么是搜索,我们一提到搜索,可能立刻想到的是百度或则谷歌,没错,这是搜索的一种,百度提供搜索的入口,我们可以搜寻我们需要的信息;另外一种搜索也是比较常见的,垂直搜索,也叫站内搜索。站内搜索有两种。第一种,比如说一些电商网站,职位招聘网,新闻网站,或者是各种APP了,这都是一些互联网的搜索。第二种就是一些OA软件,办公自动化软件,项目管理,或者一些管理系统的搜索。
坦白一些,搜索就是根据我们数据的关键字,查询出我们想要的信息或者相关的信息。
2、什么是基于关系型数据库的搜索
一般我们的搜索的数据都是存储在我们的数据库中。像以上传统的在数据库中搜索的时候,欧乐牙小膏是搜不出来的,它只能搜这种“牙膏”两个字是相邻的数据出来,但其实,这四条都是我们想要的数据。或者说我想搜索中华牙膏,但是不小心搜索的时候少了一个字,或者其他什么原因,我就是少一个字,中牙膏,这样搜显然也是搜不出数据来的,事实上,数据库中确实是有这一条数据的,而且这一条数据也确实是我们想要得到的或者我们希望返回这一条数据。
这种数据库的搜索的一个弊端到这里就体现的很明显了把,这种搜索的性能或者效果,显然不太理想,因为它不能讲搜索的关键字分离开,以检索出更多符合搜索关键词信息的数据。
3、什么是全文检索(倒排索引)
说到全文索引,就必须引出一个词: 倒排索引;
以下整个过程是全文搜索:
当输入 ‘生化机’来搜索生化危机的相关信息时, 他会把‘生化机’ 拆分成 ‘生化’ 和 ‘机’ ,这样的话,就直接可以返回4条有关生化危机的数据了。这就是倒排索引。
现在数据库和倒排索引进行比较:
- 数据库:假设数据库中的数据有100万条,那么查询的时候,就要检索100万次,而且每扫描到数据库中的一条数据,都需要匹配这个文本的所有字符,比如说,我们输入的是‘生化机’,但是数据库中对应的这个字段是‘......生化机.....’,可能有十几个字符,或者几十个上百个,这样匹配起来,而且不能把关键字拆分开来进行搜索,效率其实是比较低的。
- 利用倒排索引的话,假设有100万条数据,拆分出来的词语可能有1000万条,那么在倒排索引中就存在1000万行,可能看起来很多,但是我们实际中搜索,可能搜索到前100条就查到了对应的数据。而且,把数据拆分成多个词语,在扫描匹配的时候,效率会比较高。可能你会有疑问,万一每次都是搜索到500万条呢?这里我们在搜索的时候会介入多种搜索算法,这个我们之后会提到的。
那什么是Lucene呢?
Lucene 是一个jar包, 里面封装好的各种建立倒排索引,以及搜索的代码,包括各种算法,我们在进行Java开发的时候,会在项目中引入Lucene的Jar包或者依赖,基于Lucene提供的Api进行开发。我们可以利用Lucene来把已有的数据建立索引,Lucene会在我们的本地磁盘上,帮我们组织数据结构。我们也可以使用Lucene提供的API来对磁盘上的索引数据,进行搜索。
4、什么是ElasticSearch
假设有1T数据,我们单台机器存放500G的数据,需要2个机器存放数据。第一,当前端搜索发送请求的时候,需要判断搜索的请求指向那台机器,需要与多台机器进行通讯,很麻烦。而且,比如B机器宕机了,相当于一半的数据丢失了,这可能会影响到数据的搜索结果。对于系统的高可用方面,不太理想。
到这里就需要引出Elasticsearch了,es是基于lucene进行封装的,它可以创建多个节点,进而搭建es服务集群,每个节点上可以封装lucene。这个集群会提供一个统一的对外地址,我们只要将我们的请求打到这个集群的地址上,集群会自动的管理如何将数据更加均匀的存储在集群的节点上,集群也会透明管理搜索的请求如何相应到节点上,然后将查询的结果封装起来,统一的返回。而且,es集群会有副本存储机制进行数据容灾,保证了某个es节点宕机之后数据不丢失,查询结果不会收到影响,当然es集群会进行一些优化,从而保证搜索的性能。
Es的搜索功能十分强大,它封装了更多高级的功能,提供给我们更多的支持,我们能够进行快速的开发更加复杂的应用,复杂的搜索功能,聚合分析的功能,基于地理位置的搜索。
ElasticSearch的功能
- 分布式的搜索引擎和数据分析引擎
比如电商网站,分析畅销榜,新闻点击数量,头条
- 2.全文检索 结构化检索 数据分析
全文检索:比如搜索商品中包含‘牙膏’的商品,select *from product where prodect_name like “%牙膏%”;
结构化检索:检索商品分类为日化用品的商品,select * from prodect where category_type = “日化用品”
数据分析:分析每一类商品下的商品数量: select count(*) from product group By category_id
除了以上三种,还有部分匹配,自动完成,搜索纠错,搜索推荐等等;
- 对海量数据进行近实时的处理
与分布式相关的功能。采用分布式存储之后,可以搭载在多台服务器上去存储和检索数据,可以实现海量数据的处理;而lucene则只能在单机上处理数据;近实时体现在es检索和数据分析体现在秒级别;
ElasticSearch使用场景
-
维基百科,全文检索,高亮搜索,推荐搜索;
-
新闻网站,社交网站
-
Stack OverFlow(国外程序异常讨论网站,可以关注一波)
-
GitHub 开源代码管理 搜索上亿行代码
-
电商网站,这个之前提到了
-
日志数据分析,logstash采集日志,进行复杂的数据分析
-
商品价格的监控,消息通知
-
Es进行数据分析与数据挖掘,kibana进行数据可视化
ElasticSearch的特点
- 可以作为一个大型分布式集群技术,处理PB级数据,也可以运行在单机上,规模可大可小;
- 将全文检索,数据分析与分布式技术融合在一起;
- 对用户而言,使用方便,开发较lucene简单;
- 弥补了关系型数据库在特殊应用场景下的不足,比如全文检索,同义词处理,相关度排名,海量数据实时处理等;
后面的博文中将一步步深入学习ElasticSearch,敬请关注!