基于JAVA技术的搜索引擎的研究和实现.docx
- 文档编号:30084371
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:30
- 大小:30.67KB
基于JAVA技术的搜索引擎的研究和实现.docx
《基于JAVA技术的搜索引擎的研究和实现.docx》由会员分享,可在线阅读,更多相关《基于JAVA技术的搜索引擎的研究和实现.docx(30页珍藏版)》请在冰豆网上搜索。
基于JAVA技术的搜索引擎的研究和实现
基于JAVA技术的搜索引擎的研究和实现-JSP教程,Java技巧及代码
摘要
网络中的资源非常丰富,不过怎么有效的搜索信息却是一件困难的事情。
建立搜索引擎就是解决这个问题的最佳方法。
本文首先周详介绍了基于英特网的搜索引擎的系统结构,然后从网络机器人、索引引擎、web服务器三个方面进行周详的说明。
为了更加深刻的理解这种技术,本人还亲自实现了一个自己的搜索引擎?
?
新闻搜索引擎。
新闻搜索引擎是从指定的web页面中按照超连接进行解析、搜索,并把搜索到的每条新闻进行索引后加入数据库。
然后通过web服务器接受客户端请求后从索引数据库中搜索出所匹配的新闻。
本人在介绍搜索引擎的章节中除了周详的阐述技术核心外还结合了新闻搜索引擎的实现代码来说明,图文并茂、易于理解。
abstract
theresourcesintheinternetareabundant,butitisadifficultjobtosearchsomeusefulinformation.soasearchengineisthebestmethodtosolvethisproblem.thisarticlefistintroducesthesystemstructureofsearchenginebasedontheinternetindetail,thengivesaminuteexplanationformspidersearch,engineandwebserver.inordertounderstandthetechnologymoredeeply,ihaveprogrammedanewssearchenginebymyself.
thenewssearchengineisexplainedandsearchedaccordingtohyperlinkfromaappointedwebpage,thenindexseverysearchedinformationandaddsittotheindexdatabase.thenafterreceivingthecustomersrequestsfromthewebserver,itsoonsearchstherightnewsformtheindexengine,
inthechapterofintroducingsearchengine,itisnotonlyelaboratethecoretechnology,butalsocombinewiththemoderncode,picturesincluded,easytounderstand.
第一章引言
面对浩瀚的网络资源,搜索引擎为所有网上冲浪的用户提供了一个入口,毫不夸张的说,所有的用户都能从搜索出发到达自己想去的网上所有一个地方。
因此他也成为除了电子邮件以外最多人使用的网上服务。
搜索引擎技术伴随着www的发展是引人注目的。
搜索引擎大约经历了三代的更新发展:
第一代搜索引擎出现于1994年。
这类搜索引擎一般都索引少于1,000,000个网页,极少重新搜集网页并去刷新索引。
而且其检索速度非常慢,一般都要等待10秒甚至更长的时间。
在实现技术上也基本沿用较为成熟的ir(informationretrieval)、网络、数据库等技术,相当于利用一些已有技术实现的一个www上的应用。
在1994年3月到4月,网络爬虫worldwebworm(wwww)平均每天承受大约1500次查询。
大约在1996年出现的第二代搜索引擎系统大多采用分布式方案(多个微型计算机协同工作)来提高数据规模、响应速度和用户数量,他们一般都保持一个大约50,000,000网页的索引数据库,每天能够响应10,000,000次用户检索请求。
1997年11月,当时最先进的几个搜索引擎号称能建立从2,000,000到100,000,000的网页索引。
altavista搜索引擎声称他们每天大概要承受20,000,000次查询。
2000年搜索引擎2000年大会上,按照google公司总裁larrypage的演讲,google正在用3,000台运行linux系统的个人计算机在搜集web上的网页,而且以每天30台的速度向这个微机集群里添加计算机,以保持和网络的发展相同步。
每台微机运行多个爬虫程式搜集网页的峰值速度是每秒100个网页,平均速度是每秒48.5个网页,一天能搜集超过4,000,000网页
搜索引擎一词在国内外因特网领域被广泛使用,然而他的含义却不尽相同。
在美国搜索引擎通常指的是基于因特网的搜索引擎,他们通过网络机器人程式收集上千万到几亿个网页,并且每一个词都被搜索引擎索引,也就是我们说的全文检索。
著名的因特网搜索引擎包括firstsearch、google、hotbot等。
在中国,搜索引擎通常指基于网站目录的搜索服务或是特定网站的搜索服务,本人这里研究的是基于因特网的搜索技术。
第二章搜索引擎的结构
2.1系统概述
搜索引擎是根据用户的查询请求,按照一定算法从索引数据中查找信息返回给用户。
为了确保用户查找信息的精度和新鲜度,搜索引擎需要建立并维护一个庞大的索引数据库。
一般的搜索引擎由网络机器人程式、索引和搜索程式、索引数据库等部分组成。
系统结构图
2.2搜索引擎的构成
2.2.1网络机器人
网络机器人也称为“网络蜘蛛”(spider),是个功能非常强的web扫描程式。
他能在扫描web页面的同时检索其内的超链接并加入扫描队列等待以后扫描。
因为web中广泛使用超链接,所以一个spider程式理论上能访问整个web页面。
为了确保网络机器人遍历信息的广度和深度需要设定一些重要的链接并制定相关的扫描策略。
2.2.2索引和搜索
网络机器人将遍历得到的页面存放在临时数据库中,如果通过sql直接查询信息速度将会难以忍受。
为了提高检索效率,需要建立索引,按照倒排文件的格式存放。
如果索引不及时跟新的话,用户用搜索引擎也不能检索到。
用户输入搜索条件后搜索程式将通过索引数据库进行检索然后把符合查询需求的数据库按照一定的策略进行分级排列并且返回给用户。
2.2.3web服务器
客户一般通过浏览器进行查询,这就需要系统提供web服务器并且和索引数据库进行连接。
客户在浏览器中输入查询条件,web服务器接收到客户的查询条件后在索引数据库中进行查询、排列然后返回给客户端。
2.3搜索引擎的主要指标及分析
搜索引擎的主要指标有响应时间、召回率、准确率、相关度等。
这些指标决定了搜索引擎的技术指标。
搜索引擎的技术指标决定了搜索引擎的评价指标。
好的搜索引擎应该是具有较快的反应速度和高召回率、准确率的,当然这些都需要搜索引擎技术指标来保障。
召回率:
一次搜索结果中符合用户需求的数目和用户查询相关信息的总数之比
准确率:
一次搜索结果中符合用户需求的数目和该次搜索结果总数之比
相关度:
用户查询和搜索结果之间相似度的一种度量
精确度:
对搜索结果的排序分级能力和对垃圾网页的抗干扰能力
2.4小节
以上对基于因特网的搜索引擎结构和性能指标进行了分析,本人在这些研究的基础上利用javatm技术和一些opensource工具实现了一个简单的搜索引擎?
?
新闻搜索引擎。
在接下来的几章里将会就本人的设计进行周详的分析。
第三章网络机器人
3.1什么是网络机器人
网络机器人又称为spider程式,是一种专业的bot程式。
用于查找大量的web页面。
他从一个简单的web页面上开始执行,然后通过其超链接在访问其他页面,如此反复理论上能扫描互连网上的所有页面。
基于因特网的搜索引擎是spider的最早应用。
例如搜索巨头google公司,就利用网络机器人程式来遍历web站点,以创建并维护这些大型数据库。
网络机器人还能通过扫描web站点的主页来得到这个站点的文件清单和层次机构。
还能扫描出中断的超链接和拼写错误等。
3.2网络机器人的结构分析
internet是建立在非常多相关协议基础上的,而更复杂的协议又建立在系统层协议之上。
web就是建立在http(hypertexttransferprotocol)协议基础上,而http又是建立在tcp/ip(transmissioncontrolprotocol/internetprotocol)协议之上,他同时也是一种socket协议。
所以网络机器人本质上是一种基于socket的网络程式。
3.2.1怎么解析html
因为web中的信息都是建立在html协议之上的,所以网络机器人在检索网页时的第一个问题就是怎么解析html。
在解决怎么解析之前,先来介绍下html中的几种数据。
文本:
除了脚本和标签之外的所有数据注释:
程式员留下的说明文字,对用户是不可见的简单标签:
由单个表示的html标签开始标签和结束标签:
用来控制所包含的html代码
我们在进行解析的时候不用关心所有的标签,只需要对其中几种重要的进行解析即可。
超连接标签
超连接定义了www通过internet链接文件的功能。
他们的主要目的是使用户能够任意迁移到新的页面,这正是网络机器人最关心的标签。
图像映射标签
图像映射是另一种非常重要的标签。
他能让用户通过点击图片来迁移到新的页面中。
表单标签
表单是web页面中能输入数据的单元。
许多站点让用户填写数据然后通过点击按钮来提交内容,这就是表单的典型应用。
表格标签
表格是html的构成部分,通常用来格式化存放、显示数据。
我们在具体解析这些html标签有两种方法:
通过javatm中的swing类来解析或通过bot包中的htmlpage类来解析,本人在实际编程中采用后者。
bot包中的htmlpage类用来从指定url中读取数据并检索出有用的信息。
下面给出该类几种重要的方法。
htmlpage构造函数构造对象并指定用于通讯的http对象
publichtmlpage(httphttp)getforms方法获取最后一次调用open方法检索到的表单清单
publicvectorgetforms()gethttp方法获取发送给构造函数的http对象
publichttpgethttp()getimage方法获取指定页面的图片清单
publicvectorgetimage()getlinks方法获取指定页面的连接清单
publicvectorgetlinks()open方法打开一个页面并读入该页面,若指定了回调对象则给出所有该对象数据
publicvoidopen(stringurl,htmleditorkit.parsercallbacka)
3.2.2spider程式结构
网络机器人必须从一个网页迁移到另一个网页,所以必须找到该页面上的超连接。
程式首先解析网页的html代码,查找该页面内的超连接然后通过递归和非递归两种结构来实现spider程式。
递归结构
递归是在一个方法中调用自己本身的程式设计技术。
虽然比较容易实现但耗费内存且不能使用多线程技术,故不适合大型项目。
非递归结构
这种方法使用队列的数据结构,当spider程式发现超连接后并不调用自己本身而是把超连接加入到等待队列中。
当spider程式扫描完当前页面后会根据制定的策略访问队列中的下一个超连接地址。
虽然这里只描述了一个队列,但在实际编程中用到了四个队列,他们每个队列都保存着同一处理状态的url。
等待队列在这个队列中,url等待被spider程式处理。
新发现的url也被加入到这个队列中
处理队列当spider程式开始处理时,他们被送到这个队列中
错误队列如果在解析网页时出错,url将被送到这里。
该队列中的url不能被移入其他队列中
完成队列如果解析网页没有出错,url将被送到这里。
该队列中的url不能被移入其他队列中
在同一时间url只能在一个队列中,我们把他称为url的状态。
以上的图表示了队列的变化过程,在这个过程中,当一个url被加入到等待队列中时spider程式就会开始运行。
只要等待队列中有一个网页或spider程式正在处理一个网页,程式就会继续他的工作。
当等待队列为空并且当前没有所有网页时,spider程式就会停止他的工作。
3.2.3怎么构造spider程式
在构造spider程式之前我们先了解下程式的各个部分是怎么一起工作的。
及怎么对这个程式进行扩展。
流程图如下所示:
ispiderreportable接口
这是个必须实现的接口,能通过回调函数接受spider所遇见的页面。
接口定义了spider向他的控制者发送的几个事件。
通过提供对每个事件的处理程式,能创建各种spider程式。
下面是他的接口声明:
publicinterfaceispiderreportable{
publicbooleanfoundinternallink(stringurl);
publicbooleanfoundexternallink(stringurl);
publicbooleanfoundotherlink(stringurl);
publicvoidprocesspage(httppage);
publicvoidcompletepage(httppage,booleanerror);
publicbooleangetremovequery();
publicvoidspidercomplete();}
3.2.4怎么提高程式性能
internet中拥有海量的web页面,如果研发出高效的spider程式是非常重要的。
下面就来介绍下几种提高性能的技术:
java的多线程技术
线程是通过程式的一条执行路线。
多线程是个程式同时运行多个任务的能力。
他是在一个程式的内部进行分工合作。
优化程式的通常方法是确定瓶颈并改进他。
瓶颈是个程式中最慢的部分,他限制了其他任务的运行。
据个例子说明:
一个spider程式需要下载十个页面,要完成这一任务,程式必须向服务器发出请求然后接受这些网页。
当程式等待响应的时候其他任务不能执行,这就影响了程式的效率。
如果用多线程技术能让这些网页的等待时间合在一起,不用互相影响,这就能极大的改进程式性能。
数据库技术
当spider程式访问一个大型web站点时,必须使用一种有效的方法来存储站点队列。
这些队列管理spider程式必须维护大型网页的列表。
如果把他们放在内存中将会是性能下降,所以我们能把他们放在数据库中减少系统资源的消耗。
3.2.5网络机器人的代码分析
程式结构图如下:
程式代码实现如下:
packagenews;/***新闻搜索引擎*版本1.0*/
importcom.heaton.bot.http;
importcom.heaton.bot.httpsocket;
importcom.heaton.bot.ispiderreportable;
importcom.heaton.bot.iworkloadstorable;
importcom.heaton.bot.spider;
importcom.heaton.bot.spiderinternalworkload;/***构造一个bot程式*/
publicclasssearcherimplementsispiderreportable{
publicstaticvoidmain(string[]args)
throwsexception{iworkloadstorablewl=newspiderinternalworkload();
searcher_searcher=newsearcher();
spider_spider=newspider(_searcher,"http:
//127.0.0.1/news.htm",newhttpsocket(),100,wl);_spider.setmaxbody(100);
_spider.start();}//发现内部连接时调用,url表示程式发现的url,若返回true则加入作业中,否则不加入。
publicbooleanfoundinternallink(stringurl){
returnfalse;}//发现外部连接时调用,url表示程式所发现的url,若返回true则把加入作业中,否则不加入。
publicbooleanfoundexternallink(stringurl){
returnfalse;}//当发现其他连接时调用这个方法。
其他连接指的是非html网页,可能是e-mail或ftp
publicbooleanfoundotherlink(stringurl){
returnfalse;}//用于处理网页,这是spider程式要完成的实际工作。
publicvoidprocesspage(httphttp){
system.out.println("扫描网页:
"+http.geturl());
newhtmlparse(http).start();}//用来请求一个被处理的网页。
publicvoidcompletepage(httphttp,booleanerror){}//由spider程式调用以确定查询字符串是否应删除。
如果队列中的字符串应当删除,方法返回真。
publicbooleangetremovequery(){
returntrue;}//当spider程式没有剩余的工作时调用这个方法。
publicvoidspidercomplete(){}
}
3.3小节
在本章中,首先介绍了网络机器人的基本概念,然后具体分析了spider程式的结构和功能。
在最后还结合具体代码进行了周详说明。
本人在编程中运用了javatm技术,主要涉及到了net和io两个包。
此外还用了第三方研发包bot(由jeffheaton提供的研发包)。
第四章基于lucene的索引和搜索
4.1什么是lucene全文检索
lucene是jakartaapache的开源项目。
他是个用java写的全文索引引擎工具包,能方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
4.2lucene的原理分析
4.2.1全文检索的实现机制
lucene的api接口设计的比较通用,输入输出结构都非常像数据库的表==>记录==>字段,所以非常多传统的应用的文件、数据库等都能比较方便的映射到lucene的存储结构和接口中。
总体上看:
能先把lucene当成一个支持全文索引的数据库系统。
索引数据源:
doc(field1,field2...)doc(field1,field2...)\indexer/_____________|luceneindex|--------------searcher\
结果输出:
hits(doc(field1,field2)doc(field1...))
document:
一个需要进行索引的“单元”,一个document由多个字段组成
field:
字段
hits:
查询结果集,由匹配的document组成
4.2.2lucene的索引效率
通常书籍后面常常附关键词索引表(比如:
北京:
12,34页,上海:
3,77页……),他能够帮助读者比较快地找到相关内容的页码。
而数据库索引能够大大提高查询的速度原理也是相同,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍……而索引之所以效率高,另外一个原因是他是排好序的。
对于检索系统来说核心是个排序问题。
由于数据库索引不是为全文索引设计的,因此,使用like"%keyword%"时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,like对性能的危害是极大的。
如果是需要对多个关键词进行模糊匹配:
like"%keyword1%"andlike"%keyword2%"...其效率也就可想而知了。
所以建立一个高效检索系统的关键是建立一个类似于科技索引相同的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表,用于存储关键词==>文章映射关系,利用这样的映射关系索引:
[关键词==>出现关键词的文章编号,出现次数(甚至包括位置:
起始偏移量,结束偏移量),出现频率],检索过程就是把模糊查询变成多个能利用索引的精确查询的逻辑组合的过程。
从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是个排序问题。
由此能看出模糊查询相对数据库的精确查询是个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。
lucene最核心的特征是通过特别的索引结构实现了传统数据库不擅长的全文索引机制,并提供了扩展接口,以方便针对不同应用的制定。
能通过一下表格对比一下数据库的模糊查询:
lucene全文索引引擎
数据库
索引
将数据源中的数据都通过全文索引一一建立反向索引
对于like查询来说,数据传统的索引是根本用不上的。
数据需要逐个便利记录进行grep式的模糊匹配,比有索引的搜索速度要有多个数量级的下降。
匹配效果
通过词元(term)进行匹配,通过语言分析接口的实现,能实现对中文等非英语的支持。
使用:
like"%net%"会把netherlands也匹配出来,多个关键词的模糊匹配:
使用like"%com%net%":
就不能匹配词序颠倒的
匹配度
有匹配度算法,将匹配程度(相似度)比较高的结果排在前面。
没有匹配程度的控制:
比如有记录中net出现5词和出现1次的,结果是相同的。
结果输出
通过特别的算法,将最匹配度最高的头100条结果输出,结果集是缓冲式的小批量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 JAVA 技术 搜索引擎 研究 实现