0  引言

垂直搜索是针对某个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中某类专门的信息进行整合,定向分字段抽取出需要的数据处理后再以某种形式返回给用户。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.