21世纪,中国互联网搜索引擎领域可谓群雄逐鹿,百度、yahoo、中搜、搜狗等等都使出浑身解数吸引着网民的眼球。这些大网站可谓是各有所长,总的来说虽然他们搜索功能都很强,但是搜索得到的结果基本上是千篇一律,信息的冗余量很大,网民不得不在一次又一次的翻页中浪费时间,或者为了想出一个好的关键词而绞尽脑汁。要是有一个有针对性的搜索引擎就好了,并且这个针对性应该是可以控制的。
笔者在上网搜索的过程中曾有这样痛苦的经历。由于笔者爱好编程,经常需要上网查找技术资料。但是搜到的结果往往是来自一些不起眼的小网站,它们主要是转载csdn,赛迪网等一些技术大站上的文档,可恶的是,这些小网站常常转载不全,广告成堆,乱弹窗口,更有甚者还有病毒、木马等防不胜防。笔者当时想,如果有一个“it技术文档搜索引擎”就好了,可惜没有,于是就自己动手做吧。我把csdn、it168、赛迪网等it技术网站存储在“被搜网站库”中,按一定的周期启动spider(蜘蛛)程序(spider的原理后面讲),spider搜到的结果按一定格式暂时存在硬盘上,然后由carrier(搬运工)程序异步转存到数据库中,再利用sql server强大的全文检索(不是用like语句j)结合asp.net做出查询界面,这便有了soso的原型。由于soso只搜特定的网站,数量少,因此数据更新的速度更快,而且由于事先对网站就有了筛选,搜到的结果质量也比较高,比用大型搜索引擎有更好的用户体验。后来笔者想起校网络中心的老师曾提议做一个专门搜索华师校内所有网站信息的搜索引擎,便做了scanner程序,它的功能是检索出给定的ip范围内所有的网站,并把这些网站的主要信息存入“被搜网站库”。于是便有了“华师人自己的web搜索引擎------mysoso”,网址http://it.ccnu.edu.cn/mysoso。网站推出后受到了同学们的好评,校领导也曾在校网络建设工作会议上点名表扬。有个同学说:“以前想查一下校学生会主席的资料,用google和baidu搜到的结果都不理想,因为重名的太多了。有了mysoso就好多了,搜到网页也都是来源于校内各大网站,真实可靠。”
软件环境:windows平台(推荐win2000,win2003 server)+.net1.1 framework + sql server 2000。硬件环境:服务器一台,配置越高越好。当然有多台服务器更好,这样spider可以并行地在多台机器上跑。
soso主要由五部分组成,数据库+webscanner+webspider+carrier+asp.net网站。
数据库主要有三张表:被搜网站表,网页表,关键词表。被搜网站表存放着spider要去访问的网站的网址及其他基本信息,网页表存放搜到的网页的基本信息,关键词表记录用户检索过的关键词及其频率。数据库里还存放着一些存储过程,以供其它模块调用。此外,因为用到了sql server的全文检索功能,还要创建索引文件。
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不直接把数据插到数据库里面呢?因为sql server在接收大量数据插入请求时,效率会下降,前台asp.net网站的查询效率就会下降,查询时间变长。因此笔者在设计时采用了异步模式,webspider只负责收集数据,carrier来负责数据插入数据库,这样通过合理的时间调度就可以避免瓶颈的出现。这种异步工作模式在有多台计算机运行webspider时优势将更加明显。
搜索网站是用asp.net开发的,基本原理相信做过网站的人都知道。soso的亮点体现在三个地方。首先是对关键词分词的处理。由于笔者对这方面的算法研究不深,因此用了split()加上sql server的freetext功能实现了模糊查询。基本原理是这样的,比如说,当用户查询“刘德华天王 mp
华中师范大学信息技术系 sunjoy [email protected]
,欢迎访问网页设计爱好者web开发。新闻热点
疑难解答
图片精选