搜索引擎的研究与实现
2015-12-23李水莲
李水莲
(连云港财经高等职业技术学校,江苏 连云港222003)
信息时代的爆炸带来的是海量数据的发展,而搜索引擎带来了大浪淘沙的功能。 网民们通过搜索引擎都能够找到自己所需要的网页,并且通过搜索引擎还能快速找到帮助自己发展的位置。 而搜索引擎的发展从第一代简单的搜索,到当前复杂的数据挖掘,这其中的过程如下:
第一代引擎出现在1994 年。此代的搜索引起内容简单、搜索的范围不广,而且他们对于搜索到的资讯和时间要求都不很严格,导致了在搜索过程中,人们经常需要花费大量的耐心来进行检索,一般检索的时间要等到10 秒或者更长。这一代的搜索使用的技术是在线搜索和IR 搜索技术。 根据数据统计,在当时在网络爬虫的数据大约每天1500 次查询左右。
第二代搜索是建立在第一代搜索的基础之上的。 由于第一代搜索的速度非常缓慢,第二代搜索在采用新技术——分布式响应方案的基础上,提升了相应规模和相应速度,通过建立起一个大型、分布式的索引数据库,每天直接对应各种用户的需求, 并能够快速的进行反馈。这种索引快速,导致了用户数量的不断增加和扩展。
第三代搜索是在获取用户数据上的。 通过搜索引擎充分理解用户的需求,分析用户对当前数据的安排和内容,并直接响应出用户检索的内容,减少用户的查询时间和响应时间。 这种检索方式,需要充分利用用户与检索内容的交互,进行数据挖掘和数据分析,方能实现。
我们当前正处于第二代和第三代搜索之间, 在减少响应速度和响应时间之间,著名的搜索公司Google 和国内的百度有着自己的发展方向。
在因特网领域,搜索引擎技术得到了广泛使用,然而他在国内外的含义却有所不同。 在美国搜索引擎通常指的是基于因特网的搜索引擎, 他们通过网络机器人程序收集上千万到几亿个网页, 并且每一个词都被搜索引擎索引,也就是我们说的全文检索。 在美国,他们通过网络机器人程序收集上千万到几亿个网页, 并且每一个词都被搜索引擎索引,也就是我们说的全文检索。著名的因特网搜索引擎包括First Search、Google、HotBot 等。 在中国,搜索引擎通常指基于网站目录的搜索服务或是特定网站的搜索服务,本人这里研究的是基于因特网的搜索技术。
一、搜索引擎的结构
本文基于浏览器/服务器(Browse/Server)结构,使用JSP 作为开发语言,J2EE 作为开发工具,MySQL 作为数据库,并在Tomcat5.0 上进行发布。 由于JAVA 语言具有可移植、安全性、解释执行、高性能、动态性,以及稍做修改后就具有跨平台性的优点, 使得本系统操作方便、快捷。
1、网络蜘蛛概念
网络蜘蛛即Web Spider , 是一个很生动的名字。 假如我们把互联网比喻成一个蜘蛛网, 那么Spider 就是在蜘蛛网上爬来爬去的蜘蛛。 通过网页的链接地址, 网络蜘蛛从网站某一个页面( 通常是首页) 开始, 通过读取网页的内容, 找到其他网页的链接地址, 然后再通过这些链接地址继续读取下一个网页。 这样一直循环下去, 直到把这一网站所有的网页都抓取完为止。 如果把整个互联网当成一个整体网站, 那么网络蜘蛛就是通过上述原理抓取Interner 网上的所有网页。 对于搜索引擎来说, 要抓取互联网上所有的网页几乎是不可能的, 从目前公布的数据来看, 容量最大的搜索引擎也不过是抓取了整个网页数量的百分之四十左右。 这其中的原因一方面是抓取技术的瓶颈, 无法遍历所有的网页, 有许多网页无法从其它网页的链接中找到; 另一方面是存储技术和处理技术的问题,如果按照每个页面的平均大小为20K 计算(包含图片) , 100 亿网页的容量是100 ×2000G 字节, 即使能够存储, 下载也存在问题( 按照一台机器每秒下载20K 计算, 需要340 台机器不停的下载一年时间, 才能把所有网页下载完毕) 。
2、网络蜘蛛的主要技术
在抓取网页时, 网络蜘蛛一般有广度优先和深度优先两种策略。 广度优先其实就是一种并行处理, 网络蜘蛛通过起始网页中链接的所有网页, 选择其中的一个链接网页, 抓取在此网页中链接的所有网页,依次扩展,从而提高其抓取速度。 深度优先是指网络蜘蛛会从起始页开始, 一个链接一个链接地跟踪下去, 处理完这条线路之后再转入下一起始页, 继续跟踪链接。 这一方法的优点是网络蜘蛛在设计时比较容易。 相对于深度优先来说,广度优先要常用的多。
目前一般的网站都希望有更多的访问者访问, 也就是需要有更多的搜索引擎找到访问的网页,也即是全面地抓取自己网站的网页。 为了让本网站的网页更全面地被抓取到, 网站管理员可以建立一个网站地图, 即Site Map。 网络蜘蛛通过sitemap.htm 这个入口爬取这个网站的网页,抓取这些文件后,通过读取其中的文本信息,提取对搜索引擎的搜索准确性有重要帮助的文档信息, 同时, 这些信息也利用网络蜘蛛正确跟踪其它链接。 在搜索引擎中网络蜘蛛占有重要位置, 对搜索引擎的查全、查准都有影响, 决定了搜索引擎数据容量的大小。 同时,它的好坏还直接影响到搜索结果页中的死链接( 即链接所指向的网页已经不存在) 个数。
二、搜索引擎总体设计
现实环境中,有许多用户都有搜索服务的需求,例如很多网站都渴望有自己的站内搜索,这当然可以通过数据库来简单实现,但是在搜索服务器的负载量很大的情况下,数据库是无力应付的,而且数据库简单的基于字符串匹配的方式也显得过于呆板, 不能提供更多的高级搜索功能。 有的用户可能会选择自己组建开发团队来开发搜索引擎, 也可能会购买商用的搜索服务器软硬件来搭建搜索平台。 不过, 笔者认为普通用户也可以选择简单地购买搜索服务,不需要自己的开发团队,也不需要自己购买搜索服务软硬件。 也就是说, 用户只简单地提出搜索服务要求,其它一切都交给搜索服务提供商,软硬件和数据维护与更新都交给服务提供商。
在上述情况下, 一个搜索引擎服务器提供商可以为若干个客户提供搜索,他们需要根据不同用户的需求去设计数据的索引策略和搜索策略,同时需要在自己的服务器主机上保存和维护不同用户的数据。 Solr1.3 优秀的多核心性能正好能满足这样的需求, 一方面多核心可以实现多库, 也就可以实现多个服务并行提供; 另一方面Solr1.3 的各个核心之间的独立性和可配置性,又使得搜索服务提供商可以根据不同用户的需求来进行个性化的配置。
这一章将基于Solr1.3 来设计一个在同一个服务器对两个大学(北京大学、中山大学)网站进行搜索的合成搜索引擎。主要目的是要利用Solr1.3 的多核心特性来设计一个多索引库的应用场景。 本设计无意追求真实场景中的搜索性能,只是提供一种基于Solr1.3 开发多应用搜索引擎的思路。 设计注重管理与普通使用的分离, 将所有管理操作都纳入同一个Web 页面下以提供管理的方便性,同时尽量考虑将来的扩展需求。
1、整体结构与模块关系
基于Solr1.3 的搜索引擎实现的结构,是常用的一种结构,该结构具有索引更新、索引删除、查询、分词、网络蜘蛛、索引库、New API、Solr Core API 八大模块(由于管理员页面与普通用户查询页面只是简单的HTTP 接口调用,所以不将他们算作单独模块)。 这八大模块中除Solr Core API 模块外,其他模块都是我们需要实现或配置的。图中的箭头表示模块间的调用关系, 虚箭头处意在说明这里的调用是通过修改配置文件由Solr1.3 内部实现的,至于其如何去调用,我们不必去理会。
该结构中索引更新、 索引删除和查询模块主要使用Servlet 技术实现,Servlet 一方面通过Java 代码调用New API 模块和网络蜘蛛模块, 另一方面对外提供HTTP 调用接口。 New API 层存在的原因是:Solr Core API 接口提供高内聚、低耦合的特性的同时,接口的参数类型过于复杂且参数类型不宜普通开发者理解,New API 层对Solr Core API 进行重新包装使得参数更容易理解, 同时它实现的功能是Solr Core API 的子集也使得接口更加简化。
2、三大功能模块
搜索引擎从总体而言, 主要可以分为3 大主要功能模块:网页抓取模块(Web Spider)、信息抽取和索引模块、查询页面和查询的算法。 这3 大模块代表着搜索是否能够快速的满足用户的需求,也代表着整个搜索引擎品质。如图1。
图1 搜索引擎的流程
(1)网页抓取模块(Web Spider)
该模块是从互联网的海量信息当中, 找到与搜索主题相关的网页。 建立起相应的索引, 以便提供给用户查询。 此过程中需要进行强大网页抽取功能。 这需要抓取模块——网络蜘蛛、网络爬虫具有强大的网页分析和检索功能。 通过净化和抽取, 将符合标准规范的网页存储入数据库当中。
(2)信息抽取和索引模块。
该模块是利用已经生成的数据库进行索引, 以便提升查询的效率和减少查询的时间。 本模块属于承前启后的作用,是搜索引擎当中最为重要的模块,前一步的要求的是对网页进行数据抽取,后一步的是对已经抽取的数据进行大规模的数据索引。 通过建立起大规模的结构化和非结构化的数据提取相应的数据信息。 并对检索要求的数据进行分词、排序等大规模的数据整理工作。
(3)查询页面和查询的算法。
用户通过第二步的索引建立, 已经建立出一个具有较快速的查询方案,本步骤的主要要求是如何使用已经建立起的索引模块,因此提升查询速度和查询效率是本步骤中最为关注的重点。 当然, 与用户之间的界面交互也是查询页面的设计内容之一。
三、搜索引擎详细设计与实现
1、网络蜘蛛模块的设计与实现
目前, 互联网上有许多开源的网络蜘蛛, 例如Heritrix。 虽然它们功能很强大,但是使用与改造都十分复杂,索引本文不使用这些复杂的网络蜘蛛工具来实现而选择自己编写简单可用的网络蜘蛛。 网络蜘蛛模块采用广度优先法实现。实现该爬虫的类为Spider,对外提供nextPage()方法返回一个获取的网页。 底层网页解析部分功能使用了开源的工具包htmlparser。
爬虫以网站首页URL 为构造函数的参数,这决定了爬虫将以此URL 作为爬行的起始点。 爬虫的nextPage()方法返回一个Page 对象,它代表一个满足条件的可以被索引的网页。 爬虫nextPage() 方法的工作流程为:从未处理URL 队列中提取出一个URL –>分析该URL 以提取出新的URL,如果新的URL 未在已处理URL 队列出现,将新的URL 交给过滤器, 将过滤后的URL 添加到未处理URL 队列–>将当前处理的URL 添加到已处理URL队列–>提取出文字与标题, 构造Page 对象并返回该对象。
2、New API 模块的设计与实现
New API 模块主要是简化原有调用结构, 使得参数更加贴近实际需求。 也就是说我们的传入参数是我们熟悉的(如标题,内容,关键字),查询返回结果也是我们熟悉的类型。 New API 模块的实现过程中一个重要的部分就是参数类型的转化, 以使得外层参数与内层参数衔接起来。
New API 通过类DirectAPI 来实现。
MyQueryResult 类型是自定义的返回结果类型,我们通过对XML 结果的解析, 提取出所需信息包装成MyQueryResult 对象,在生成用户友好的页面响应结果的时候,可以方面地通过该对象获得所需数据。
3、管理模块的设计与实现
管理模块是给管理员和开发者使用的, 管理利用该模块来添加、更新、删除索引和进行查询操作。 为提高管理的方便性, 管理模块提供Web 界面,Web 页面通过调用Servlet 来达到操作效果。
4、 配置文件的配置
配置文件包括schema.xml、solrcofig.xml、solr.xml。 在本应用中,由于有两个库(sysu 和pku),所以需要在solr.xml 中配置两个库。 搜索器和索引器相关参数使用默认设置,所以不需要对solrconfig.xml 进行特别设置。
schema.xml 文件需要两个fieldtype:string 和text。 其中text 指明该类型使用中文分词类进行分词;field 有四个:id、url、text、title;类型分别为string、string、text、text。 id字段表示文档序号,url 表示网页的连接地址,title 和text为网页的标题和内容,后两者是需要分词和建立索引的。默认的搜索字段为text, 这样我们就可以搜索某个网页的文字信息了。
5、分词模块的设计与实现
分词模块是中文搜索引擎中极其重要的模块, 搜索的效果很大程度上决定与分词的效果,但是自主研发中文分词需要非常雄厚的技术实力,一般开发者是无法自主研发的。 这里我们选择使用开源的中文庖丁解牛工具包来实现。
分词模块实现步骤如下:
1. 下载“庖丁解牛”分词包,按照配置教程设置好环境变量和用户词典。
2. 然后将分词包添加到工程, 修改中文分词类org.apache.solr.analysis. ChineseTokenizerFactory,使用用中文庖丁解牛工具包来实现。
3. 最后配置schema.xml 中需要分词的域类型使用该分词类即可。
6、 查询模块的设计与实现
用户通过查询页面 (search.jsp) 的表单向服务器SearchServlet 发送查询请求。 服务器收到请求后,获得查询的参数, 调用DirectAPI.queryAndReturnMyQueryResult获得查询结果MyQueryResult 对象, 然后从该对象获得结果信息,并重设request 使它包含结果信息。 最后将请求转向结果显示页面(ResultShow.jsp)。
结论
搜索是互联网发展时代的主题, 也是当前大数据挖掘时代的主要支持对象。 随着因特网的技术不断发展和更新,利用网络来获取各种资源的信息已经成为了人们生活、 工作中最为常见的活动。 人们利用各种检索来的信息,分析信息和发展信息,最终达到合理利用资源的手段和方法。 我们可以预计, 在未来人们对于搜索网络信息的搜索引擎要求越来越高,搜索的内容也越来越复杂,搜索引擎的发展也一定会随着时代的发展,以用户为核心的计算不断延伸和发展。
[1]汪晓平,钟军.JSP 网络开发技术.人民邮电出版社,2003:103-178
[2] 周晓敏.DreamWeaver?MX 应用培训教程. 电子工业版,2002:55-71
[3]黄日昆.网络引文搜索引擎CiteSeer 评析.情报杂志.南宁,2004:1-4
[4](美)亨特,(美)罗夫特斯.精通J2EE.清华大学出版社,2004:256-299
[5](美)马丁.Servlet 与JSP 核心技术.人民邮电出版社,2001:66-89
[6]资讯教育小组.JSP 与SQL 网站数据库程序设计.科学出版社,2002: 202-297
[7]飞思科技.JSP 应用开发详解.电子工业出版社,2005:345-358
[8]李博.JSP 应用开发指南.科学出版社,2003:45-123
[9]邓子云,张赐.JSP 网络编程从基础到实践.电子工业出版社,2006:56-280
[10]宋杰,王大玲,鲍玉斌,申德荣.基于页面Block 的Web 档案采集和存储.电子工业出版社,2008:275-290