全文检索的介绍
1、全文检索的需求介绍
首先我们谈几个公司,如雷贯耳的:百度、谷歌、维基百科;这些公司都有一个相似性就是门户网站,可以提供我们通过关键字搜索,然后快速的检索出我们想要的信息;
【网页百度展示】
比如我们检索传智播客,百度后台就会按照这个关键字进行查找(里面有搜索库,以及爬虫库),然后按照权重来进行从上到下的排序,给我们高亮的展示出现
【京东或者淘宝展示】
随便搜索东西,就会高精度的展示我们想要的;就会根据关键词进行海量数据的快速的检索
比如我们查找:”护手霜“, 那么这期间内部会经过大体的:1、分词(护手,手霜,护等)2、根据这些词去海量的数据中检索 3、然后根据权重把检索出来的信息进行排序展示给我们
【传统做法】
那么对于一般的公司,初期是没有那么多数据的,所以很多公司更倾向于使用传统的数据库:mysql;比如我们要查找关键字”传智播客“,那么查询的方式大概就是:select * from table where field like ‘%传智播客 %’;但是随着业务发展,数据会不断的膨胀,那么问题就来了;mysql 单表查询能力即便经过了优化,它的极限也就是 400W 左右的数据量。而且还会经常出现查询超时的现象;
然后很多公司开始对数据库进行横向和纵向的扩容,开始进行数据库表的“拆分”:横向拆分和纵向拆分;但是即便这样操作,仍然会出现很多问题,比如:
1、数据库会出现单点故障问题,于是先天主从复制关系,于是增加了运维成本
2、因为对表的拆分,增加了后期维护的难度,同样也是增加了运维成本
3、即便做了大量的维护,但对于大数据的检索操作,依然很慢,完全达不到期望值
于是出现了 lucene,全文检索的工具。但是 lucene 对外暴露出的可用接口对于开发人员来说,操作是非常的复杂,而且没有效率的;于是在 lucene 的基础上进一步的封装,有了一个叫做 solr 的高性能分布式检索服务框架,但是,solr 有一个致命的缺点就是:在建立索引期间,solr 的搜索能力会极度下降,这就在一定程度上造成了 solr 在实时索引上效率并不高;
最后,出现了一个叫做 elasticsearch 的框架,同样是以 lucene 为基础,并且吸收了前两代的教训而开发出的分布式多用户能力的全文搜索引擎,并且 elasticsearch 是基于 RESTful web 接口进行发布的,那么这就意味着,我们开发人员操作起来更方便快捷;同时 es 拓展节点方便,可用于存储和检索海量数据,接近实时搜索能力,自动发现节点、副本机制保障可用性
2、非结构化数据查找方法
1:顺序扫描法(Serial Scanning) 所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用 windows 的搜索也可以搜索文件内容,只是相当的慢。
2:全文检索(Full-text Search) 将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。 例如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。 这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。 虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。
3、如何实现全文检索
可以使用 Lucene 实现全文检索。Lucene 是 apache 下的一个开放源代码的全文检索引擎工具包(提供了 Jar 包,实现全文检索的类库)。它提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便地在目标系统中实现全文检索的功能。 注意:Lucene 只是一个引擎,只是一个工具包,如果使用 Lucene 开发全文检索功能,要记住 Lucene 是不能单独运行的。
4、lucene 实现全文检索流程
1. 绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:确定原始内容即要搜索的内容→采集文档→创建文档→分析文档→索引文档。 2. 红色表示搜索过程,从索引库中搜索内容,搜索过程包括:用户通过搜索界面→创建查询→执行搜索,从索引库搜索→渲染搜索结果。
从上面了解到的知识点也可看出,索引和搜索流程图也可表示为:
总结:全文检索过程分为索引、搜索两个过程:
· 索引
1. 从关系数据库中、互联网上、文件系统采集源数据(要搜索的目标信息),源数据的来源是很广泛的。
2. 将源数据采集到一个统一的地方,要创建索引,将索引创建到一个索引库(文件系统)中,从源数据库中提取关键信息,从关键信息中抽取一个一个词,词和源数据是有关联的。也即创建索引时,词和源数据有关联,索引库中记录了这个关联,如果找到了词就说明找到了源数据(http 的网页、pdf 电子书等……)。
· 搜索
3. 用户执行搜索(全文检索)编写查询关键字。
4. 从索引库中搜索索引,根据查询关键字搜索索引库中的一个一个词。
5. 展示搜索的结果。
5、全文检索框架介绍
市面上全文检索的框架很多,较早期的一个框架就是 lucene,基本上所有的全文检索的工作都交给 lucene 来实现,但是 lucene 最大的弊端就是 API 太原生,没有经过任何封装,不太好使用。所以后来出现一个叫做 solr 的框架,它也是基于 lucene 进行改造封装和包装,将服务端单独提取出来,客户端进行请求即可。
另外一个框架就是大名鼎鼎的 elasticsearch 了,es 也是一个基于 lucene 打造的全文检索的框架,且一经推出就迅速被市场认可,市场占有率越来越多,现在首选的全文检索的框架基本就是 ES 了。
版权声明: 本文为 InfoQ 作者【五分钟学大数据】的原创文章。
原文链接:【http://xie.infoq.cn/article/635547dbc4b88fd98b2e46e3c】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论