搜索引擎DIY—我的搜索听我的
Author:Sunjoy
1.引言
2005年IT界最火的概念是什么?一个字“搜”,两个字“搜索”,四个字“搜索引擎”。几乎是在一夜之间,互联网上的搜索网站如雨后春笋般冒将出来,相信大家都能随口叫出几个名字带“搜”的网站吧。Search Engine的诱惑是相当大的,且不谈它的巨大商机对投资商是多么具有吸引力,很多技术人员也是纷纷摩拳擦掌要在这个新的领域里面大展伸手,更有许多像笔者这样的“票友”也想一窥其中的端倪。然而,遗憾的是搜索引擎过高的技术门槛把许多人挡在了门外,以至于长期以来只闻G
oogle和
Baidu。其实,从技术的角度
来讲写个Spider抓抓网页到是不难,难的是全文检索、分词等等。而现如今,情况有所改观,互联网上涌现出了一些比较优秀的开源“全文检索引擎”,如
lucene
、
nutch
,而笔者用到的正是
Lucene
,读作
[lu:'si:n]
。
2.Lucene简介
为了权威起见,我还是贴一段车东大大的文字。
Lucene不是一个完整的全文索引应用,而是
是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
Lucene的作者:
Lucene的贡献者
Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的
Lucene的目标是为各种中小型应用程序加入全文检索功能。
Lucene的发展历程:早先发布在作者自己的
www.lucene.com,后来发布在
SourceForge,2001年年
底成为APACHE基金会
jakarta的
一个子项目:
http://jakarta.apache.org/lucene/
对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于
Lucene的结构的介绍,你会了解到由于
Lucene良好架构设计,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。
Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到
Lucene的存储结构/接口中。总体上看:可以先把
Lucene当成一个支持全文索引的数据库系统。
OK,到此打住,如果想了解更多关于
Lucene的内容,请朋友们
浏览车东的站点
http://www.chedong.com/tech/lucene.html
然而由于笔者对Java是一知半解,对C#到是还行。那岂不是用不成
Lucene了?非也非也,还有D
otLucene呢。
DotLucene是一个强有力的开源全文搜索引擎,它是从Apache的
Lucene(java)项目移植到.Net(C#)上的。
DotLucene的效率非常高,并且还具有对搜索结果评级、高光、
搜索非结构数据以及本地化等特点。它还和
Lucene的索引兼容,因此你可以在不同的平台间迁移而不会丢失任何索引数据。关于
DotLucene的详细情况,请阅读
http://dev.csdn.net/article/64/64570.shtm,它将教你如何用37行代码写一个搜索引擎。
然而,需要认识到的是,想用
Lucene做出像Google、
Baidu这样的海量搜索引擎还是很有困难的,但是用它来做垂直搜索引擎是再适合不过的了。借用一下“蚁力神”的广告台词。
赵本山:瞎晃悠啥呀?
范伟:我正为开发搜索引擎这事儿犯愁呢。
赵本山:啥性质?
范伟:垂直的!
赵本山:多大规模?
范伟:百万级
赵本山:用鹿神(
Lucene)
3.MySOSO的案例
M
ySOSO是笔者以
Lucene为核心开发的一个易用的、可定制的搜索引擎。它的功能简而言之就是告诉它指定的一批网站,它就成为搜索这批网站的最好引擎。
3.1 MySOSO的工作环境
软件环境:Windows平台(推荐Win2000,Win2003 Server)+.NET2.0 Framework。硬件环境:服务器一台,配置越高越好,最好有两个以上CPU,1G以上内存。当然有多台服务器更好,这样Spider可以并行地在多台机器上跑。
3.2 MySOSO的工作原理
MySOSO主要由六部分组成,
Lucene+
WebScanner+
WebSpider+Indexer+Asp.net网站,另外还有一个可视化的管理界面
sosoAdmin。
WebScanner是一个用C#编写的基于Console的应用程序,它的作用是扫描一定IP范围的所有网站的基本信息,并将其存保存起来(笔者用了Access数据库)。由于采用了多线程技术,扫描是比较快的。经测试,扫描我校(华中师范大学)的IP范围202.114.32.1~202.114.47.255,得到89个网站只用了45秒。
WebSpider是一个用C#编写的基于Console的应用程序,它的作用是访问数据库中存储的被搜网站列表,并把网站的网页抓取下来,抓取的原理是利用正则表达式(可以适应各种网页),笔记经心设计了一个
WebPage类,它可获取给定网址的网页的所有链接、站内链接,链接文字、纯文本、网页大小、标题等等一系列信息。获得的网页信息数据放入内存中的一个全局数据队列结构,而全局数据队列每隔一定周期被序列化后以文件的形式存于硬盘上,并将自身清空。
WebSpider的内部采用了多线程技术,每个线程维护自己的广度优先遍历队列,因此速度非常快,经华师校内测试,每分钟平均抓取1,050张网页。此外,还可以在配置文件中设定Spider的同时最大并发线程、线程生存周期、搜索深度、数据序列化周期、特定网站过滤等参数。
我还给
WebSpider加了新功能,现在它可以访问需要登陆的网站,只要用户有该网站的帐号和密码。
Indexer是个批处理文件,它的作用是调用
Lucene的API把
WebSpider输出的序列化的数据编制成索引文件。那么为什么
WebSpider不直接把数据立即编入索引文件呢?因为
Lucene在处理大量数据插入时,查询效率会下降,前台Asp.net网站的查询效率就会下降,查询时间变长。因此笔者在设计时采用了异步模式,
WebSpider只负责收集数据,Indexer来负责数据插入数据库,这样通过合理的时间调度就可以避免瓶颈的出现(一般选在凌晨2点运行Indexer)。这种异步工作模式在有多台计算机运行
WebSpider
时优势将更加明显。
搜索网站是用Asp.net开发的,核心当然是搜索
Lucene建好的索引文件。遗憾的是笔者用的
DotLucene对中文分词及其高亮显示还很差。于是,只好自己动手写了中文分词和高亮显示的模块。分词这东西很深奥,我写的只是实现二元分词,虽然与基于语义的分词有差距,但做垂直搜索已经足够。
sosoAdmin是用C#开发的基于
WinForm的程序,通过它,用户可以可视化地配置Spider以及网站的一些相关参数,并且对整个系统起到监控作用。例如通过它可以配置Spider的最大并发线程、线程生存周期、搜索深度、数据序列化周期、特定URL过滤、敏感词汇等参数。用户还可以在程序里面手动管理被搜网站列表的信息,观察网友在关注哪些关键词。
还是贴几张图吧~~~~~~
![](http://blog.csdn.net/images/blog_csdn_net/fxsjy/p1.jpg)
![](http://blog.csdn.net/images/blog_csdn_net/fxsjy/p2.jpg)
![](http://blog.csdn.net/images/blog_csdn_net/fxsjy/p3.jpg)
![](http://blog.csdn.net/images/blog_csdn_net/fxsjy/p4.jpg)
参考文献
[1] DotLucene:37行代码全文搜索.
shanyou .
http://so.javaye.com
[2] 基于Java的全文索引引擎
Lucene简介. 车东.
http://www.chedong.com/tech/lucene.html