垂直搜索是针对某个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中某类专门的信息进行整合,定向分字段抽取出需要的数据处理后再以某种形式返回给用户。Spider是搜索引擎中的核心技术之一。垂直搜索引擎对Spider提出了动态、可扩展和可配置的高要求。使用策略模式可实现一种高可扩展、面向接口的Spider。
1 工作原理
网络蜘蛛工作方式为:查看一个页面,并从中找到相关信息,然后它再从该页面的所有链接中出发,继续寻找相关的信息,以此类推。Web文档索引根据文档标题、首段落甚至整个页面内容进行,取决于搜索服务的数据收集策略。网络蜘蛛漫游过程中,根据页面标题、头、链接等生成摘要放在索引数据库。网络蜘蛛为实现快速浏览整个互联网,通常采用多线程技术实现在网上搜索信息。
2 策略模式
为设计可扩展Spider,应使各功能部件可装配化,须通过软件设计模式优化各部分的接口形式。
策略模式(Strategy、Policy)[1]针对一组算法,将每个算法封装到具有共同接口的独立的类中,使它们可相互替换。策略模式使算法可在不影响客户端的情况下发生变化。
使用策略模式可把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类(Concrete Strategy)中提供。由于算法和环境独立,算法的增减、修改都不影响环境和客户端。当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。策略模式相当于“可插入式(Pluggable)的算法”。
图1 策略模式典型结构
策略模式提出后,在各种语言及平台上又出现了各自的策略模式实现方法。
在C++中,Alexandrescu比较“多继承”和“模板”技术,揭露了两者的本质,最终采用模板技术实现策略模式,并在其Loki代码库中大量使用这项技术[2]。这种策略模式的设计具备如下形式:
Template <class CreationPolicy>
Class WidgetManager: public CreationPolicy
{…};
客户端具体化具备如下形式:
typedef WidgetManager<OpNewCreator<Widget> >
MyWidgetMgr;
在java平台,IoC/DI机制,即控制反转(IoC:Inversion of Control)或依赖注射(DI:Dependence Injection)是Spring框架的核心。IoC是由容器控制组件间的关系,而非传统实现中由程序代码直接操控,这种控制权由程序代码到外部容器的转移。DI是对IoC更形象的解释。即由容器在运行期动态地将依赖关系(如构造参数、构造对象或接口)注入到组件中。
3 基于策略的Spider设计
垂直搜索引擎特点是“专、精、深”,且具有行业色彩,相比较通用搜索引擎的海量信息无序化,垂直搜索引擎则显得更加专注、具体和深入。垂直搜索引擎对搜索主题、搜索策略等要求更高的可变性和可扩展性。总结策略模式思想,使用Spring和策略模式实现可扩展的Spider。
将Spider功能部件和涉及数据抽象为如图所示5个接口:
图2 策略Spider接口间关系
(1) IParser:抽象解析器,接收由IHtmlGetter传递来的网页,并使用IMatcher解析;
(2) IWriter:抽象写入器,将解析结果进行保存,数据库或文件;
(3) IData:类似ResultSet的行列式数据集,在IParser与IParser间、IParser与IWriter间传递;
(4) IMatcher:抽象匹配器,可由正则表达式实现;
(5) IHtmlGetter:抽象网页获取器。
其中解析器、写入器和匹配器接口设计如下:
public interface IParser
{ public IData parse(IData data); }
public interface IWriter
{ public void write(IData data);
public void open();
public void close();
}
public interface IMatcher
{ List match(String source,String pattern,int groupNum); }
使用Spring的依赖注入将各部件拼装起来(实现类HtmlGetterImpl等不赘述):
<bean id="HtmlGetter" class="edu.jju.web.HtmlGetterImpl">
<bean id="SubjectParser" class="
edu.jju.parser.SubjectParserImpl">
<property name="htmlGetter">
<ref bean="HtmlGetter"/>
</property>
<property name="matcher">
<ref bean="RegexMatcher"/>
</property>
…
</bean>
4 结语
研究了搜索引擎的工作模式,对Spider各功能进行高度抽象,并使用策略模式对其进行可扩展性设计。使得Spider能够在搜索主题、搜索策略上高度可装配和可扩展,能适应垂直搜索引擎对搜索主题等参数的高可变性需求。
参考文献:
[1] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.Design Patterns: Elements of Reusable Object-Oriented Software [M]. Addison-Wesley, 1995.
[2] Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied [M].Addison Wesley, 2001.