搜索也称之为检索,大家对于搜索检索并不陌生,比如我们在浏览器里用百度,谷歌,对于某个问题进行搜素,又比如我们
在逛论坛的时候,我们想做某个技术相关的帖子,我们也要到搜索框里搜一搜,相关的结果看一看,这是一个搜素,还有就是
我们在操作关系型数据库的时候,我们其实查询数据结果的话,他本身也是一个搜索的过程,我们根据我们的SQL语句,数据库
会执行搜索,把匹配到的一些结果,返回给用户,这也是一个搜索,以上提到的这些搜索,跟我们今天讲的全文搜索,他有什么联系
呢,首先会对概念进行一个介绍,对ElasticSearch做一个简介,这款产品的核心概念也会做一个介绍,同时ES对Spring Boot做一个
继承,应用做一个讲解,可以掌握这门技术,首先我们来谈一谈全文搜索的概念,首先我们讲一讲数据结构,数据结构有哪些类型的
数据结构呢,首先是结构化的数据结构,这个是比较好理解的,指具有固定格式,或者有限长度的一些数据的,比如像数据库元数据
等等,比如我们在设计数据库表结构的时候,我们在增加某个字段的时候,需要指定字段的类型,那么类型就是格式的意思,我们还要指定
他的长度,所以结构化的数据特点就是这样的,具有固定格式的,以及有限长度的一个数据,这就是一个结构化的数据,相对结构化的
数据来说,就是非结构化的数据,那么非结构化的数据,他就是指不定长的,或者没有固定格式的数据,比如像邮件啊,还有各种文档等等,
word,文本文档等等,这些都是非结构化的数据,非结构化的数据的话,我们怎么来进行一个搜索,大家如果用过数据库,关系型数据库,
对于结构化数据查询的话,应该是非常熟悉的,那么非结构化的数据我们怎么进行搜索呢
非结构化数据搜索是有以下几种方式的,第一种是顺序扫描法,那么什么是顺序扫描法,字面理解,比如我要在一个
文档里面,查找某个字符串,顺序扫描法就是从头到尾,把文档里面的文本,一个一个的匹配过去,最终匹配到了,这个
就是顺序扫描法,从头到尾就是这么找下去,这种方法在操作系统里面是比较常见的,这个搜索文件的时候,他用的就是
顺序扫描法,还有在linux下,用grep命令的时候也是顺序扫描,那么这种顺序扫描的方式的话,对于小数巨量的文件的话,
那还是比较方便的,比如在我的硬盘里面,有很多资料,那我要搜索,如果你硬盘里面数据量很小,只有几个兆几个G的,
你马上可能就能搜索的到,比如我要找某个名称的文件的话,那应该很快就能够找的到,但是如果你硬盘几百个G的文件,
或者说数据量很大,文件数量很多,那么你用这种方式来搜索,很慢,用过windows系统的话就知道,又时候你硬盘放太多的
视频,然后你去找很慢很慢,所以顺序扫描法的话,他比较适合比较小数据量的文件,对于大文件的话,这种方式就比较慢了,
如果是用到大文件的话,我们 还是要采用全文搜索的方式,什么是全文搜索,其实就是非结构化数据的一部分信息,提取出来,
重新进行一个组织,使其变得有一定的结构,然后对这个有一定结构的数据,从而达到搜索较快的目的,所以我们从过程我们就
可以理解,所谓的全文搜索,所谓的非结构化数据,其实就是讲非结构化一部分的数据,就是讲非结构化的数据转为结构化的数据,
然后创建索引,来实现搜索这个目的,所以全文搜索和数据的一个搜索,走的是一个套路,假设我是结构化的数据,就是采用结构化
数据的搜索,假设我是一个非结构化的数据,那我就把它转成结构化的数据,然后建立索引再搜索,所以他们走的是一样的套路,
那么从非结构化提取然后重新组织信息呢,我们就称之为索引,那么如何来理解这个索引呢,用过字典的话都知道,一本字典永远
有很多的汉字,包括汉字的解释啊,汉字的拼音,很厚的一本,几百页,那我如何来搜索某个汉字,在茫茫的几千个汉字里面,如何找到
我想要的那个汉字呢,如果你没有学过搜索的技术,我小学没有学习字典方法的时候,我要找汉字的话是从第一页开始,从第一页
开始翻,然后一直翻翻最后一页,当然在翻的过程中,搜到了我想要的那个字,这就是顺序扫描法,我没有用全文搜索技术的时候,
只能采用顺序扫描法,顺序扫描法的话,你要搜到,肯定跟你字的排序有一定的关系,比如我这个字刚好是排在第一页的,你一翻,
就刚好翻到了,这个时候就要博一下运气了,正常情况下你要翻你要翻很多页,我才搜到这个汉字,这种搜索方式是很慢的,
那么全文搜索是怎么干呢,我这个字典为每个汉字都建立起了一套规则,怎么建立一套规则呢,我每个汉字都有一定规律的,
汉字他都有偏旁,这是一种规律,或者汉字他都有笔画,比如我这个全文的全字,这也是他的规律,还有一种呢,就是用拼音来搜索,
字母q就是全字的一个索引,刚才提到的规则就是索引,那我们要查这个全的时候,也有这么几种策略,一种是按照偏旁来搜,
这是一种策略,然后按照拼音来搜,这也是一种策略,所以全文搜索的话,他有很多的策略,那么最终的目的,都是为了加快这个
搜索
全文搜索的概念就比较好理解了,其实就是在一个文件中,文件中的所有文本,我们要搜索的项,来进行匹配的
一种检索方式,这就是全文检索
全文搜索实现的一个原理,是什么样呢,大家从字典中,字典例子中大概也可以理解了,一个原理是什么样的,
首先是要建立文本库,建立文本库是什么意思呢,其实就是我要建立我要搜索的数据源,我是一本字典,我肯定要
把我所有的汉字,收纳进来,就是我要搜索的数据源是什么,而不建立起数据源,第一步是要建立起文本库,其次我们
要把所有的文本,要把索引建立起来,比如以字典为例,我所有的这些汉字,我要提取他的一些规律出来,所谓的规律
就是索引,以偏旁的规律建立一套索引起来,或者说按照拼音来的,那么拼音也是需要建立一套索引来的,这是一个索引,
索引在不同的搜索引擎里面,他搜索策略肯定是不同的,那么建立索引的策略,也是不同的,然后是执行搜索,一般是由用户
来发起,这个搜索引擎才会搜索,然后对请求做一些处理,然后把信息返回给用户,那一般来说,将结果返回给用户之前,
其实还要做一道过滤的,为什么要做一道过滤的,其实比较好理解了,比如我们在谷歌或者百度里面,对某一个文本进行搜索,
那他的结果是很多的,成千上万的结果,那我在一个页面里面,我不可能把成千上万的结果展示在页面里面,这样子你页面也
hold不住,可能一个页面几千几万个行,你也受不了,所以搜索引擎他一般只会返回10几20个结果给你,然后采用这种分页的
形式,所以他不会把全部结果给你,他要过滤一把,可能把一些匹配度比较高的,他放到前面去了,当然有些搜索引擎比较恶劣的,
可能把一些广告商的结果,排到前面去了,所以结果搜索引擎会做一些过滤的,这就是过滤的一个用处,过滤是关乎用户体验的
一个过程
全文搜素有哪些实现的技术呢,对于JAVA来说,我们肯定不能从0开始建立起一个全文搜索引擎,对于一般的开发人员来说,
是做不到的,实际上有一些开源的技术,我们可以直接拿来用,首先大家要介绍一下Lucene,Lucene它是基于JAVA的全文搜索的
引擎,它是开源的一个引擎,那么这个引擎在业界的话,也是比较有名的,他用的也是比较多的,其次就是ElasticSearch,简称为ES,
ES是基于Lucene之上的,ES搜索引擎系统,它本身也是用了Lucene这个引擎,建立起来的,所以这个叫做站在巨人的肩膀上,ES在业界
也是非常的有名的,这么一个全文搜索系统,第三款产品叫做Solr,Solr是和ES同类型的一款产品,他也是一款全文检索系统,Lucene还
只能成为全文搜索的引擎,就像一部车一样,Lucene他是一个发动机,具体什么车,不同的车的牌子,可能用到的引擎,对于用户来说我们
买的是买个整车回来了,但是对于普通用户来说我们不可能买一个发动机,先买个引擎回来,然后自己来组装一把,显然这种工作就比较
低级,言外之意就是比较难,所以ES以及Solr,在市面上会流行起来的原因,用户肯定是越好用越好了,开箱即用,拿来就用,这种是最好的,
我们对ES会做非常多的一个讲解,那么ES和Solr有没有对比呢,其实是有一些对比的,他们优缺点大概是这个样子的,Solr在分布式管理当中,
它是利用了Zookeeper分布式管理系统,那么ES的话,他自身就带有了分布式协调管理功能,所以在分布式管理上面,ES他自己有他自己的管理
一套,Solr它是用了第三方的开源的产品,叫做Zookeeper来做分布式管理,Solr支持非常多的数据格式,比如像JSON,xml,CSV这种,而ES
支持JSON,为什么支持JSON呢,他支持RESTFUL接口,接口主要是用JSON数据格式的,然后Solr提供的一个功能的话,是非常多的,而ES相对
来说的话,他还是侧重比较核心的功能,当然他也提供第三方的插件,来对齐进行一个扩展,然后Solr在传统的应用中呢,他的表现要好于
ES,但是在实时搜索应用中呢,效率要低于ES,所以这两块产品有好有劣的,我们并不能说,某个产品一定好于另一个产品,只是对于不同的
应用场景,我们可以选择更适合的应用场合,当然在目前的市场上来说的话,ES相对来说更火爆一点,在技术上来说的话,更加主流一点,
互联网企业用的更多一点,所以我们要把握主流的