![【搜索引擎的设计与实现5800字(论文)】_第1页](http://file4.renrendoc.com/view10/M00/3A/1F/wKhkGWWO4AeAEvNhAAGd9n1nfUo195.jpg)
![【搜索引擎的设计与实现5800字(论文)】_第2页](http://file4.renrendoc.com/view10/M00/3A/1F/wKhkGWWO4AeAEvNhAAGd9n1nfUo1952.jpg)
![【搜索引擎的设计与实现5800字(论文)】_第3页](http://file4.renrendoc.com/view10/M00/3A/1F/wKhkGWWO4AeAEvNhAAGd9n1nfUo1953.jpg)
![【搜索引擎的设计与实现5800字(论文)】_第4页](http://file4.renrendoc.com/view10/M00/3A/1F/wKhkGWWO4AeAEvNhAAGd9n1nfUo1954.jpg)
![【搜索引擎的设计与实现5800字(论文)】_第5页](http://file4.renrendoc.com/view10/M00/3A/1F/wKhkGWWO4AeAEvNhAAGd9n1nfUo1955.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE4搜索引擎的设计与实现目录TOC\o"1-3"\h\u12861一、引言 426364二、需求分析 429897(一)开发背景 425141(二)系统功能 5175781.功能划分 539822.功能描述 516588三、系统设计 632071(一)系统整体架构 61379(二)系统模块设计 6270911.数据采集模块 6260872.搜索引擎模块 722128(三)数据库设计 829623四、系统实现 914259(一)数据采集 97927(二)搜索引擎的实现 1431596(三)数据访问层的实现 1727514五、系统测试 205757(一)系统测试的必要性 20168011.单元测试 2088612.集成测试 20255033.验收测试 214905(二)采集数据模块的测试 214489(三)搜索引擎的测试 22357六、总结 2321472参考文献 26一、引言搜索引擎,通常指的是收集了互联网上几千万到几十亿个网页并对网页中的每一个文字(即关键词)进行索引,建立索引数据库的全文搜索引擎。当用户查找某个关键词的时候,所有在页面内容中包含了该关键词的网页都将作为搜索结果被搜出来。在经过复杂的算法进行排序后,这些结果将按照与搜索关键词的相关度高低,依次排列。随着信息化的发展,越来越多的人通过搜索引擎来寻找自己所需要的东西,用户在搜索引擎中输入某一关键词的时候,会有成千上万甚至百万千万上亿的结果,那么在茫茫的信息海洋中我们如何才能让用户找到我们网站上相关的内容呢?互联网的信息如浩瀚的海洋一样,如何在这个无边无际的海洋找出对用户最有用的信息就是搜索引擎的主要作用。搜索引擎,往往是大多数用户进入互联网的入口。搜索引擎的出现,整合了众多网站信息,恰恰起到了信息导航的作用。通用搜索引擎就如同互联网第一次出现的门户网站一样,大量的信息整合导航,极快的查询,将所有网站上的信息整理在一个平台上供网民使用,于是信息的价值第一次普遍的被众多商家认可,迅速成为互联网中最有价值的领域。搜索引擎的便捷使其成为互联网最受欢迎的应用之一。以至于有相当多的人将浏览器的默认首页设为搜索引擎,甚至形成了将网站名称输入到搜索框中而非浏览器地址栏这样独特的网络导航习惯。总的来说,搜索引擎直接改变了人们的网络习惯,人们进入网络第一个想到的就是搜索引擎。网络化就是信息化,在网络化的今天、信息爆炸式增长的今天。研究搜索引擎具有重要而深远的意义。二、需求分析(一)开发背景而随着新闻技术的飞速发展,特别是因特网应用的迅速普及,网站越来越多,并且每天全球互联网网页数目以千万级的数量增加。要在浩瀚的网络新闻中寻找所需要的材料无异于大海捞针。网页是因特网的最重要组成部分,也是人们获取网络信息的最主要来源,为了方便人们在大量繁杂的网页中寻找出自己需要的信息,搜索引擎就应运而生了。搜索引擎是人们网上购物、看电影、看小说、看图片等网络使用中的第一个首选入口。其重要性不言而喻。互联网的海量信息,让人眼花缭乱,如果在短时间内没有找到用户想要的信息,不仅影响用户的心情,而且影响用户的工作效率。所以搜索引擎最核心也是最重要的是对关键字的匹配程度。匹配程度越高得到的结果越贴近用户的需求,也越得到用户的青睐。目前的搜索引擎可分为三类:一是全文搜索引擎,它是从互联网提取各个网站的信息(以网页文字为主),建立起数据库,并能检索与用户查询条件相匹配的记录,按一定的排列顺序返回结果。二是目录索引,它是按目录分类的网站链接列表而已,用户完全可以按照分类目录找到所需要的信息,不依靠关键词进行查询。三是元搜索引擎,他先是接受用户查询请求后,同时在多个搜索引擎上搜索,并将结果返回给用户。(二)系统功能1.功能划分主要功能包括:数据采集、数据保存、数据排序、搜索引擎、前台显示。2.功能描述(1)数据采集对指定链接的网页中的所有的超连接进行采集,然后对没一条超链接进行进一步的解析,按一定的规则把超链接的网页的内容采集出来。(2)数据保存把采集到的数据保存到数据库。数据的主要内容包括:网页标题、作者、内容、发表时间、链接地址。(3)数据排序对符合搜索条件的数据进行排序,排序规则是关键字的匹配和网页的发表时间。(4)搜索引擎首先响应用户的HTTP请求,获取搜索关键字;然后查询数据库里面匹配关键字的数据,把符合条件的数据提取出来,存到一个临时表中;最后查询临时表的数据并排序,返回数据。(5)前台显示获取从服务器返回的数据,按照一定的规则显示在最后的显示页面。三、系统设计(一)系统整体架构该系统所采用的B/S模式在逻辑体系结构上可以分为用户表现层、业务逻辑层、数据服务层3层体系统结构.B/S模式有着C/S模式不可比拟的优势,如:简化了客户端,不论基于何种平台,只须安装一种通用的浏览器,采用同样的界面访问;能够跨越异质异构网络;稳定性高;特别适用于网上信息发布;服务器端升级维护集中、方便,服务器端可以任意扩充,而对客户端不产生任何影响等.图3.1为B/S模式体系结构图.图3.1B/S模式体系结构图(二)系统模块设计按照系统分析的结果,搜索引擎系统设计的主要是实现数据采集、数据保存、数据排序、搜索引擎、前台显示。根据整体的需求,这个系统也可以分为两个大的分类,即采集数据和显示数据。所以搜索系统主要可以分成两个模块:数据采集模块和搜索引擎模块。1.数据采集模块数据采集模块的功能又称“网络蜘蛛”。顾名思义,网络蜘蛛就是在网络上爬行的程序,用他来抓取web服务器上的web文档,它可以在扫描web页面的同时检索其内的超链接并加入扫描队列等待以后扫描。扫描队列主要扫描URL链接和URL链接下的网页内容,包括:网页标题、作者、内容、发表时间、链接地址。获取到的数据,逐一保存到数据库中去。具体实现逻辑如图。图3.2数据采集流程图2.搜索引擎模块搜索引擎模块主要完成用户对数据的搜索功能。用户使用浏览器,输入搜索的关键字,点击提交。服务器收到用户发出的搜索请求,获取请求中的搜索关键字,然后到数据库中搜索匹配关键字的数据。取出匹配的数据之后按一定的规则排序,最后返回展示到用户界面。整个模块采用的是MVC三层设计模式,M层(即Modle层)代表实体数据模块,V层(即View层)代表数据展示模块,C层(即Control层)代表逻辑控制模块。具体设计逻辑如图。图3.3搜索引擎流程图(三)数据库设计根据系统要求与模块设计,数据库设计主要分成两个表:数据表和排序临时表。数据表的主要作用是存储“数据采集器”采集下来的数据,排序临时表是根据搜索关键字取出来排序的数据。数据表包括的字段有:编号、标题、作者、内容、发表时间、链接地址。表3.1数据表字段名是否主键字段类型字段长度是否为允许为空备注id是bigint32否编号newstitle否varchar100是标题newsauthor否varchar100是作者newscontent否text65535是内容newsurl否varchar300是链接地址newsdate否varchar100是日期排序临时表包括的字段有:编号、标题、作者、内容、发表时间、链接地址。表3.2排序临时表字段名是否主键字段类型字段长度是否为允许为空备注id是bigint32否编号newstitle否varchar100是标题newsauthor否varchar100是作者newscontent否text65535是内容newsurl否varchar300是链接地址newsdate否varchar100是日期newsdate_int否varchar100是日期数值四、系统实现(一)数据采集数据采集的实现主要是用了javaswing技术。在操作界面中有url输入框、设置抓取周期输入框。url指的是采集目标的网址。抓取周期是隔一定的时间抓取一次。当点击开始按钮时,系统会检查输入url的合法性,如果url合法,则检查抓取周期是否输入。检查都通过后,系统启动线程抓取数据。实现效果如图。图4.1数据采集界面解析数据的实现主要用到了开源jar包htmlparser.jar,htmlparser.jar可以实现对几乎全部网页的解析。里面包含有多种解析方法。本系统中主要用到了标题解析、内容解析、作者解析、日期解析。标题解析的实现代码如下:NodeFiltertitleFilter=newTagNameFilter("title");privateStringgetTitle(NodeFiltertitleFilter,Parserparser){StringtitleName="";try{NodeListtitleNodeList=(NodeList)parser.parse(titleFilter);if(titleNodeList.size()>0){ Nodenode_title=titleNodeList.elementAt(0);//取节点 if(node_title!=null){ titleName=node_title.toPlainTextString(); }}}catch(ParserExceptionex){ex.printStackTrace();}returntitleName;}内容解析的实现代码如下:NodeFiltercontentFilter1=newAndFilter(newTagNameFilter("div"),newHasAttributeFilter("id","Cnt-Main-Article-QQ"));NodeFiltercontentFilter2=newAndFilter(newTagNameFilter("div"),newHasAttributeFilter("class","explain"));NodeFiltercontentFilter=newOrFilter(contentFilter1,contentFilter2);privateStringgetNewsContent(NodeFilternewsContentFilter,Parserparser){Stringcontent=null;StringBuilderbuilder=newStringBuilder();try{NodeListnewsContentList=(NodeList)parser.parse(newsContentFilter);for(inti=0;i<newsContentList.size();i++){ DivnewsContenTag=(Div)newsContentList.elementAt(i);builder=builder.append(newsContenTag.getStringText());}content=builder.toString();if(content!=null){parser.reset();parser=Parser.createParser(content,"gb2312");StringBeansb=newStringBean();sb.setCollapse(true);parser.visitAllNodesWith(sb);content=sb.getStrings();if(content!=null){content=content.replaceAll("\\\".*[a-z].*\\}","");content=content.replace("[我来说两句]","");}}else{System.out.println("没有得到新闻内容!");}}catch(ParserExceptionex){ex.printStackTrace();}returncontent;}作者解析的实现代码如下:NodeFilternewsauthorFilter1=newAndFilter(newTagNameFilter("div"),newHasAttributeFilter("class","ll"));NodeFilternewsauthorFilter2=newAndFilter(newTagNameFilter("span"),newHasAttributeFilter("class","color-a-3"));NodeFilternewsauthorFilter=newAndFilter(newsauthorFilter2,newHasParentFilter(newsauthorFilter1));privateStringgetNewsAuthor(NodeFilternewsauthorFilter,Parserparser){StringnewsAuthor="";try{ //依据newsauthorFilter的法则对网页进行过滤NodeListauthorList=(NodeList)parser.parse(newsauthorFilter);//获取责任编辑字符串for(inti=0;i<authorList.size();i++){ SpanauthorSpan=(Span)authorList.elementAt(i);newsAuthor=authorSpan.getStringText();}}catch(ParserExceptionex){ex.printStackTrace();}returnnewsAuthor;}日期解析的实现代码如下:NodeFilternewsdateFilter1=newAndFilter(newTagNameFilter("div"),newHasAttributeFilter("class","ll"));NodeFilternewsdateFilter2=newAndFilter(newTagNameFilter("span"),newHasAttributeFilter("class","article-time"));NodeFilternewsdateFilter=newAndFilter(newsdateFilter2,newHasParentFilter(newsdateFilter1));privateStringgetNewsDate(NodeFilterdateFilter,Parserparser){StringnewsDate="";try{NodeListdateList=(NodeList)parser.parse(dateFilter);for(inti=0;i<dateList.size();i++){ SpandateTag=(Span)dateList.elementAt(i);newsDate=dateTag.getStringText();}}catch(ParserExceptionex){ex.printStackTrace();}returnnewsDate;}(二)搜索引擎的实现搜索引擎的实现是整个系统的核心部分,其主要要解决的问题是提取出匹配搜索关键字的数据,并进行排序。关键字的匹配方式是:先用关键字和数据库中的newstitle字段进行匹配,然后再匹配newscontent字段。排列的方式是:先把时间转换成数字形式,然后用SQL语句中的从大到小排序。图4.2搜索引擎实现流程图实现查询数据的关键代码如下:publicList<NewsBean>getNews(intstart,intend,StringkeyWord){ DBdb=newDB(); List<NewsBean>list=newArrayList<NewsBean>(); ResultSetresult=null; try{ StringgetSql="select*fromsortedNewsorderbynewsdate_intDESClimit"+start+","+end; System.out.println(getSql); result=db.executeQuery(getSql); if(null!=result){ while(result.next()){ Stringtitle=result.getString("newstitle"); Stringauthor=result.getString("newsauthor"); Stringcontent=result.getString("newscontent"); Stringurl=result.getString("newsurl"); Stringdate=result.getString("newsdate"); StringmTitle=title.replace(keyWord,"<fontcolor=\"red\">"+keyWord+"</font>"); StringmContent=getTagContent(content,keyWord); if("".equals(author)||null==author||"null".equals(author)){ author="不详"; } if("".equals(date)||null==date||"null".equals(date)){ date="不详"; } System.out.println("content:::"+mContent); System.out.println("titile:"+title); NewsBeanbean=newNewsBean(); bean.setNewsTitle(mTitle); bean.setNewsAuthor(author); bean.setNewsContent(mContent); bean.setNewsURL(url); bean.setNewsDate(date); list.add(bean); } result.close(); } }catch(Exceptione1){ e1.printStackTrace(); }finally{ if(db!=null)db.all_close(); if(result!=null){ try{ result.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } returnlist; }(三)数据访问层的实现数据访问层是与数据库交互的层面.主要的作用是对数据的持久化操作,增强系统的可移植性,隐藏数据访问细节.在系统实现过程中,核心业务主要通过WebService层来实现,Web层将用户请求发给WebService层,WebService层进行业务处理,并通过数据访问层与后台数据库相交换,将数据结果发给Web层。数据访问层实现的主要方法是JDBC技术。数据库是用MySQL数据库作为容器。实现原理如图。图4.3数据访问实现原理图连接数据库代码如下:publicstaticConnectionPoolGetPoolInstance(){ if(poolInstance==null){ poolInstance=newConnectionPool( "com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/news_db", "root","root"); try{ poolInstance.createPool(); }catch(Exceptione){ e.printStackTrace(); } } returnpoolInstance; }执行查询数据操作代码如下:publicResultSetexecuteQuery(Stringsql)throwsException{ try{ /* *Class.forName("xool.ProxoolDriver");con= *DriverManager.getConnection("proxool.xml-test"); */ conn=connPool.getConnection(); stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); rs=stmt.executeQuery(sql); }catch(SQLExceptione){ throwe; } //catch(NamingExceptione){throwe;} returnrs; }执行更新数据库操作代码如下:publicintexecuteUpdate(Stringsql)throwsException{ //stmt=null; //rs=null; intresult=0; try{ conn=connPool.getConnection(); stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); result=stmt.executeUpdate(sql); }catch(SQLExceptionex){ System.err.println("执行SQL语句出错:"+ex.getMessage()); } returnresult; }五、系统测试(一)系统测试的必要性随着信息技术的飞速发展,软件产品已深入到社会生活的各个领域,软件产品的质量自然成为人们关注的焦点。作为商品的产品,都需要经过严格的质量测试,软件产品也不能例外。软件测试是发现软件中错误和缺陷的重要手段,并且实践证明,软件中存在缺陷所造成的损失将远远高于测试的费用,并可能产生其它责任风险和连锁损失。在一些特殊领域(如航空、国防等),如果使用未经全面测试的软件,还可能造成灾难性后果。1.单元测试在软件系统中,每个模块完成一个清晰定义的子功能并且他和同级的其他模块的功能之间是相对独立的。因此,把每个模块作为一个单独的实体进行测试来发现错误。通常单元测试和编码属于软件工程的同一个阶段。在编写出源程序代码并通过了编译程序的语法检查之后,可以应用人工测试和计算机测试两种类型的测试,完成单元测试工作。它主要检查逻辑设计错误和编码错误。这一步由本人在程序编译通过后,通过实际运行该模块来进行测试。测试结果达到预定方案要求。2.集成测试集成测试是测试和组装软件的系统化技术。把模块组装起来同时进行测试,主要目标是测试模块间的协调和通信,着重测试模块间的接口。本系统采用渐增式测试方法,将下一个要测试的模块同已经测试好的那些模块结合起来进行测试。这一步在本系统各模块完成连接后由本人进行运行测试,接口通信良好,系统运行正常。3.验收测试验收测试是将系统作为一个实体进行测试,它是测试工作的最后一步。验收测试是在用户的积极参与下进行的,让用户使用系统来测试系统是否满足用户的需要,最终提出意见,为下一步改进提供参考信息。这一步在系统完成后,根据当初需求分析调查结果,由本人设计数据在不同条件下对系统进行实际数据测试。测试结果达到预定方案中的需求分析要求。(二)采集数据模块的测试测试步骤:首先运行数据采集程序,在url输入框中,输入,在设定定时抓取间隔输入框中输入500。然后点击开始按钮,效果如图图5.1测试界面采集结果是在数据库中的news表中插入了1157条记录,说明成功从1164条url链接中采集了1157条数据。成功率为99%。结果基本让人满意。查看数据库中的数据,发现数据已经成功插入。大部分数据采集成功。图5.2数据采集界面(三)搜索引擎的测试测试步骤:在IE浏览器中的地址栏输入http://localhost:8080/SerchEngine/,跳转如下页面。图
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 木工包清工合同
- 高层建筑装修安全合同范例
- 2025年度包装咨询行业集体劳动合同(含员工培训)
- 二零二五年度办公室智能化改造劳动合同模板
- 房屋买卖委托代理合同年
- 电子支付领域的风险控制与安全管理
- 农业产业链智能化改造与升级指南
- 合同转包协议书
- 商品房买卖合同发布
- 劳务承包合同书样本
- DL∕T 974-2018 带电作业用工具库房
- Unit 2 We're going to do some research(教案)-2023-2024学年湘少版(三起)英语五年级下册
- 紧密型县域医疗卫生共同体慢病管理中心运行指南试行等15个指南
- 基金应知应会专项考试题库(证券类190题)附有答案
- 快速入门穿越机-让你迅速懂穿越机
- 水利安全生产风险防控“六项机制”右江模式经验分享
- 幼儿园卫生保健开学培训
- 食材配送服务售后服务方案
- 新目标(goforit)版初中英语九年级(全一册)全册教案-unit
- 《如何做一名好教师》课件
- 2016-2023年娄底职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
评论
0/150
提交评论