这一章将基于 Solr1.3 来设计一个在同一个服务器对两个大学(北京大学、中山大学)网站进行搜索的合成搜索引擎。主要目的是要利用 Solr1.3 的多核心特性来设计一个多索引库的应用场景。 本设计无意追求真实场景中的搜索性能,只是提供一种基于 Solr1.3 开发多应用搜索引擎的思路。 设计注重管理与普通使用的分离, 将所有管理操作都纳入同一个 Web 页面下以提供管理的方便性,同时尽量考虑将来的扩展需求。
1、整体结构与模块关系
基于 Solr1.3 的搜索引擎实现的结构,是常用的一种结构,该结构具有索引更新、索引删除、查询、分词、网络蜘蛛、索引库、New API、Solr Core API 八大模块(由于管理员页面与普通用户查询页面只是简单的 HTTP 接口调用,所以不将他们算作单独模块)。 这八大模块中除 SolrCore API 模块外,其他模块都是我们需要实现或配置的 .
图中的箭头表示模块间的调用关系, 虚箭头处意在说明这里的调用是通过修改配置文件由 Solr1.3 内部实现的,至于其如何去调用,我们不必去理会。
该结构中索引更新、 索引删除和查询模块主要使用Servlet 技 术实现 ,Servlet 一 方面通过 Java 代码调用 NewAPI 模块和网络蜘蛛模块 , 另一方面对外提供 HTTP 调用接口。 New API 层存在的原因是:Solr Core API 接口提供高内聚、低耦合的特性的同时,接口的参数类型过于复杂且参数类型不宜普通开发者理解,New API 层对 SolrCore API 进行重新包装使得参数更容易理解 , 同时它实现的功能是 Solr Core API 的子集也使得接口更加简化。
2、三大功能模块
搜索引擎从总体而言, 主要可以分为 3 大主要功能模块:网页抓取模块(Web Spider)、信息抽取和索引模块、查询页面和查询的算法。 这 3 大模块代表着搜索是否能够快速的满足用户的需求,也代表着整个搜索引擎品质。如图 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