菜鸟也想玩搜索引擎——JobSearch简介
这一篇将简要介绍一下JobSearch的结构,同时发下源码,来点干货,等过两天闲的时候将围绕这个程序简单介绍搜索引擎的各部分,同时谈谈个人的一些理解。程序写的比较简单,基础好的话很容易就能看懂(因为写的比较早,所以代码比较乱,还望各位勿喷啊)。
SVN地址:http://code.taobao.org/svn//jobsearch/trunk
源文件下载地址:https://files.cnblogs.com/good-temper/jobsearch.rar
1、程序结构
程序框架如下:
(1)、爬虫从招聘网站通过列表页抓取招聘页面,将招聘信息解析出后存入数据库
(2)、通过Luence实现的索引器存数据库读取解析出来的信息,进行分词并建立索引文件
(3)、用户输入关键词提交给查询器
(4)、查询器将关键词分词并检索索引文件,获得匹配的记录集合,根据记录的id查询数据库取出数据反馈给用户。(这里偷了个懒,建立索引是直接将数据表所有字段都存进了索引文件,这样查询时就不需要读取数据库了,但是这是一个非常糟糕的设计,原因以后详细分析时会说明)
程序的源文件结构如下:
//需要说的是部分文件是从更早期的一个爬虫程序里边拷贝过来的,原项目是gbk的,而本项目是utf-8的,所以有部分中文注释乱码,而且一些文件没有用到
JobSearch
com.crawler.action //这个就不解释了,struts你懂得
com.crawler.analysis //解析包,本来想用htmlparser,后来觉得挺简单的就直接自己写正则了
ContentAnalysis.java //内容页解析类
ListAnalysis.java //列表页解析类
com.crawler.contraller //控制包
Contraller.java //总控类,所有抓取爬虫都在此启动
job51Contraller.java //51Job的抓取控制类,主要是启动多个线程进行抓取,并维护一个链接队列进行任务调度
com.crawler.database //数据库操作
MysqlOperater.java //mysql操作类
SqliteOperater.java //sqlite的操作类,我自己写的小程序喜欢用sqlite,轻量级且方便移植。这里本来打算用的,最后因多种原因未使用。
com.crawler.entity //实体类,当时百度出的这个单词......好吧,今天知道人们其实更喜欢写成model
Queue.java //队列接口
ArrayQueue.java //队列类,为甚么要自己实现?因为当时不知道java已经实现了Queue,就在网上考了一个,当然看了下代码其实很简单,使 用了模板,而且线程安全
SearchResult.java //查询结果类
SimpleContent.java //简单格式的置为内容类,这个......我也忘了当时为啥要定义这个,难道想减少客户端请求时传递的信息量?
PageContent.java //页面内容类,用来存储页面解析后的信息
UrlInfo.java //Url信息类
com.crawler.filter //本来打算实现过滤器的,实现链接的滤重,但是最后偷懒直接比对的数据库,就没实现。这个之前实现过,采用的Bloom Filter 实现,之后细讲会讲到的
com.crawler.htmlop //html操作
GetHtml.java //请求网路获取html文件
com.crawler.io //io操作
FileOperater.java //主要将html文件保存至本地,这里没有用到,但是这样做对于一个真正高校的搜索引擎其实
com.crawler.luence //luence操作
InfoIndex.java //索引文件操作类,建立、更新、查询索引都在这里边,其实包含了索引器和查询器,这里代码写的有点烂。
com.crawler.tool //一些工具类
ComputeMD5.java //生成MD5值,最为数据主键
DataOp.java //日期格式处理
PropertiesOp.java //读取配置文件属性,爬虫的一些信息通过.properties文件配置,包括爬去列表页起始地址、列表链接正则、爬去分类等 ,这样做主要是希望增强可拓展性,之后通过添加XXXContraller类和配置文件就能实现对新网站的爬去(这样其实还是 有缺陷)
//最后,应该是controller,而不是contraller,好吧,没文化真可怕。
2、如何配置程序
2.1 导入项目
可以svn签入或者下载源文件导入,我用的myeclipse9.0,但是开发用的myeclipse8.5,所以8.5以上版本应该都行。
2.2 初始化数据库
脚本文件在sql文件加下,里边已经有一些数据,但是建议把数据清空(因为对应没索引文件没拷,这些数据也查询不出来)。
2.3 抓取数据
运行程序,将程序部署至tomcat,打开:http://localhost:8080/JobSearch/index.jsp
点击右上角的“抓取设置”,按照下图执行点击1、2,暂时不要执行3。
这是可以在控制台看到输出抓取日志信息:
2.4 对抓取信息建立索引
在抓取了一段时间后(可以看看数据库,差不多positioninfo表有个千吧条信息时,反正是测试下,用不着抓太多),点击上边的3开始建立索引。这里需要提到是由于代码对异常处理的有问题,长时间运行后会出现异常信息,一般情况下忽略即可(比如一些链接请求失败很正常),但是有时候你会发现列表页解析速度很快,内容页个很长时间才完成一个,这个一般重启即可,不必担心重复抓取,抓取状态数据库保存的有。
建立索引将是个很长的时间,而且建议在抓取停止后在去建立索引(怎么停止?这个....没写,直到列表信息抓取完就停止了,或者你重启下tomcat也行,反正是个练手项目,也不追求十全十美......),否则很可能你等很长时间也不见结束。
2.5 万事具备,搜索吧
打开主页,填写关键词(最好和抓取分类相关)和条件,点击搜索,会惊喜的发现页面显示了搜索结果。但是同时你也可能会小小的失望:有时候搜索结果准确度并不是那么高。这个主要和分词器以及luence的使用有关,因为我只是简单的使用了下,并未做相关排名,而且分词器分词不一定准确(这个牵扯很多原因,也是搜索引擎需要解决的核心问题之一,以后我会说下我所了解的解决思路)。
最后来几张效果图,然后睡觉去。