《毕业设计(论文)搜索模块的研究与开发.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)搜索模块的研究与开发.doc(18页珍藏版)》请在三一办公上搜索。
1、XXXXXXX学院专科毕业论文题 目 搜索模块的研究与开发 学生姓名 XXXXX 专业班级 XXXXXXXX 学 号 XXXXXXXXXX 院 (系)XXXXXXXXXXXXXX指导老师 XXX完成时间 20XX 年X 月 XX 日搜索模块的研究与开发摘 要企业在激烈的竞争中如果不能或不会利用互联网的话,那是会被迟早淘汰掉的。企业利用互联网的一个实例就是网站。个人如果想在互联网展现自己的话也是频繁使用个人网站形式。网站相对于应用程序的一个主要的好处就是部署简单,升级方便,制作成本低,PS,你不会指望用户想看一条新闻而下一个客户端软件吧。搜索在当今互联网时代已成为不可或缺的一部分,它就相当于一个
2、目录,可以方便的导航到自己喜欢的部分。如果本论文没有目录的话,假如你想找这篇论文内的核心算法部分,你就需要拖着长长的滚动条上下来回翻动,你会感慨如果有一个目录来导航该多好啊。更进一步,如果有一个班的论文要看,如果想要找到里面的一篇某某人写的文章,需要一篇一篇打开看吗?如果有1万篇文章呢?搜索尤其适合于这种内容庞大,又有其特点的方面。互联网是一个神奇的东西,世界上第一个网站由蒂姆伯纳斯-李创建于1991年8月6日1,在2011年3月的调查中,Netcraft在侦测时收到了298,002,705个站点的反馈信息。我国域名总数为3,388,575个。2010年末全国总人口数为134100万人2,中国
3、网民规模预计为4.77亿,互联网普及率为35.6%,截至2011年3月28日,中国大陆IPv4地址数量约为3.18亿个,居全球第二位。就在2011年2月3日,全球互联网数字分配机构(IANA)正式宣布已经将IPv4地址库剩余的5个A地址平均分配给包括APNIC在内的五个地区性互联网注册管理机构(RIR),标志全球现有的IPv4地址资源已经分配完毕,流传多年的“IPv4地址耗尽”预言终于成真3。关键字 搜索模块/导航与搜索/C#目 录摘 要I目 录II1 搜索引擎简介11.1 搜索引擎发展史11.2 搜索引擎的工作原理22 程序设计32.1 程序原理32.2 结构设计42.2.1数据类结构52.
4、2.2 逻辑类结构62.2.3 接口类结构83 接口文档93.1 接口93.2 事件10结束语11致 谢12参考文献13附 录141 搜索引擎简介1.1 搜索引擎发展史1990年初当时万维网还未出现,为了查询散布在各个分散的主机中的文件,曾有过Archie、Gopher等搜索工具,随着互联网的迅速发展,基于HTTP访问的web技术的迅速普及,他们就不再能适应用户的需要。在1994年1月,第一个既可搜索又可浏览的分类目录EINet Galaxy(Tradewave Galaxy)上线,它还支持Gopher和Telnet搜索。同年4月,Yahoo目录诞生,随着访问量和收录链接数的增长,开始支持简单
5、的数据库查询。这就是我们说的早期的目录导航系统,他们的缺点是网站收录/更新都要靠人工维护,所以在信息量剧增的条件下,就不是非常受用了。 1994年7月,Lycos推出了基于robot的数据发掘技术,并支持搜索结果相关性排序,并且他第一个开始在搜索结果中使用了网页自动摘要。Infoseek也是同时期的一个重要代表,他们是搜索引擎史上一个重要的进步。 1995年,一种新的搜索引擎工具出现了中介搜索引擎(Meta Search Engine)或称为元搜索引擎,第一个中介搜索引擎是华盛顿大学的学生开发的Metacrawler。用户只需提交一次搜索请求,由中介搜索引擎负责转换处理后提交给多个预先选定的独
6、立搜索引擎,并将从各独立搜索引擎返回的所有查询结果,集中起来处理后再返回给用户。 1995年12月才登场亮相的AltaVista推出了大量的创新功能使它迅速到达当时搜索引擎的顶峰,它第一个支持自然语言搜索的搜索引擎,具备了基于网页内容分析,智能处理的能力,第一个实现高级搜索语法的搜索引擎(如AND、OR、NOT等),同时AltaVista还支持搜索新闻组,搜索图片等具有划时代意义的功能。同时期还有inktomi、HotBot等搜索引擎。 1997年8月Northernlight公司正式推出搜索引擎,它第一个支持对搜索结果进行简单的自动分类,也是当时拥有最大数据库的搜索引擎之一。 1998年10
7、月,Google诞生。它是目前世界上最流行的搜索引擎之一,具备很多独特而且优秀的功能,并且在界面等实现了革命性创新。 1999年5月,Fast(Alltheweb)公司发布了自己的搜索引擎AllTheWeb,它的网页搜索可利用ODP自动分类,支持Flash和pdf搜索,支持多语言搜索,还提供新闻搜索、图像搜索、视频、MP3、和FTP搜索,拥有极其强大的高级搜索功能。它曾经是最流行的搜索引擎之一,后在2003年2月被Overture收购。在中文搜索引擎领域,1996年8月成立的搜狐公司是最早参与作网络信息分类导航的网站,曾一度有“出门找地图,上网找搜狐”的美誉。由于其人工分类提交的局限性,随着网
8、络信息的暴增,逐渐被基于robot自动抓取智能分类的新一代信息技术取代。 北大天网是教育网最流行的搜索引擎,它由北大计算机系网络与分布式系统研究室开发,于1997年10月29日正式在CERNET上提供服务, 2000年初成立天网搜索引擎新课题组,由国家973重点基础研究发展规划项目基金资助开发,收录网页约6000万,利用教育网优势,有强大的ftp搜索功能。百度中文搜索由超链分析专利发明人、前Infoseek资深工程师李彦宏和好友徐勇2000年1月创建,目前支持网页信息检索,图片,Flash,音乐等多媒体信息的检索。并且百度在中文领域第一个开始使用ppc经营模式。1.2 搜索引擎的工作原理 搜索
9、引擎的工作原理大致可以分为:(1) 搜集信息:搜索引擎的信息搜集基本都是自动的。搜索引擎利用称为网络蜘蛛的自动搜索机器人程序来连上每一个网页上的超链接。(2) 整理信息:搜索引擎整理信息的过程称为“创建索引”。搜索引擎不仅要保存搜集起来的信息,还要将它们按照一定的规则进行编排。(3) 接受查询:用户向搜索引擎发出查询,搜索引擎接受查询并向用户返回资料。2 程序设计2.1 程序原理程序运行时需要提供搜索关键字和首地址(这个地址可以是待查网站内的任意的一个网页)。图 2-1 简要程序运行过程参数1,参数2接口类Class1判断URL可用参数一False丢弃下载头文件下载网页内容内容处理队列结果次线
10、程取存标志结束假存在程序收到这两个参数时,程序首先会尝试与该网页(参数2)连接,并根据返回结果判断此网页地址是否可用,如果不可用弃之。可用就会进一步请求网页头文件,并从头文件中取出此网页采用的编码方案,放入一个字符串类型的变量中,待以后解码网页内容时再强制转换为编码类型。随后程序下载纯网页内容(不包含图片以及Javascript脚本和CSS样式表)如果不出错的话,程序查找整个网页内的内部链接并将其存入一个队列当中,每当存入一个URL时,会触发一个添加事件。然后程序在当前网页内搜索关键字(参数1),等到搜索完整个页面时如果找到就生成一个SearchReault类的实例,并存贮在有序列表当中,有序
11、表会根据页面的关键字数量进行自动排序,这保证了取结果时永远最先得到关键字最多的网页。如果以上步骤顺利就激活另一线程,与主程序分工合作,主线程用于判断URL,添加URL,处理错误信息。而次线程专门用于取地址,分析网页内容。每当从队列中取出一个地址时,激发取地址事件。至此第一轮查找完成,之后主、次线程循环完成此过程,如果待分析的URL队列为空时并且标志位不为真时,次线程会休眠30毫秒,之后继续工作。如果待分析的URL队列为空且标志位为真时,次线程退出,整个搜索完成。参考图 2-12.2 结构设计 项目用到了三层结构设计-这是为了以后扩展程序提供了方便,因为目前这个程序能在一个页面内搜索,如果改动S
12、earch类中的一个函数,程序便可以搜索整个互联网。各个类之间的关系请看 图2-2;图2-2 类视图n 数据选择层 Jelly类 用于连接各式各样的数据库、数据结构文件,为了使程序简单小巧,而且这个程序本身并不复杂。我选择使用在内存中保存数据。(程序也提供了将结果保存在磁盘上的功能,只要在构造函数中指定存储路径就可以了,默认保存在桌面上)。n 搜索逻辑层程序的核心所在,功能实现在Search类中,由于需要多处处理html元素,于是又分出一个HtmlElement类来辅助Search类,它的功能是存储、处理单个HTML元素。n 通用接口层其他程序能够使用这个模块,都是通过调用这个接口类来实现的,
13、由于简单,名字就用默认类名了。这个类封装了全部的底层功能实现,组合各个底层类的功能,方便了其它程序的调用。2.2.1数据类结构数据存储类包含两个,Jelly类和MyList类。后者为核心,由于搜索的结果的每一项需要存储许多信息,于是另外写了一个数据类型SearchReault类供MyList类调用,每当MyList类插入数据时会自动判断要插入数据的价值,并插入到合适的位置。前者为一个数据工厂类,其它类需要访问数据时,必须调用此类。这两个类的详细信息看图2-3和图2-4。 图 2-3核心算法如下: public void Add(SearchResult value) if (value = n
14、ull)图 2-4 return; if (values.Count = 0) values.Add(value); return; values.Add(value); for (int i = 0; i = 0) SearchResult temp=valuesi; valuesi=value; for (int j = values.Count-1; j i+1; j-) valuesj = valuesj - 1; valuesi + 1 = temp; break; 2.2.2 逻辑类结构逻辑类当中也包含两个类,HtmlElement类和Search类。主搜索引擎Search类会从上
15、层类传来的网页地址下载网页的头文件,并从头文件中分析此网页的正确与否、编码方案等,如果顺利便下载此网页的内容,并用对应的编码方案读取网页内容。然后搜索其中的内链接和关键字,如果找到,Search类会立即查找内链接或关键字周围的HTML标签,智能转换为HTML元素之后将转换后的HTML元素交给HtmlElement类来分析,HtmlElement类将分析的结果转换为一个SearchResult类的实例回交给Search类,Search类再将此结果递交给上层类。这两个类的详细信息如图2-5 和图2-6图 2-5 Search类图 2-6 HtmlElement类2.2.3 接口类结构图2-7 事件
16、的参数类接口层中的类会调用其它层中的类,并向外提供一个开放的标准接口调用,这个层中包含了一个委托类(ActionEActionEventHandler和一个用于在事件中传递参数的类(ActionEventArges,图 2-7) 、两个类(SearchReault类,图2-8和Class1类,图2-9),Class1类会在内部实例化Search类和Jelly类,声明一个Queue类用于存放可用的URL,实例化SearchResult类数组用于存放结果。声明两个事件(addUrl_event和removeUrl_event)用于程序调试。第一次启动程序时,图2-8 SearchResult类主线
17、程会分析参数2中的网页URL中的内连接并经过一个过滤函数(CheckUrl)存入URL队列中,之后程序执行GoNextPage函数然后激活次线程开始和次线程分工合作(在程序原理中已经讲到,在此不重复)。图 2-9 Class1类3 接口文档3.1 接口通过构造函数传入程序需要的参6570表 3-1 程序中所需要提供的构造参数参数名类型说明startUrlstring待搜索的网站内任意一个网页,之后程序会自动根据这个网页内的内链接搜索完整个网站keystring搜索的关键字replacestring找到关键字时用replace替换掉关键字。例如 key设置为“郑州” 而replace设置为“郑州
18、”这样在显示找到的内容中时,关键字会以粗体显示,可以使用任意替换,使结果中关键字任意显示,如高亮或斜粗体等distanctint查找到内容的长度(以关键字为中心分别向左右最长扩展distanct个字符),搜索到的内容最长为distanct*2+key的长度3.2 事件表 3-2 事件事件名称委托说明addUrl_eventActionEventHandler当在当前页搜索到一个可用的内链接,并将其添加到有序表的时候触发此事件,事件参数中会包含有序表的项数,和正要添加到有序表的URL。removeUrl_eventActionEventHandler当从URL栈中删除一个URL时触发此事件,事件
19、参数包含了正要删除的URL和栈中的项数。当该事件触发时表明程序已经分析完该URL。u ActionEventHandler 委托声明如下public delegate void ActionEventHandler(object sender, ActionEventArges e);u ActionEventArges 类如下: public class ActionEventArges : EventArgs public ActionEventArges(string url, int count) this.url = url; this.count = count; string u
20、rl; int count; public int Count get return count; public string URL get return url; /set url = value; 结束语由于自己的自觉性不够导致自己在大一、大二两年没能把太多的时间花在学习上使得自己在对编程语言的基础知识没有很好的掌握,而到了大三就觉得什么也不会,都在慢慢的补救。通过对毕业设计的完成使自己在编程方面成长了很多,也学到了很多。在对本课题实现过程中,使自己更进一步了解了面向对象编程,使我自己的编程能力有了新的提高,考虑问题的角度也有了改进,组织软件结构的能力也有所提升。这一过程是一个非常锻炼人
21、的过程,也是一个非常适合提高自己的过程,在这个过程中,综合锻炼了一个人独立考虑问题,独立解决问题,以及不断反思的能力,应当好好把握。目前知道的不足之处:1) 不支持“属性中=后面有空格” 在Search.cs文件中行3332) 会引发异常 (原理上如此,实际测试未出现过) 在Search.cs文件中行239致 谢在论文即将完成的时候,心情实在有些激动,回想一路走来所有帮助过我、支持过我、批评过我、嘲笑过我的人,我想说,谢谢你们。帮助过我、支持过我的人们,谢谢你们给了我信心;批评过我的人们,谢谢你们让我明白了自己的错误、发现了自己的缺点;嘲笑过我的人们,谢谢你们给了我不断向前的动力,以反驳你们的
22、嘲笑。在此,我感谢张老师在大学最后阶段里给我的支持和帮助,您严谨的治学风范和平易近人的学术态度都是我为之学习和奋斗的目标。正是有了您的帮助我才能在短短几个月中有这样的成果,才能认识到独立学习和研究的重要性。在本文的完成过程中,许多同学都给予了不同形式的帮助,在这里我也表示感谢,谢谢他们默默无闻的付出。参考文献1维基百科-互联网http:/zh.wikipedia.org/zh-cn/%E4%BA%92%E8%81%94%E7%BD%912根据国家统计局发布的2010年国民经济和社会发展统计公报初步预计 3中国互联网信息中心CNNIC互联网发展信息与动态2011 年 3 月 总第 65 期附 录
23、一个简单的程序调用示例代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using ClassLibrary1;using System.Text.RegularExpressions;using System.IO;using System.Net;namespace ConsoleApplication1 class Program static void Main(string args) string url2 = string key = 版权; Class1 cla
24、ss1 = new Class1(url2, key, | + key+|, 10); sw = fi.AppendText(); Class1.addUrl_event += addUrl; Class1.removeUrl_event += removeUrl; class1.GoNextPage(); SearchResult srs = class1.Result; Console.ForegroundColor = ConsoleColor.Yellow; for (int i = 0; i srs.Length; i+) Console.WriteLine(srsi.UrlTitl
25、e); foreach (string s in srsi.Contents) Console.WriteLine(s); Console.WriteLine(srsi.UrlPath + + srsi.WebDate.ToLongDateString() + + srsi.Contents.Length); Console.WriteLine(); sw.Flush(); Console.WriteLine(完成 共找到 + srs.Length + 个); Console.ReadLine(); static string filePath1 = c:documents and setti
26、ngsadministrator桌面456.txt; static FileInfo fi = new FileInfo(filePath1); static StreamWriter sw; static void addUrl(object sender, ActionEventArges e) Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(0 : 1, e.Count, e.URL); static void removeUrl(object sender, ActionEventArges e) Console.ForegroundColor = ConsoleColor.Magenta; Console.WriteLine(0 : 1, e.Count, e.URL); sw.WriteLine(- + e.Count + + e.URL);