3.1soso的工作环境软件环境:windows平台(推荐win2000,win2003server)+.net1.1framework+sqlserver2000。硬件环境:服务器一台,配置越高越好。当然有多台服务器更好,这样spider可以并行地在多台机器上跑。
3.2soso的基本原理soso主要由五部分组成,数据库+webscanner+webspider+carrier+asp.net网站。
数据库主要有三张表:被搜网站表,网页表,关键词表。被搜网站表存放着spider要去访问的网站的网址及其他基本信息,网页表存放搜到的网页的基本信息,关键词表记录用户检索过的关键词及其频率。数据库里还存放着一些存储过程,以供其它模块调用。此外,因为用到了sqlserver的全文检索功能,还要创建索引文件。
webscanner是一个用c#编写的基于console的应用程序,它的作用是扫描一定ip范围的所有网站的基本信息,并将其存入数据库。由于采用了多线程技术,扫描是比较快的。经测试,扫描华师的ip范围202.114.32.1~202.114.47.255,得到89个网站只用了45秒。
webspider是一个用c#编写的基于console的应用程序,它的作用是访问数据库中给出的网站,并把网站的网页抓取下来,抓取的原理是利用正则表达式(可以适应各种网页),笔记经心设计了一个webpage类,它可获取给定网址的网页的所有链接、站内链接,链接文字、纯文本、网页大小、标题等等一系列信息。获得的网页信息数据放入内存中的一个全局数据队列结构,而全局数据队列每隔一定周期被序列化后以文件的形式存于硬盘上,并将自身清空。webspider的内部采用了多线程技术,每个线程维护自己的广度优先遍历队列,因此速度非常快,经华师校内测试,每分钟平均抓取1,050张网页。此外,还可以在配置文件中设定spider的同时最大并发线程、线程生存周期、搜索深度、数据序列化周期、特定网站过滤等参数。
carrier是个批处理文件,它的作用是把webspider输出的序列化的数据从硬盘“搬”到数据库中。那么为什么webspider不直接把数据插到数据库里面呢?因为sqlserver在接收大量数据插入请求时,效率会下降,前台asp.net网站的查询效率就会下降,查询时间变长。因此笔者在设计时采用了异步模式,webspider只负责收集数据,carrier来负责数据插入数据库,这样通过合理的时间调度就可以避免瓶颈的出现。这种异步工作模式在有多台计算机运行webspider时优势将更加明显。
搜索网站是用asp.net开发的,基本原理相信做过网站的人都知道。soso的亮点体现在三个地方。首先是对关键词分词的处理。由于笔者对这方面的算法研究不深,因此用了split()加上sqlserver的freetext功能实现了模糊查询。基本原理是这样的,比如说,当用户查询“刘德华天王mp3”时,首先以与逻辑即contains“刘德华天王andmp3”进行查询,如果无记录,则用或逻辑查询即contains“刘德华天王ormp3”。如果还是无记录,则用sqlserver的freetext进行分词,可能返回匹配“刘德华”,“天王”,”mp3”当中任意一个词的记录,并且按照相关度的高低排序。其次,此网站的分页算法采用了“按需索取”的原则,即每次只从数据库中读取第m条到第m+pagesize-1条数据,因此查询速度还是比较可观的。关键词着色上也做了一些小技巧,以前被搜过的关键词的着色正则式会被预编译存在application全局变量中,因此其它人再搜这个词时速度就很快了。最后要提一下网页右边那一栏,目前放的是校内新闻,它本质上是读取了一个rss源并显示出来。这个rss源是我做个另一个系统,它收集本校五大门户网站的新闻并以xml的形式显示。