大数据搜索引擎原理分析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 开源技术

伴随着搜索技术的发展,为了便于搜索技术更好地服务技术开发人员,开源社区也衍生出了与搜索引擎相关的产品,其中优秀的搜索产品有Apache Lucene、Apache Nutch、Sphinx、Elastic Search等。

2.4.1 Apache Lucene

Apache Lucene一般简称Lucene,它是目前全文检索领域较为常见的开源基础库,由Apache软件基金会支持,是基于Java开发的全文检索工具包。Lucene并不是一款完整的搜索引擎应用程序,但它可以通过简单的接口为一些应用程序提供全文检索能力。例如,被大家所熟知的Eclipse也基于Lucene实现了全文检索功能,利用Lucene可以快速地检索Eclipse中的帮助文档。

Lucene最初通过自己的官网发布各个版本,后来通过SourceForge发布,直到2001年年底才成为Apache基金会Jakarta的一个子项目。Lucene在实际场景下的应用流程示意图如图2-9所示,先对各类数据建立索引,再基于索引为用户提供搜索服务。

图2-9 Lucene在实际场景下的应用流程示意图

目前Lucene能够对文本类型的数据提供搜索服务,这些文本类型的数据包括网页数据、Office数据、PDF数据等。只要能够将数据转换为文本类型,都可以基于Lucene提供搜索服务。

Lucene作为一个全文检索引擎,具有如下特点。

(1)独特的索引文件。一方面,索引文件格式独立于应用平台而存在,使得兼容不同操作系统或者平台的应用能够共享建立的索引文件;另一方面,在传统全文检索引擎的倒排索引基础上实现了分块索引的机制,可以针对新的文件建立索引,并且索引可以合并,不仅实现了快速检索,而且达到了索引优化的目的。

(2)强大的查询引擎。Lucene自带一套完整的查询引擎,在默认的查询引擎中实现了检索的一些基本语法,如布尔操作、模糊查询、分组查询等,使得开发者能够在默认查询引擎的基础上构建更适合各类场景的查询引擎。

Lucene作为全文检索中的基础库,已经被其他优秀的开源软件所使用,如Apache Nutch、Apache Solr、Compass、CrateDB、Elastic Search等。

2.4.2 Apache Nutch

Apache Nutch一般简称Nutch,它是基于Java开发的一个网络爬虫项目,包括一个搜索引擎运行所需要的基本内容,如网络爬虫服务、索引服务、搜索服务等。Nutch也可以理解为一个以Lucene为核心组件的搜索引擎应用程序,Lucene为Nutch提供了全文检索的索引和查询服务。在使用场景中,如果已有部分固定数据源,则可以考虑基于Lucene提供搜索服务;相反,如果数据源不稳定,需要通过第三方渠道抓取,则可以优先考虑基于Nutch提供搜索服务。

Nutch的简单工作流程示意图如图2-10所示。通过最开始的种子URL,爬虫不断地分析文档、提取URL列表,然后不断地将URL放入爬虫的队列中进行数据抓取。整个流程类似于一个完全循环的过程,URL列表中不再有新的URL。

图2-10 Nutch的简单工程流程示意图

相对于一些简单的搜索引擎,Nutch具有如下优点。

(1)Nutch依然是完全开源的,甚至对于网页排序部分。一般而言,搜索引擎公司的网页排序是高度的机密,也是保障搜索结果的重要技术手段,而在Nutch中可以修改页面的排序方案和规则。

(2)较好的扩展性。Nutch可以在多达100台机器上良好地运行。不仅如此,它还能够比较顺利地将Nutch搜索服务集成到各大信息平台中,并将结果、页面等信息展示方式自定义化。

(3)具有高度可伸缩性的爬虫,可以分布式并且友好地向第三方获取数据,如高度遵从爬虫协议抓取数据,而非暴力抓取数据。另外,Nutch的爬虫还能够优先抓取更重要的网页,而非采用固定的抓取模式。

在更多的场景中,Nutch常常被用于分布式抓取数据。现在的Nutch主要包含两个版本,分别是1.x和2.x,两者的主要区别在于底层的存储系统差异。1.x版本的Nutch是基于Hadoop架构实现的,底层存储使用的是HDFS;而2.x版本的Nutch则通过使用Apache Gora,使得Nutch可以访问HBase、Accumulo、Cassandra、MySQL、DataFileAvroStore、AvroStore等存储系统。

2.4.3 Sphinx

Sphinx最初是由俄罗斯开发者Andrew Aksyonoff开发的一款基于SQL的全文检索引擎,当前系统内置MySQL和PostgreSQL数据库实现对数据源的支持,也支持从标准输入中读取规定格式的XML数据。目前很多关系型数据库也提供了一些全文检索技术,但是Sphinx可以构建更专业的全文检索引擎。Sphinx支持的索引类型包括普通索引、实时索引及分布式索引。

Sphinx可以作为独立的服务器使用,也可以作为MySQL数据库的存储引擎。当作为独立的服务器运行时,Sphinx与数据库管理系统类似,可以通过它们的本机协议或者通过ODBC与任何兼容ODBC的数据库管理系统通信。Sphinx有三类搜索接口。

(1)SphinxAPI。如果Sphinx作为独立服务器运行,则可以使用SphinxAPI将应用程序与Sphinx相连。API可以使用官方实现的语言版本,支持PHP、Java、Perl、Ruby和Python语言,也可以使用其他非官方实现的语言版本,以及各种第三方插件和模块。

(2)SphinxQL。Sphinx搜索守护进程支持MySQL二进制网络协议,可以使用常规的MySQL API进行访问。Sphinx支持一个名为SphinxQL的SQL子集。它支持所有索引类型的标准查询,并使用INSERT、REPLACE和DELETE等方法修改实时索引。

(3)SphinxSE。Sphinx是MySQL的一个扩展数据库引擎,可以为MariaDB、MySQL数据库提供一个特殊的存储引擎。允许MySQL、MariaDB与Sphinx的搜索进程进行通信,以执行查询并获得结果。Sphinx索引被当作常规的SQL表处理。

Sphinx与MySQL协同工作的简单应用示意图如图2-11所示。通过SphinxSE可以使用类似SQL的语法,通过MySQL可以对Sphinx进行数据查询。

图2-11 Sphinx与MySQL协同工作的简单应用示意图

Sphinx在最初设计时就考虑到要尽可能地提供高速响应、占用较小空间、结果相关度更高的全文检索服务,因而具有以下特点。

(1)高性能。高性能不仅仅体现在搜索服务上,在建立索引的过程中也保持了较高的性能,并且支持分布式搜索及海量数据处理。

(2)支持SQL数据库,可以高效地使用WHERE、LIMIT等语句,可作为MySQL的存储引擎提供搜索服务。

(3)提供各类搜索功能,如支持布尔、短语、词语相似度等多种检索模式,并且提供文档摘要生成。

一般涉及信息化系统的站内搜索等,不妨考虑基于Sphinx建立搜索系统。此外,在跨机房、跨库的搜索服务中也可以考虑使用Sphinx。

2.4.4 Elastic Search

Elastic Search是目前企业级搜索中较为常见的产品之一,它可以快速存储、搜索和分析海量数据。Elastic Search是基于Java开发的,在Apache许可的条件下作为开放源码发布,并且可以在Java、C#、PHP、Python、Apache Groovy、Ruby等其他语言中使用。在常见的网站中,如维基百科、GitHub、Stack Overflow、Quora、LinkedIn、Netflix等,都在使用Elastic Search实现与搜索相关的功能开发。Elastic Search不仅是一个分布式的搜索引擎,也可以理解为一个强大的数据分析引擎。

Elastic Search的底层全文索引技术依靠Lucene进行构建,但是Lucene不能直接被用户使用,所以Elastic Search提供了一系列的RESTful API对外提供服务。Elastic Search是一个具备分布式、多用户访问功能的搜索引擎。

Elastic Search虽然在Lucene的基础上封装了一层分布式架构,但它具有如下特点。

(1)处理方式更加灵活。Elastic Search实现了实时全文索引,检索过程也接近实时,做到了百亿级数据查询的秒级响应。此外,整个配置和数据响应都是基于JSON的,更加灵活地适用于各个场景。

(2)集群可线性扩展。Elastic Search不仅可以单台部署,也可以集群部署,在集群部署时可以很方便地为集群新增机器,处理PB级别的非结构化数据。值得说明的是,集群也意味着数据的分片,数据分片可以较好地实现数据的容灾机制,集群中的负载均衡和路由功能也基本上是自动化完成的。

(3)简单,极易部署。对于一般用户而言,Elastic Search基本上可以在数分钟内完成搭建任务,可以快速满足中小型级别的搜索业务需求。甚至基于Docker可以更快速地部署服务,分布式环境的搭建也相对比较容易。

(4)可插拔式功能扩展。Elastic Search支持插件的机制,因此对于开发者而言,可以提供更适用的分词插件、同步插件、Hadoop插件及数据可视化插件等。

与Elastic Search相似的还有一款开源软件Apache Solr。如果说Lucene更多的是一个软件工具包,还不能称之为搜索引擎,那么Apache Solr则完成了对Lucene的封装,是一个真正意义上的搜索引擎框架。Solr提供了分布式索引、数据分片、负载均衡和自动故障转移及恢复功能。Solr是一个高可靠、可扩展和高容错的搜索引擎。诸如Netflix、eBay、Instagram和Amazon(Cloud Search)等企业均在使用Solr。相比较而言,Elastic Search更适合作为实时搜索引擎;而Solr在某些性能方面(如建立索引)相对较差,是传统搜索应用中有力的解决方案。