冬Blog

醉心技术、醉心生活
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

[FtpSearchV2][构架设计][第一篇] 系统需求和概要设计

Posted on 2006-06-26 21:24  冬冬  阅读(2665)  评论(3编辑  收藏  举报

本文将描述FtpSearch搜索引擎的设计。包括系统的需求、分析、构架和难点解析。更多内容(包括第一版)请参考我博客(http://yuandong.cnblogs.com)上FtpSearch分类中的其他文章。

文章写得比较浅显(主要是个人水平有限),大家可以读来消遣排砖。^^

 

第一篇 系统需求和概要设计

一、              系统需求:对于给定的一组Ftp服务器,系统可以根据关键字对其所有的文件进行搜索。预计系统的数据量为100K。(更多信息可以参考我的上一篇Blog http://yuandong.cnblogs.com/archive/2006/06/25/435188.html

二、              系统设计:

对于搜索系统其主要模块包括:抓取、储存、索引、查找四个部分。


以下我们逐个分析。

 

1.           抓取。抓取指的是获取Ftp服务器内容的过程。其本质是图的的遍历。其设计主要包含以下几个方面:

a)         Ftp服务器的访问。对于一个Ftp搜索引擎,其实我们用到的主要就是LIST命令,并对于返回的系统目录信息进行解析。在FtpSearch中,此部分使用了第三方的组件EdtFtpNet,这是一个遵守GPL协议的开源组件。网址为http://www.enterprisedt.com/products/edtftpnet/。这个组件功能很强大,几乎涵盖了Ftp客户端相关的所有功能。而我们只需要其中的LIST功能。另外,此组件的原始版本不支持中文,支持中文的版本可以点击这里下载。

b)        Ftp服务器的遍历。FtpSearch采用深度优先遍历算法,对于图上的一个节点,(一个服务器),我们可以将其视为一个N叉树。忽略服务器之间的连接,整个Ftp服务器网络即可视为一个森林。我们对每一个服务器用一个线程进行遍历,提供NewFileFoundExpectionOccur等事件,用于新文件发现、发生错误等进行处理。在此,服务器是一个稍微抽象一点的概念,指的是目标服务器上的要遍历目录的集合。

c)        错误处理。对于搜索引擎来说,访问网络错误,比如Url无效或者服务器超时来说,都不应该算是Exception,应该视为一种正常的情况予以处理。在FtpSearch中,我将异常分为两类,一类是致命异常(FetalExecption),指的是服务器超时、线程死锁等无法继续进行的错误,其主要的处理方式是重新启动线程并尝试,超过一定尝试次数则是为无效地址予以报告(触发事件)。第二类是普通异常(CommonException),主要是指某个目录无法访问,主要的处理方式是跳过此目录继续遍历。对于任何一种异常,Robot(网络机器人,又称为Spider、蜘蛛、爬虫……)都出发一个事件、可以有由更高层改变处理逻辑。

2.           储存:储存主要是指对于原始数据的储存,在FtpSearch中即为搜索到的文件的信息,包括UrlNameLastModifyTimeServer等。在我的设计中使用的是MS SQLServer 2000。对于大概100K数据来说应该不是很吃力。

3.           索引:索引是搜索中非常重要的核心部分。其主要设计一下部分:

a)         索引方式:目前大部分的索引使用的是基于关键字的倒排索引。详细信息Google一把能出一打。

b)        分词:分词是很重要的一部分,特别是中文的分词。目前比较简单的分词是二分法分词,简单点说就是两个字一份。中文二字词最多,所以这个方法还是比较有效的。更好一些的算法,特别是在保证速度的前提下的算法就是很专业的问题了。中科院有个分词项目,ICTCLAS,开源的,而且提供各个语言的编程接口,算是国粹了。

c)        高级功能:指的是匹配程度的得分、多字段联合查询等。

FtpSearch中用的是著名的DotLuceneLucene.Net版本)。具体的使用方法可以到网上查找,另外说一下,就算不作搜索引擎,而牵扯到数据的搜索的问题,Lucene都能给你不一样的感觉(不是广告^^)。

4.           查找:查找主要是指对于用户提供一组接口,提供查询服务,在此基础上可以构建WebSiteWebServies等。