Google网站管理员指南

http://www.google.cn/support/webmasters/bin/answer.py?answer=35769

什么是 Google 网站管理员指南?

网站管理员指南

遵循这些指南将有助于 Google 查找、索引并对您的网站进行排名。即使您选择不采纳这些建议,我们也强烈建议您对”质量指南”多加留意,其中简要说明了一些可能造成网站从 Google 索引中彻底删除的违禁行为。网站被删除之后,Google.com 或 Google 所有合作伙伴网站的搜索结果中都不会再显示该网站。

网站准备就绪后:

* 将其他相关网站链接到您的网站上。
* 将其提交给 Google,网址为:http://www.google.com/addurl.html。
* 将 Sitemap 作为我们 Google Sitemaps(测试版)项目的一部分进行提交。Google Sitemaps 使用您的 Sitemap 了解您网站的结构并提高我们对您网页的利用率。
* 确保应了解您网页的所有网站都知道您的网站已处于在线状态。
* 将您的网站提交给相关的目录,例如,Open Directory Project 和 Yahoo!,以及其他特定行业的专业网站。

设计与内容指南

* 网站应具有清晰的层次结构和文本链接。每个网页应至少可以通过一个静态文本链接打开。
* 为用户提供一个网站地图,列出指向网站重要位置的链接。如果网站地图上的链接超过或大约为 100 个,则需要将网站地图拆分为多个网页。
* 网站应具有实用性且信息丰富,网页文字应清晰、准确地表述要传达的内容。
* 要考虑到用户会使用哪些字词来查找您的网页,确保网站上确实包含了这些文字。
* 尽量使用文字而不是图像来显示重要的名称、内容或链接,因为 Google 抓取工具无法识别图像中所含的文字。
* 确保 TITLE 和 ALT 标记具有说明性且表达精准无误。
* 检查链接是否损坏,并确保 HTML 格式正确。
* 如果采用动态网页(即网址中包含”?”字符),请注意并非每一个搜索引擎 Spider 都能像抓取静态网页一样抓取动态网页。动态网页有助于缩短参数长度并减少参数数目。
* 将给定网页上的链接限制在合理的数量内(少于 100)。

技术指南

* 由于大部分搜索引擎 Spider 查看网站的方式与 Lynx 一样,所以可使用 Lynx 一类文本浏览器来检查您的网站。如果因应用了 Javascript、Cookie、工作阶段 ID、框架、DHTML 或 Flash 等复杂技术,而导致在文本浏览器中无法看到网站的所有网页,则搜索引擎 Spider 在抓取您的网站时可能会遇到麻烦。
* 允许搜索漫游器抓取您的网站,同时不采用工作阶段 ID 或参数跟踪其在网站上的浏览路径。这些技术对跟踪单个用户的行为非常有用,但漫游器的访问模式却完全不同。如果采用这些技术,则可能会导致对网站的检索不完整,因为漫游器可能无法排除那些看上去不同,但实际却指向同一个网页的网址。
* 确保您的网络服务器支持 If-Modified-Since HTTP 标头。通过该功能,您的网络服务器可以告诉 Google 自上次抓取您的网站以来,内容是否已发生变化。该功能可以节省您的带宽和开销。
* 利用网络服务器上的 robots.txt 文件。该文件会告诉抓取工具可以抓取哪些目录。 确保该文件是网站的最新版本,以免意外拦截 Googlebot 抓取工具。 请访问 http://www.robotstxt.org/wc/faq.html,了解如何在漫游器浏览您的网站时对其进行指示。您可使用 Google Sitemaps 中的 robots.txt 分析工具测试 robots.txt 文件以确保正确使用该文件。
* 如果贵公司购买了内容管理系统,请确保该系统能导出您的内容,以便搜索引擎 Spider 可以抓取您的网站。
* 请勿使用”&id=”作为您网址的参数,因为我们不会在索引中包含这些网页。

质量指南
上述质量指南涵盖了最常见的作弊形式或操纵行为,对于此处未列出的其他误导行为(例如,通过注册知名网站的错拼形式来欺骗用户),Google 仍可予以拒绝。不要抱有侥幸心理,认为某种欺骗手段未在本页中列出,Google 就会认可该手段。作为网站管理员,与其花费大量时间寻找漏洞加以利用,不如尽其所能维护基本原则,以便为用户带来更好的体验,从而使网站获得更高的排名。如果您认为其他网站正在滥用 Google 质量指南,请通过 http://www.google.com/contact/spamreport.html 举报该网站。Google 希望能开发出灵活的自动解决方案来解决上述问题,因而尽量避免一一处理违禁行为。我们收到的垃圾邮件报告将用于创建灵活的算法以识别并阻止以后的垃圾邮件。

质量指南 – 基本原则

* 设计网页时该考虑的是用户,而不是搜索引擎。不要欺骗用户,或提交给搜索引擎一种内容,而显示给用户另一种。这种做法通常称为”隐藏”。
* 请不要为了提高搜索引擎排名而弄虚作假。一个简单分辨是非的方法是:您是否可以坦然地跟竞争对手网站解释您对网站所做的事情。另一个有用的测试即扪心自问:”这能否给我的用户带来帮助?如果不存在搜索引擎,我是否还会这样做?”
* 请不要参与旨在提高您的网站排名或 PageRank 的链接方案。尤其要避免链接到违禁的网站或”恶邻”,因为您自身的排名可受到这些链接的负面影响。
* 请不要使用未授权的计算机程序提交网页、检查排名等。这些程序会耗用计算机资源并违反我们的服务条款。 Google 不建议使用 WebPosition Gold™ 这类产品向 Google 发送自动查询或用程序编写的查询。

质量指南 – 具体指南

* 请不要使用隐藏文本或隐藏链接。
* 请不要采用隐藏真实内容或欺骗性重定向手段。
* 请不要向 Google 发送自动查询。
* 请不要使用无关用语加载网页。
* 请不要创建包含大量重复内容的多个网页、子域或域。
* 请不要创建安装病毒(如,特洛伊木马)或其他有害软件的网页。
* 请不要采用专门针对搜索引擎制作的”桥页”,也不要采用如联属计划这类原创内容很少或几乎没有原创内容的”俗套”(cookie cutter) 方式。
* 如果您的网站参加联属计划,请确保您的网站可为其增添价值。请提供独特而相关的内容,使用户有理由首先访问您的网站。

如果网站不符合我们的质量指南,则可能会将其排除在索引之外。如果认为您的网站不符合这些指南,可进行修改使其满足要求,然后请求重新加入。

搜索引擎技术大揭密之一:从全文检索到搜索引擎

全文检索我没做过,以前上大学时,短暂接触过全文检索的系统.对于一些科技刊物,会把多年的文章汇总起来,放在CD里面,然后这个CD里面就包含全文检索的功能.后来,也听说过一些单位,有过全文检索的系统.比如说:新华社这样的新闻机构,每天都有那么多篇的新闻,还有以前的新闻.通过一个全文检索的系统, 就能查询到你想要的新闻.另外一些网站,有个”站内搜索”的功能,也都是可以算为全文检索的.

严格来说,全文检索和搜索引擎都应该划分到”图书情报学”(现在改名叫”信息管理学”了)中去.我有位学长,本科学的专业是”图书情报学”,他做的毕业论文,就是全文检索.嘿嘿,记得我2002年刚开始做搜索引擎的时候,他可是比我懂得多,可是后来,大家交流了几次,就发现搜索引擎可是比全文检索要复杂得太多了.

全文检索已是研究了多年的技术,国内也有些专门做全文检索业务的公司,比如说:TRS公司(http://www.trs.com.cn/).我原来所在的搜索引擎公司,其前身就是一家全文检索的公司.搜索引擎的一些核心技术是来源于全文检索的,只不过,搜索引擎无论从检索到的内容更多,速度更快,准确率也更高!

那什么样的系统,才是搜索引擎呢!

我个人以为,搜索引擎和全文检索的区别,主要区别在两个方面.

第一,”搜索”二字,表现了搜索引擎的内容,全部是自己编写的网络爬虫,从浩瀚无边的互联网领域中自己去抓回来的;另外,抓取回来的大量数据,又要对其建立索引,方便快速查询.而全文检索的数据,基本上是在提供服务前,就已有了.

第二,”引擎”二子,表现了搜索引擎提供搜索服务的巨大能力.汽车引擎的出现,在科学史上也是一个重大的发明,它对世界的改变是巨大的.以前的马车,以马为动力,换成引擎后,车就跑得更快了.搜索引擎的引擎,能力也是巨大的,这也是计算机技术突飞猛进的表现.从以前的数据库查询,到现在的搜索引擎,无论是单次查询用时,还是最大查询并发量都是高了好几个数量级.

在我眼里,能够被称为”搜索引擎”的系统,它要具备下面几个条件.

1.提供的被查询内容数据要多,要达到几亿或几十亿的内容.
2.单次查询时间,要控制在豪秒级别.
3.每日的查询总数,要能提供千万级别的查询.
Add a comment | Read comments (1)
5:48 PM | Permalink | Trackbacks (0) | Blog it
Permalink Close
March 09
我是一名搜索引擎设计师
这就是我…一名非常普通的软件工程师.

31岁.

嘿嘿,一不小心都工作8年了.在北京从事软件工程师工作,今年也是第6个年头.

我是从2002年开始接触到搜索引擎的.在那一年,我从原来的单位离职后,当时有两个单位可去.

一个是待遇比较不错的,从事软件工程管理方面的工作.

另一个就是待遇不是特别理想,但是有机会参与到设计一种叫”搜索引擎”的复杂程序设计.

当时也没有多想,只是感觉如果老是做项目,的确对我没有多大吸引力.

而做搜索引擎,哈哈,听起来就让人感觉很COOL,我当时就选择了做搜索引擎.

2002年,2003年,2004年,2005年,2006年…我就这么一直做过来了.

虽然中途有几个月没有做搜索引擎,也变换了单位.

但,我的很多时间和心血都花费在搜索引擎中了.

不知道我的未来会咋样…但肯定还是和搜索的工作有联系的.

以前,很多做软件的朋友,都不停的问我和搜索引擎相关的东西,我都以公司秘密为重,没有任何透露.

但现在我想,在不泄露我现在公司和以前公司的秘密的前提下,可以把有些东西写出来,一是可以给各位喜欢搜索引擎的朋友做为参考资料,二是也想和做搜索引擎及相关领域的朋友,一起做些技术上的交流和讨论.

好了…这是我的开场白.

搜索引擎技术大揭密之二:搜索引擎三大核心技术

我自己也是一个搜索引擎的用户,在每天的工作和生活当中,也都基本上是天天使用搜索引擎,来搜索我想要的各种信息的.的确如此,现在搜索引擎每天得到了很多朋友们的喜欢,搜索引擎现在太热了….特别是百度的成功上市后,我在百度的朋友都成为百万富翁,千万富翁.社会上,IT界内,软件工程师的这个圈子里面,对搜索引擎的关注现在估计都是热到顶点了.

在得知我是一名做搜索引擎的软件工程师后,于是常有朋友说,他们公司或他们自己一个团体要准备做一个”搜索引擎”出来.往往在咨询过我的意见后,他们就放弃了原来的想法,而是做一个MINI版的搜索引擎或放弃原来的想法……因为要按照我所要求的3个条件(数据量达到亿,单次查询毫秒级,每日查询总数能支持千万级),这些都是是在短期内很能做到的.

撇开搜索引擎要用到的数量庞大的服务器硬件和速度巨快的网络环境不提,就单单说说搜索引擎中软件部分的三大核心技术.

我个人以为:一个优秀的搜索引擎,它必需在下面三个方面的技术必须是优秀的.

中文分词,网络爬虫和后台索引结构(下面先简单说说,今后有时间各个部分再详细点说说).

先说中文分词,不但但是中文,其他国家的文字也存在”分词”,说到底就是”语言学”里面的一个非常重要的领域.国内一些有名大学和科研机构,都一直在从事中文分词的研究,这也属于计算机自然语言研究领域.在国内做得比较有名的中文分词研究的公司,就不得不提提天津市海量科技发展有限公司(http://www.hylanda.com/), 其前身好象就是国家语言研究机构.一些搜索引擎公司,在发展初期时,对分词技术的研究还不是特别深入时,都是去买人家的产品.好象GOOGLE最开始对远东地区的分词技术,就是从一家日本公司购买的,有中文简体,中文繁体,日文,朝鲜文等多种文字分词技术.但是,纯学术领域的中文分词和搜索引擎里面用到的中文分词还是有很大的不同.学术界的要求分词的准确率极高,但分词速度就比较低了;搜索引擎的重点是,在保证分词高速的情况下,尽量提高分词的准确率.所以,现在的搜索引擎公司,都基本上自己来做中文分词了.

网络爬虫,是国内做搜索的软件工程师给它取的名子,国外叫SPIDER(蜘蛛).为啥叫爬虫呢?因为最开始做实验时,给软件工程师的机器配置不高,另外网络带宽也很小.当时测试时程序跑得很慢,就象个虫子缓慢地爬来爬去的……所以,大家就趣称为”爬虫”.网络爬虫的程序是不好编写的,因为作为软件工程师,无论你再是如何聪明,你所想到的绝对没有你会遇到的情况多!互联网上让人奇特的事太多了….原来有位同事去抓MP3,结果有个 MP3网站的开发人员,就给我们开了个玩笑,他把一个子目录给命名为3.mp3,结果爬虫就把一子目录当成一个MP3文件!爬虫自己光荣牺牲了……哈哈,找了很长时间才找到这个BUG.

后台索引结构,其实和中文分词的算法和很有关系的,采用咋样的中文分词,那后面的索引也会受其影响的.整体的后台索引结构的基本思想就是:把查询结果预先给运算出来.当然这些运算出来的结果全部放到内存中,那样查询是最快的,但内存总量毕竟是有限的(物理硬件不够往往是搜索引擎软件工程师头疼的问题!),所以肯定必须有大批量数据是放在硬盘中去……那些数据放内存,那些数据放硬盘,这就是个概率问题了.对于那些搜索高频词的结果就放在内存中,低频词的结果当然就放在硬盘上.但是,一些低频词可能会马上变成高频词,这如何办?嘿嘿,没问题的,搜索引擎在后台索引结构中,都会有一个高速缓冲.高速缓冲的设计非常巧妙,在它中间保存着最新最热门的查询结果.今后有时间,我来描述一下高速
缓冲的奇妙之处.

搜索引擎历史

/*****************************************
Infoseek,Inktomi,Overture等这些不为中国人熟悉的搜索公司..无论它们公司的发展如何,但在搜索引擎发展历史上,都是大牛呀!

Openfind(龙卷风)曾经在中文搜索引擎上的霸主,在百度,GOOGLE,中搜没有起来之前,也是垄断了中文搜索市场呀!

今天找来一篇文章,重温搜索引擎发展的激情燃烧的岁月.
*****************************************/

本文来自:http://www.soft6.com/news/detail.asp?id=11674,有部分页面数据删除.

IT历史:搜索引擎历史[2004-11-5]

前生今世——搜索引擎发展史
1990年以前,没有任何人能搜索互联网。

  所有搜索引擎的祖先,是1990年由Montreal的McGill University学生Alan Emtage、Peter Deutsch、Bill Wheelan发明的Archie(Archie FAQ)。当时World Wide Web还未出现。Archie是第一个自动索引互联网上匿名FTP网站文件的程序,但它还不是真正的搜索引擎。Archie是一个可搜索的FTP文件名列表,用户必须输入精确的文件名搜索,然后Archie会告诉用户哪一个FTP地址可以下载该文件。

  由于Archie深受欢迎,受其启发,Nevada System Computing Services大学于1993年开发了一个Gopher(Gopher FAQ)搜索工具Veronica(Veronica FAQ)。Jughead是后来另一个Gopher搜索工具。

  由于专门用于检索信息的Robot程序象蜘蛛(spider)一样在网络间爬来爬去,因此,搜索引擎的Robot程序被称为spider (Spider FAQ)程序。世界上第一个Spider程序,是MIT Matthew Gray的World wide Web Wanderer,用于追踪互联网发展规模。刚开始它只用来统计互联网上的服务器数量,后来则发展为也能够捕获网址(URL)。

  与Wanderer相对应,1993年10月Martijn Koster创建了ALIWEB(Martijn Koster Annouces the Availability of Aliweb),它相当于Archie的HTTP版本。ALIWEB不使用网络搜寻Robot,如果网站主管们希望自己的网页被ALIWEB收录,需要自己提交每一个网页的简介索引信息,类似于后来大家熟知的Yahoo。

  1993年底,一些基于此原理的搜索引擎开始纷纷涌现,其中最负盛名的三个是:Scotland的JumpStation、Colorado 大学Oliver McBryan的The World Wide Web Worm(First Mention of McBryan’s World Wide Web Worm)、NASA的Repository-Based Software Engineering (RBSE) spider。

  1993年2月,6个Stanford(斯坦福)大学生的想法是分析字词关系,以对互联网上的大量信息作更有效的检索。这就是Excite。后来曾以概念搜索闻名,2002年5月,被Infospace收购的Excite停止自己的搜索引擎,改用元搜索引擎Dogpile

  1994年1月,第一个既可搜索又可浏览的分类目录EINet Galaxy(Tradewave Galaxy)上线。除了网站搜索,它还支持Gopher和Telnet搜索。 

  1994年4月,Stanford两名博士生,美籍华人Jerry Yang(杨致远)和David Filo共同创办了Yahoo。随着访问量和收录链接数的增长,Yahoo目录开始支持简单的数据库搜索。因为Yahoo!的数据是手工输入的,所以不能真正被归为搜索引擎,事实上只是一个可搜索的目录。搜索效率明显提高。(Yahoo以后陆续使用Altavista、Inktomi、Google提供搜索引擎服务)

  1994年初,Washington大学CS学生Brian Pinkerton开始了他的小项目WebCrawler(Brian Pinkerton Announces the Availability of Webcrawler)。1994年4月20日,WebCrawler正式亮相时仅包含来自6000个服务器的内容。WebCrawler是互联网上第一个支持搜索文件全部文字的全文搜索引擎,在它之前,用户只能通过URL和摘要搜索,摘要一般来自人工评论或程序自动取正文的前100个字。(后来 webcrawler陆续被AOL和Excite收购,现在和excite一样改用元搜索引擎Dogpile)

  Lycos(Carnegie Mellon University Center for Machine Translation Announces Lycos )是搜索引擎史上又一个重要的进步。Carnegie Mellon University的Michael Mauldin将John Leavitt的spider程序接入到其索引程序中,创建了Lycos。1994年7月20日,数据量为54,000的Lycos正式发布。除了相关性排序外,Lycos还提供了前缀匹配和字符相近限制,Lycos第一个在搜索结果中使用了网页自动摘要,而最大的优势还是它远胜过其它搜索引擎的数据量: 1994年8月--394,000 documents;1995年1月--1.5 million documents;1996年11月--over 60 million documents。(注:1999年4月,Lycos停止自己的Spider,改由Fast提供搜索引擎服务)

  Infoseek(Steve Kirsch Announces Free Demos Of the Infoseek Search Engine)是另一个重要的搜索引擎,虽然公司声称1994年1月已创立,但直到年底它的搜索引擎才与公众见面。起初,Infoseek只是一个不起眼的搜索引擎,它沿袭Yahoo!和Lycos的概念,并没有什么独特的革新。但是它的发展史和后来受到的众口称赞证明,起初第一个登台并不总是很重要。 Infoseek友善的用户界面、大量附加服务(such as UPS tracking, News, a directory, and the like) 使它声望日隆。而1995年12月与Netscape的战略性协议,使它成为一个强势搜索引擎:当用户点击Netscape浏览器上的搜索按钮时,弹出 Infoseek的搜索服务,而此前由Yahoo!提供该服务。(注:Infoseek后来曾以相关性闻名,2001年2月,Infoseek停止了自己的搜索引擎,开始改用Overture的搜索结果)

  1995年,一种新的搜索引擎形式出现了——元搜索引擎(A Meta Search Engine Roundup)。用户只需提交一次搜索请求,由元搜索引擎负责转换处理后提交给多个预先选定的独立搜索引擎,并将从各独立搜索引擎返回的所有查询结果,集中起来处理后再返回给用户。第一个元搜索引擎,是Washington大学硕士生 Eric Selberg 和 Oren Etzioni 的 Metacrawler。元搜索引擎概念上好听,但搜索效果始终不理想,所以没有哪个元搜索引擎有过强势地位。 

  DEC的AltaVista(2001年夏季起部分网友需通过p-roxy访问,无p-roxy可用qbseach单选altavista搜索,只能显示第一页搜索结果)是一个迟到者,1995年12月才登场亮相(AltaVista Public Beta Press Release )。但是,大量的创新功能使它迅速到达当时搜索引擎的顶峰。Altavista最突出的优势是它的速度(搜索引擎9238:比较搞笑,设计 altavista的目的,据说只是为了展示DEC Alpha芯片的强大运算能力)。  而Altavista的另一些新功能,则永远改变了搜索引擎的定义。AltaVista是第一个支持自然语言搜索的搜索引擎,AltaVista是第一个实现高级搜索语法的搜索引擎(如AND, OR, NOT等)。用户可以用AltaVista搜索Newsgroups(新闻组)的内容并从互联网上获得文章,还可以搜索图片名称中的文字、搜索 Titles、搜索Java applets、搜索ActiveX objects。AltaVista也声称是第一个支持用户自己向网页索引库提交或删除URL的搜索引擎,并能在24小时内上线。AltaVista最有趣的新功能之一,是搜索有链接指向某个URL的所有网站。在面向用户的界面上,AltaVista也作了大量革新。它在搜索框区域下放了“tips”以帮助用户更好的表达搜索式,这些小tip经常更新,这样,在搜索过几次以后,用户会看到很多他们可能从来不知道的的有趣功能。这系列功能,逐渐被其它搜索引擎广泛采用。1997年,AltaVista发布了一个图形演示系统LiveTopics,帮助用户从成千上万的搜索结果中找到想要的。

  然后到来的是HotBot。1995年9月26日,加州伯克利分校CS助教Eric Brewer、博士生Paul Gauthier创立了Inktomi(UC Berkeley Announces Inktomi),1996年5月20日,Inktomi公司成立,强大的HotBot出现在世人面前。声称每天能抓取索引1千万页以上,所以有远超过其它搜索引擎的新内容。HotBot也大量运用cookie储存用户的个人搜索喜好设置。(Hotbot曾是随后几年最受欢迎的搜索引擎之一,后被 Lycos收购)

  Northernlight 公司于1995年9月成立于马萨诸塞州剑桥,1997年8月,Northernlight搜索引擎正式现身。它曾是拥有最大数据库的搜索引擎之一,它没有 Stop Words,它有出色的Current News、7,100多出版物组成的Special Collection、良好的高级搜索语法,第一个支持对搜索结果进行简单的自动分类。(2002年1月16日,Northernlight公共搜索引擎关闭,随后被divine收购,但在Nlresearch,选中”World Wide Web only”,仍可使用Northernlight搜索引擎)

  1998年10月之前,Google只是Stanford大学的一个小项目BackRub。1995年博士生Larry Page开始学习搜索引擎设计,于1997年9月15日注册了google.com的域名,1997年底,在Sergey Brin和Scott Hassan、Alan Steremberg的共同参与下,BachRub开始提供Demo。1999年2月,Google完成了从Alpha版到Beta版的蜕变。 Google公司则把1998年9月27日认作自己的生日。

  Google在Pagerank、动态摘要、网页快照、DailyRefresh、多文档格式支持、地图股票词典寻人等集成搜索、多语言支持、用户界面等功能上的革新,象Altavista一样,再一次永远改变了搜索引擎的定义。

  在2000年中以前,Google虽然以搜索准确性备受赞誉,但因为数据库不如其它搜索引擎大,缺乏高级搜索语法,所以使用价值不是很高,推广并不快。直到2000年中数据库升级后,又借被Yahoo选作搜索引擎的东风,才一飞冲天。

  Fast(Alltheweb)公司创立于1997年,是挪威科技大学(NTNU)学术研究的副产品。1999年5月,发布了自己的搜索引擎 AllTheWeb。Fast创立的目标是做世界上最大和最快的搜索引擎,几年来庶几近之。Fast(Alltheweb)的网页搜索可利用ODP自动分类,支持Flash和pdf搜索,支持多语言搜索,还提供新闻搜索、图像搜索、视频、MP3、和FTP搜索,拥有极其强大的高级搜索功能。

  Teoma 起源于1998年Rutgers大学的一个项目。Apostolos Gerasoulis教授带领华裔Tao Yang教授等人创立Teoma于新泽西Piscataway,2001年春初次登场,2001年9月被提问式搜索引擎Ask Jeeves收购,2002年4月再次发布。Teoma的数据库目前仍偏小,但有两个出彩的功能:支持类似自动分类的Refine;同时提供专业链接目录的Resources。

  Wisenut 由韩裔Yeogirl Yun创立。2001年春季发布Beta版,2001年9月5日发布正式版,2002年4月被分类目录提供商looksmart收购。wisenut也有两个出彩的功能:包含类似自动分类和相关检索词的WiseGuide;预览搜索结果的Sneak-a-Peek。

  Gigablast 由前Infoseek工程师Matt Wells创立,2002年3月展示pre-beta版,2002年7月21日发布Beta版。Gigablast的数据库目前仍偏小,但也提供网页快照,一个特色功能是即时索引网页,你的网页刚提交它就能搜索(注:这个spammers的肉包子功能暂已关闭)。

  Openfind 创立于1998年1月,其技术源自台湾中正大学吴升教授所领导的GAIS实验室。Openfind起先只做中文搜索引擎,曾经是最好的中文搜索引擎,鼎盛时期同时为三大著名门户新浪、奇摩、雅虎提供中文搜索引擎,但2000年后市场逐渐被Baidu和Google瓜分。2002年6月,Openfind重新发布基于GAIS30 Project的Openfind搜索引擎Beta版,推出多元排序(PolyRankTM),宣布累计抓取网页35亿,开始进入英文搜索领域,此后技术升级明显加快。

  北大天网是国家”九五”重点科技攻关项目”中文编码和分布式中英文信息发现”的研究成果,由北大计算机系网络与分布式系统研究室开发,于 1997年10月29日正式在CERNET上提供服务。2000年初成立天网搜索引擎新课题组,由国家973重点基础研究发展规划项目基金资助开发,收录网页约6000万,利用教育网优势,有强大的ftp搜索功能。

Baidu 2000年1月,超链分析专利发明人、前Infoseek资深工程师李彦宏与好友徐勇(加州伯克利分校博士)在北京中关村创立了百度(Baidu)公司。 2001年8月发布Baidu.com搜索引擎Beta版(此前Baidu只为其它门户网站搜狐新浪Tom等提供搜索引擎),2001年10月22日正式发布Baidu搜索引擎。Baidu虽然只提供中文搜索,但目前收录中文网页超过9000万,可能是最大的的中文数据库。Baidu搜索引擎的其它特色包括:网页快照、网页预览/预览全部网页、相关搜索词、错别字纠正提示、新闻搜索、Flash搜索、信息快递搜索。2002年3月闪电计划(Blitzen Project)开始后,技术升级明显加快。

搜索引擎的原理,可以看做三步:从互联网上抓取网页→建立索引数据库→在索引数据库中搜索排序。从互联网上抓取网页——利用能够从互联网上自动收集网页的 Spider系统程序,自动访问互联网,并沿着任何网页中的所有URL爬到其它网页,重复这过程,并把爬过的所有网页收集回来。建立索引数据库——由分析索引系统程序对收集回来的网页进行分析,提取相关网页信息(包括网页所在URL、编码类型、页面内容包含的关键词、关键词位置、生成时间、大小、与其它网页的链接关系等),根据一定的相关度算法进行大量复杂计算,得到每一个网页针对页面内容中及超链中每一个关键词的相关度(或重要性),然后用这些相关信息建立网页索引数据库。在索引数据库中搜索排序——当用户输入关键词搜索后,由搜索系统程序从网页索引数据库中找到符合该关键词的所有相关网页。因为所有相关网页针对该关键词的相关度早已算好,所以只需按照现成的相关度数值排序,相关度越高,排名越靠前。最后,由页面生成系统将搜索结果的链接地址和页面内容摘要等内容组织起来返回给用户。

全球搜索引擎市场近期大事记

  2002年12月24日,雅虎称公司同意以大约2.35亿美元的价格收购搜索软件公司Inktomi。

  2003年1月18日,Google收购博客网站Blogger.com开发团队——网上出版软件开发商Pyra Labs。

  2003年2月19日,Overture服务公司表示,计划以1.4亿美元现金加股票从CMGI公司手中收购门户网站AtaVista。

  2003年2月26日, Overture同意以1亿美元收购位于挪威的Fast Search and Transfer公司的网络搜索部门。

  2003年4月15日,新浪与中国搜索联盟结成战略同盟,至此,中国已有数百家网站结成搜索联盟,以迎接国际巨头Google挺进国内市场后的巨大压力。

  2003年4月21日,第二大互联网搜索引擎提供商Ask Jeeves公司宣布对其Ask.com网站进行升级。Ask Jeeves是仅次于Google的第二大搜索引擎,也是互联网上第五大搜索基地 (Google、雅虎、微软、AOL、Askjeeves) 。

  2003年6月18日,微软公司表示其正在加大研发新型互联网搜索引擎技术的力度,包括对一款功能更先进的技术原型进行测试。

  2003年7月12日,从加利福里亚传来消息,Google即将把总部从Bayshore Parkway搬迁至半里之遥的一个有四栋楼房的复式结构建筑中去,而这个建筑是由鼎鼎大名但目前却陷入困境的硅谷图象(Silicon Graphics)公司腾出来的。大卫.奎恩(David Krane)证实了这个消息,并解释说,这样能让公司现有的800多员工更好的分工合作和管理。

  2003年7月13日,百度推出图象搜索,新闻搜索两大搜索功能,以此来带动搜索流量。同时,辅以百度的搜索风云榜,使得百度的信息搜索及信息评估的作用更加突出

2003年7月15日,全球最大的互联网公司雅虎宣布,以16.3亿美元收购在网络搜索服务上的竞争对手—Overture公司,以期在同Google的竞争中取得优势。

六度分隔与最短路径

【最短路径】

圆明园的北部有一个迷宫,据说古时候每次有庆典在圆明园的时候,皇帝会派一些宫女走迷宫,看谁最先走到迷宫内的亭子,会有不错的奖赏。

迷宫问题对数学家们来讲虽然是小儿科但在计算机课程上却非常重要,因为不同的求解会涉及到递归,广度优先和深度优先等算法。

迷宫毕竟是一个放置在2维空间的有限联系的网络,也就是说,迷宫里的每一个点,最多只和周围的4个点(上下左右)发生关系,而且这些点的位置是固定的。

六度分割通常用来描述一个广阔的社会网路(SN),现在大部分的社会网路服务都提供了搜索功能,即搜索出一个用户到达另外一个用户的最短路径,也就是找出这两个用户之间通过最少的用户的链接。

一般的SN提供的搜索都是4度的,也就是例如A-B-C-D-E 称为4度的分隔。提供5度搜索和6度搜索的几乎寥寥无几,当然一方面是5,6度分隔的用户很少,大部分的用户都应该在4度内,另外一个方面是5,6度分隔的搜索在实际计算上也涉及非常大的运算量。

【SN搜索算法】

如果说寻找两个人之间的最小分隔的路径和寻找最短路径可以类比,那么唯一不同的是SN上每个节点的联系可以非常的广阔,不只是上下左右,而是十个甚至上百个联系。这是是一个多维空间内的最短路径的寻找。假设一个用户平均有n个好友,那么粗略估计一个用户的4度好友大约有n×n×n×n+n×n×n+ n×n+n ~ n^4,无疑是一个非常恐怖的数目。因此采用传统的递归的方法显然是不大现实的。

当然,事情并非这么麻烦,有简洁的方法可以加快找到用户之间的最小分隔:不单是从一个用户搜索,而是从两个用户同时搜索,而看两个用户的2度之内的用户是否有相同:
A-B-C
E-D-C
A和E的处在在两度分隔的用户基本上数目估计都在n的平方。问题变成了比较n^2和n^2之间有没有相同,这个计算的时间等同于2×n^2的排序所需要的时间。

【SN索引】

那么能否继续加快速度?
当然可以,可以提前对用户的好友进行索引,对好友的好友进行索引,这样在未来进行关系的搜索时会大大加快:

A: {A1} {A2} A1为A的好友的集合,A2为A的好友的好友的集合
E: {E1} {E2}

那么
1度分隔为: A 属于{E1},等同于E属于 {A1}
2度分隔为: A 属于{E2},等同于E属于 {A2},{A1}{E1}有共同项。
3度分隔为: {A1} {E2}有共同项,等同于A属于 {E2}
4度分隔为: {A2} {E2}有共同项

【SN关系的更新】

当然,发现是一个核心问题,另外一个问题就是更新,因为SN的关系不会是一成不变的,在一个活跃的SN社区里,每天用户之间的关系的更新更是可观。这里只考虑关系添加的例子:

A: {A1} {A2}
E: {E1} {E2}

当A 与 E 直接建立了好友关系后,应该说整合系统的关系全都变化了,因为这个新的关系一定会导致一些关系的短路,从而导致很多现有的关系的调整。但是因为我们只存储 2度分隔以内的关系,也只关心两度分隔以内的关系,因此当发生了一个新的关系后,2度内关系的变化一定是A和E本身或者他们的一度关系的用户,再远的用户将不受这个关系的影响。

因此首先 所有{A1}的元素的二度分隔集合里要加上E,所有{E1}的元素的二度分隔集合里要加上A。

然后是二度的修正。分别加上对方的1度。
{A2} = {A2 + E1}
{E2} = {E2 + A1}

最后是一度的修正:A, E 的 一度{A1}{E1}需要加入E,A:
{A1} = {A1 + E}
{E1} = {E1 + A}

整体操作的量大约在2n次操作,比我们通常认为的要小的多 🙂 。

FTP搜索引擎的设计与实现

摘要:FTP是因特网最主要的服务之一,FTP搜索引擎为人们使用FTP服务提供了很大的方便。本文分析和设计了一个基于WEB的FTP搜索引擎,并在PHP+Mysql环境下给出了编程实现方法。

  关键词:FTP;搜索引擎;PHP;Mysql;

  引言

  FTP是因特网最主要的服务之一,在FTP服务器上保存有大量的各种各样的共享软件、技术资料和多媒体数据等文件。因为每个FTP服务器都有若干个目录,其目录和文件结构比较复杂,要在FTP服务器上找到自己需要的文件不是一件容易的事情,要在多个FTP服务器上查找文件更是困难。基于WWW的FTP 搜索引擎可以很好的解决上述问题。目前,国内外有很多FTP搜索引擎,国内较著名的有北大天网、百合谷搜索和FTP星空搜索等。为了更好的为我校校园用户和省主节点用户提供服务,我们设计了自己的FTP服务器搜索引擎。

  1.FTP搜索引擎的结构

  FTP搜索引擎由数据采集、数据查询和站点维护等模块组成。实现一个FTP搜索引擎,首先要收集各个FTP站点上的文件信息,并把这些信息存储到数据库中;然后给用户提供一个查询界面,以收取用户要查询的信息,把这些查询信息转化为数据库语言,并进行数据库查询,把查询结果以友好的界面显示给用户;搜索引擎建立好以后,为了使数据库数据与FTP站点的数据保持一致,需要更新FTP站点的文件信息,添加新的FTP站点等管理和维护。其结构如下图所示。

  我们在设计FTP搜索引擎时,采用Linux操作系统Redhat8.0,WWW服务器采用Apache,数据库采用MySQL,编程语言采用PHP。

  2. 数据库结构和设置

  2.1文件信息分析

  在FTP站点上,根目录下的目录中又有许多文件夹和文件,每一个文件的信息包括文件名,文件地址,文件大小,日期,类型等。对应这些文件信息,在文件数据库中设置相应的字段,用来纪录这些信息,用字段name存储文件名,一般不超过255个字符,设置为varchar类型,长度为255,host表示 FTP网站的名称,说明是哪一个网站上的文件,address字段准确给出文件的URL地址,由于有些文件URL比较长,把address字段类型设置为 longtext,有了这些字段,就可以在网络中找到此文件的位置。另外,还需要纪录下文件的大小,时间,日期,以供用户分辨选择他们所要的文件。最后,查询时对文件名字段的访问比较频繁,把它设置成Index字段,这样可以提高查询速度。

  2.2 FTP站点信息分析

  一个FTP站点通常包含服务器名称,用户名,和密码。对应FTP站点的信息,数据字段设置如下:设置站点名、站点IP地址、用户名、用户密码等几个字段,站点名字段类型为vchar,长度为60,IP地址vchar类型,长度为50,用户名vchar类型,长度50,密码设置为password类型,长度为60。另外,FTP站点名也是使用较为频繁的数据,把它设置为Index字段。

  2.3数据库结构设置

  基于以上分析,设置数据库如下:在file_address数据库中有两个数据表,一个为fileaddress数据表,另一个为ftpserver数据表,其中fileaddress数据表用于记录ftp站点的文件信息,ftpserver数据表用于记录各个ftp站点的信息。

  3. 数据采集

  要构建搜索引擎,首先要收集各个FTP站点的文件信息,记录到数据库,用于提供搜索。因特网中有许多的FTP站点,要收集某个FTP站点的信息时,从数据表中读出站点信息,然后登陆到此站点,多数FTP服务器都开辟有一个公共访问区,称为”匿名FTP”,对公众提供免费的文件信息服务,一般用户名为 Anonymous,密码为一个Email地址。数据采集程序用此用户名和密码登陆站点,然后对站点所有目录进行采集,读取每个目录下的文件信息,在收到文件信息之后,对其进行分析,将文件信息存储到相应的数据表字段中。完成此站点的数据采集之后,再读取另外一个FTP站点的信息,进行文件信息采集。如此循环,采集所有已知FTP站点的文件信息。

  首先连接到此ftp站点,并用相应的用户名和密码登陆,此时,当前目录一般为根目录,有的并不是,所以要先取得当前目录,然后从此目录开始扫描此站点的文件信息,如果此目录为空(只有两个文件:.和..),则此站点没有文件,退出登陆,如果不为空,则判断每个文件是否是目录,如果是,则改变当前目录到此子目录下,扫描此子目录并判断,如果还有子目录,则继续转到其下扫描。下面是采集数据的程序。

  get_ftp_info()
 {
    ftp_connect() /*连接FTP站点;
    ftp_login() /*登陆FTP站点;
    ftp_pwd() /*取得当前目录;
    get_path_info() /*调用get_path_info()处理此目录;
    ftp_quit() /*退出登陆;
 }

  get_path_info()是采集程序最主要函数,该函数采用递归调用的方法依次处理各个目录和文件,把目录和文件信息写入数据库。下面是该函数的实现代码。

  get_path_info()
 {
    ftp_rawlist() /*读取目录信息;
    if(dir_is_empty) /*如果目录为空则返回
    retrun;:
    For()
 {
    get_path_info() /*递归调用函数get_path_info(),
  }
 }
 //—————————————————
 function get_path_info($ftpserver,$ftplink,$ftp_dir,$sqlmasterlink){
 mysql_query(“use fileaddress”,$sqlmasterlink);
 $n_list=ftp_rawlist($ftplink,$ftp_dir); //$n_list can not be setted as a global var.
 if((count($n_list))<=2) return; //at least: one is .. another is .  for($i=0;$i“.$filename;echo “
n”;
   break;
   }
 case “d”:
   {
   if(($filename!=”..”)&&($filename!=”.”)){
   ftp_chdir($ftplink,$filename);
   $ftp_dir=ftp_pwd($ftplink);

 get_path_info($ftpserver,$ftplink,$ftp_dir,$sqlmasterlink);
     ftp_chdir($ftplink,”..”);
    }
     break;
   }
   } //end of switch
 } //end of for
 } //the end of functon get_path_info()
 //————————————————

  4. 数据查询

  数据查询主要包括查询页面的设计、查询程序的编写和查询结果的处理及部分。查询页面由Web服务器提供查询界面,用于收集所要查找的文件信息,用户浏览到此Web页面,填写并提交表单,表单中包含有用户所要查找文件的信息,如文件名,大小,等,表单提交给Web服务器之后,由查询程序进行分析,生成查询语句,并提交给数据库服务器进行查询,查询结果由查询程序进行分析处理,查询结果以超链接形式生成Web页面,提供给用户浏览。

  用户输入的信息转化为数据库查询语言,再进行查询。可以用Mysql数据库查询语言中给出的正则表达式来表示。其常用表示方法如下:

  a.特殊字符”^”: 用来匹配以指定字符串开头的字符串。例如:”^hello” :这个模式与字符串”hello,PHP world!”匹配,但是与”Say hello to you”不匹配。

  b.特殊字符”$”: 用来匹配以指定字符串结尾的字符串。例如: “you$” :这个模式与”How are you”匹配,与”your”不匹配。

  c.当特殊字符”^”和”$”同时使用时,表示精确匹配。例如: “^hello$” :这个模式只匹配字符串”hello”。

  在查找文件时,设置表示用户输入的文件名的变量为$filename,那么,可以生成如下的查询语句进行查询:
  $sql=”select * from $dbtablename where name REGEXP “[^\]*(“.$qfilename.”)+[^\]*”.”””.”;”;
  系统包括两种检索界面,即文件名检索和高级检索。下面是高级检索的界面和功能。sousuo102302_20060708225726.jpg
在采集到数据库的文件信息中,包括了文件名、大小、日期和文件的网络地址。查询结果可由数据库中的网落地址可生成文件的URL信息,表示文件的下载地址。代码结构为:

  文件名文件大小和日期
  网络地址
  下图为FTP搜索引擎的输出结果:

sousuo102303_20060708225729.jpg

 5. 管理与维护

  搜索引擎建立好以后,为了使数据库数据与FTP站点的数据保持一致,需要对站点进行管理和维护。在我们的设计中,管理和维护功能包括增加FTP站点、显示及删除FTP站点、更改FTP站点等功能。为了实现站点文件信息自动更新的功能,我们把更新FTP站点文件信息的程序(addallinfo.php)设置成系统计划任务,例如可以设置成每天运行一次。

  6.结束语

  我们设计的FTP搜索引擎已经在网站上使用,为用户提供了很好的服务。FTP搜索引擎的技术发展很快,在查询方式、检索结果处理和分类检索等方面有了很大的改进。我们将在这几方面继续完善我们的系统。

  参考文献:

  1. 龙浩等,《PHP语言进阶和高级应用》.北京:清华大学出版社出版, 年。
  2.钟伟财,《精通PHP4.0与MySQL架构Web数据库实务》。北京:中国青年出版社出版,
  3.彭武兴,《PHP 4完全中文手册》
  4.晏子译,Mysql中文参考手册
  5.Stig S?ther Bakken ,《PHP Manual》,2003
  7.MySQL Reference Manual for version 4.0.5, http://www.mysql.com/documentation/
  8.MySQL Reference Manual,http://www.mysql.com/doc/en/index.html

Web搜索引擎设计和实现分析

— 一、引言

—- 随着Internet的飞速发展,人们越来越依靠网络来查找他们所需要的信息,但是,由于网上的信息源多不胜数,也就是我们经常所说的”Rich Data, Poor Information”。所以如何有效的去发现我们所需要的信息,就成了一个很关键的问题。为了解决这个问题,搜索引擎就随之诞生。

—- 现在在网上的搜索引擎也已经有很多,比较著名的有AltaVista, Yahoo, InfoSeek, Metacrawler, SavvySearch等等。国内也建立了很多的搜索引擎,比如:搜狐、新浪、北极星等等,当然由于它们建立的时间不长,在信息搜索的取全率和取准率上都有待于改进和提高。

—- Alta Vista是一个速度很快的搜索引擎,由于它强大的硬件配置,使它能够做及其复杂的查询。它主要是基于关键字进行查询,它漫游的领域有Web和Usenet。支持布尔查询的”AND”, “OR”和”NOT”,同时还加上最相近定位”NEAR”,允许通配符和”向后”搜索(比如:你可以查找链接到某一页的所有Web站点)。你可以决定是否对搜索的短语加上权值,在文档的什么部位去查找它们。能够进行短语查询而不是简单的单词查询的优点是很明显的,比如,我们想要查找一个短语”to be or not to be”,如果只是把它们分解成单词的话,这些单词都是属于Stop Word,这样这个查询就不会有任何结果,但是把它当作一个整体来查询,就很容易返回一些结果,比如关于哈姆雷特或者是莎士比亚等等的信息。系统对查询结果所得到的网页的打分是根据在网页中所包含的你的搜索短语的多少,它们在文档的什么位置以及搜索短语在文档内部之间的距离来决定的。同时可以把得到的搜索结果翻译成其他的语言。

—- Exite是称为具有”智能”的搜索引擎,因为它建立了一个基于概念的索引。当然,它所谓的”智能”是基于对概率统计的灵活应用。它能够同时进行基于概念和关键字的索引。它能够索引Web, Usenet和分类的广告。支持”AND”,”OR”,”NOT”等布尔操作,同时也可以使用符号”+”和”-“。缺点是在返回的查询结果中没有指定网页的尺寸和格式。

—- InfoSeek是一个简单但是功能强大的索引,它的一个优点是有一个面向主题搜索的可扩展的分类。你可以把你的搜索短语和相似的分类目录的主题短语相互参照,而那些主题短语会自动加到你的查询中去。使你的搜索有更好的主题相关性。同时它也支持对图象的查询。它能够漫游Web,Usenet,Usenet FAQs等等。不支持布尔操作,但是可以使用符号”+”和”-“(相当于”AND”和”NOT”)

—- Yahoo实际上不能称为是一个搜索引擎站点,但是它提供了一个分层的主题索引,使你能够从一个通常的主题进入到一个特定的主题,Yahoo对Web进行了有效的组织和分类。比如你想要建立一个网页,但是你不知道如何操作,为了在Yahoo上找到关于建立网页的信息,你可以先在Yahoo上选择一个主题:计算机和Internet,然后在这个主题下,你可以发现一些子主题,比如:Web网页制作,CGI编程,JAVA,HTML,网页设计等,选择一个和你要找的相关的子主题,最终你就可以得到和该子主题相关的所有的网页的链接。也就是说,如果你对要查找的内容属于哪个主题十分清楚的话,通过目录查询的方法要比一般的使用搜索引擎有更好的准确率。你可以搜索Yahoo的索引,但是事实上,你并没有在搜索整个Web。但是Yahoo提供了选项使你可以同时搜索其他的搜索引擎,比如:Alta Vista。但是要注意的是Yahoo实际上只是对Web的一小部分进行了分类和组织,而且它的实效性也不是很好。

—- 搜索引擎的基本原理是通过网络机器人定期在web网页上爬行,然后发现新的网页,把它们取回来放到本地的数据库中,用户的查询请求可以通过查询本地的数据库来得到。如yahoo每天会找到大约500万个新的网页。

—- 搜索引擎的实现机制一般有两种,一种是通过手工方式对网页进行索引,比如yahoo的网页是通过手工分类的方式实现的,它的缺点是Web的覆盖率比较低,同时不能保证最新的信息。查询匹配是通过用户写入的关键字和网页的描述和标题来进行匹配,而不是通过全文的匹配进行的。第二种是对网页进行自动的索引,象 AltaVista则是完全通过自动索引实现的。这种能实现自动的文档分类,实际上采用了信息提取的技术。但是在分类准确性上可能不如手工分类。

—- 搜索引擎一般都有一个Robot定期的访问一些站点,来检查这些站点的变化,同时查找新的站点。一般站点有一个robot.txt文件用来说明服务器不希望Robot访问的区域,Robot 都必须遵守这个规定。如果是自动索引的话,Robot在得到页面以后,需要对该页面根据其内容进行索引,根据它的关键字的情况把它归到某一类中。页面的信息是通过元数据的形式保存的,典型的元数据包括标题、IP地址、一个该页面的简要的介绍,关键字或者是索引短语、文件的大小和最后的更新的日期。尽管元数据有一定的标准,但是很多站点都采用自己的模板。文档提取机制和索引策略对Web搜索引擎的有效性有很大的关系。高级的搜索选项一般包括:布尔方法或者是短语匹配和自然语言处理。一个查询所产生的结果按照提取机制被分成不同的等级提交给用户。最相关的放在最前面。每一个提取出来的文档的元数据被显示给用户。同时包括该文档所在的URL地址。

—- 另外有一些关于某一个主题的专门的引擎,它们只对某一个主题的内容进行搜索和处理,这样信息的取全率和精度相对就比较高。

—- 同时,有一类搜索引擎,它本身不用Robot去定期的采集网页。象SavvySearch 和 MetaCrawler是通过向多个搜索引擎同时发出询问并对结果进行综合返回给用户实现搜索功能。当然实际上象SavvySearch能够对各个搜索引擎的功能进行分析和比较,根据不同的用户查询提交给不同的搜索引擎进行处理,当然用户自己也可以指定利用哪一个搜索引擎。

—- 一个优秀的搜索引擎必须处理以下几个问题:1 网页的分类2 自然语言的处理3 搜索策略的调度和协作 4 面向特定用户的搜索。所以很多搜索引擎不同程度的使用了一些人工智能的技术来解决这些方面的问题。

—- 二、网络Spider的实现描述

—- 现在有很多文章对Web引擎做了大量的介绍和分析,但是很少有对它们的实现做一个详细的描述,这里我们主要来介绍一个具有基本功能的Web引擎的实现。本文,我们以类C++语言的形式来描述Web引擎如何采集网页并存放到数据库中的过程。同时描述了如何根据用户输入的关键字查询数据库并得到相关网页的过程。

—- 2.1数据库结构

—- 首先,我们要建立一个数据库表用来存放我们得到的网页。这里一般需要建立如下的表:

—- 1.字典表的建立,事实上这里是用文档中有意义的单词和它们的出现频率来代表一个文档。

—- 该表(WordDictionaryTbl)主要要包括三个字段,主要是用来存放和一个网页相关的单词的情况

url_id 对每一个URL的唯一的ID号
word 该URL中的经过stem的单词
intag 该单词在该网页中的出现的次数

—- 2.存储每一个URL信息的表

—- 该表(URLTbl)中主要的关键字段有:

rec_id 每一条记录的唯一的ID号
status 得到该URL内容的状态,比如HTTP_STATUS_TIMEOUT表示
下载网页的最大允许超时
url URL的字符串名称
content_type 内容的类型
last_modified 最新的更改时间
title 该URL的标题
docsize 该URL的文件的尺寸
last_index_time 最近一次索引的时间
next_index_time 下一次索引的时间
tag 对于网页,用来表示它的类型,比如:是text,或者是html,
或者是图片等等
hops 得到文件时候的曾经失败的次数
keywords 对于网页,和该网页相关的关键字
description 对于网页,指网页的内容的描述
lang 文档所使用的语言

—- 3.因为网页中有很多单词是一些介词和语气助词或者是非常常用的常用词,它们本身没有多少意义。比如:英语中的about,in,at,we,this等等。中文中的如”和”,”一起”,”关于”等等。我们统一的把它们称为停止词(stop word)。所以我们要建立一个表,来包括所有这些停止词。该表(StopWordTbl)主要有两个字段。
word char(32) 表示那些停止词
lang char(2) 表示所使用的语言

—- 4.我们要建立一个关于robot的表,我们在前面说过,所有的网站一般都有一个robot.txt文件用来表示网络上的robot可以访问的权限。该表(RobotTbl)主要有以下字段。
hostinfo Web站点主机的信息
path 不允许robot访问的目录

—- 5.建立我们需要屏蔽的那些网页(比如一些内容不健康的或者没有必要去搜索的站点)的一张表(ForbiddenWWWTbl),主要的字段就是网页的URL。

—- 6.另外我们需要建立一个我们所要得到的文件类型的表(FileTypeTbl),比如,对于一个简单的Web搜索引擎,我们可能只需要得到后缀为.html,htm,.shtml和txt的类型文件。其他的我们只是简单的忽略它们。主要的字段就是文件的类型和说明。

—- 其中关于停止词的表的内容是我们要实现要根据各种语言的统计结果,把那些意义不大的单词放进去。关于文档单词、URL和Robot的表的内容都是在获取Web网页的时候动态增加记录的。

—- 2.2 具体网页获取算法描述

—- 具体的网页的获取步骤是这样的:

—- 我们可以设定我们的搜索程序最大可以开的线程的数目,然后这些线程可以同时在网上进行搜索,它们根据数据库中已有的关于网页的信息,找出那些需要更新的网页(如何判断哪些网页需要更新是一个值得研究的过程,现在有很多启发式和智能的算法,基本上是基于统计规律进行建模。最简单的当然是设定一个时间范围,在某个时间范围以前的网页被重新去搜索一遍),然后判断那些网页是否在屏蔽表中,如果是的话,就从关于URL的表中删除该条记录。否则,我们就到相应的WWW站点去得到URL指定的文件(这里需要注意的是根据不同的URL的特点,需要使用不同的协议,比如对于 FTP站点要采用FTP协议,对于HTTP站点要采用HTTP协议,新闻站点要采用NNTP协议等等)事实上,我们先得到关于该网页的头信息,如果该网页的最新修改时间和我们最近提取的时间是一样的话,表示该网页内容没有任何更新,则我们就不必去得到它的内容,只需要修改最近一次更新它的时间为当前的时间就可以了。如果该网页最近做了修改,我们就要得到该网页,并对它的内容进行分析,主要要包括和它相关的链接,把它们加到相应的数据库中,同时判断网页所包含的各种其他的文件,如文本文件、图形文件、声音文件和其他多媒体文件是否是我们所需要的文件,如果是的话,就把它加到我们响应的数据库中。同时要根据网页的内容提取所有的有意义的单词和它们的出现的次数,放到相应的数据库中。为了更好的描述这个过程,我们来看跟这个过程相关的主要的几个对象和数据结构。对象主要是针对三个层次来讲的。第一层是针对WWW服务器,第二层是针对每一个页面,第三层是针对每一个页面的全文的索引。

—- 2.3 和实现相关的主要类对象和功能描述下面的结构是针对一个站点来说的。

Class CServer {
主要的属性有:
char *url; //WWW站点的URL名称
char *proxy; //使用的代理的名称
char *basic_auth; //进行基本的HTTP认证
int proxy_port; //代理的端口号
int period; //再次索引的周期
int net_errors; //网络连接不通的次数
int max_net_errors; //可以允许的最大的网络错误
int read_timeout; //下载文件允许的最大的延迟
int maxhops; //表示URL可以最大跳转的深度
int userobots; //是否遵守robot.txt中的约定
int bodyweight; // 在< body >….< /body >之间的单词的权重
int titleweight; // 在< title >….< /title >之间的单词的权重
int urlweight; // 在文档的URL中的单词的权重
int descweight;//在 < META NAME="Description" Content="..." >之间单词的权重
int keywordweight; //在< META NAME="Keywords" Content="..." >
之间的单词的权重

—- 主要方法有:
FindServer();//用来查找该服务器是否存在并可以连接
FillDefaultAttribute() //用来针对所有的WWW服务器填写默认的属};

以上的对象中的成员变量是和一个站点相关的参数的设置,我们对所有的站点有一个默认的设置,但是可以对某些站点做一些特殊的设置。这些设置可以在配置文件中设定。
—- 下面是关于文档的结构的主要的数据成员:

Class CNetDocument
主要属性有:
int url_id; //该URL的ID号
int status; //获取该文档时候的状态
int size; //文档的尺寸
int tag; //和该文档相关的标签,表示该文档是
HTML,TEXT或者是其他类型
int hops; //URL跳转的次数
char *url; //和该文档相关的URL的名称
char *content_type; //该内容的类型
char *last_modified; //最近一次的更新时间
char *title; //该文档的标题
char *last_index_time; //上次索引的时间
char *next_index_time; //下次索引的时间
char *keywords; //该文档中的关键字
char *description; //该文档的描述

主要方法有:
FillDocInfo(…) //根据数据库,得到该文档相关信息
AddHerf(…) //加入网页中存在的新的链接的网址
DeleteURL(…) //删除一个存在的网址
CanGetThisURL(…) //根据配置决定是否去得到该网页
//下面三个方法是根据不同的URL,用不同的协议去获得文档
NNTPGet(…)
FTPGet(….)
HTTPGet(….)
ParseHead(…) //如果是HTTP协议得到的话,分析头信息
ParseMainBody(…) //对获得的文档的主体进行分析
ServerResponseType (….) //得到服务器端的响应消息
UpdateURLDB(….) //更新的数据入库
} ;

—- 事实上,我们在要提取一个网页的时候,都要建立一个CNetDocument对象,然后再对这个网页进行分析的时候,把相关的内容放到这个CNetDocument的成员变量里面。下面是关于页面全文索引的结构的主要数据成员:
Class CIndexer {
主要属性有:
char *url; //我们要处理的文档相关的URL的名称
int mwords; // 我们事先设定的一个网页的最大的单词数目
int nwords; // 实际的得到的单词的数目
int swords; // 我们已经排序的单词的数目
WORD *Word; //所有单词的内容
char *buf; //我们为文档所分配的空间
主要方法有:
InitIndexer(…) //进行初始设置和分配
ParseGetFile(…) //对得到的网页进行全文索引
AddWord(…) //把网页的可以索引的单词加到Word数组中去
InToDB(….) //关于网页全文索引的信息入库
};

—- 进行网页提取前,我们要建立一个CIndexer对象,它主要是用来对网页进行全文的索引。一般来说我们只对两种类型的URL进行全文索引,一个是text/html,另外一个是text/plain。其中WORD的数据结构如下:
typedef struct word_struct {
int count; //该单词出现的次数
int code; //该单词的正常的形式,
比如单词可能为 encouraging,它的正常的形式应该为
encourage,这其实是一种对单词的stem。
即我们只取单词的主干部分。
char *word; //该单词的内容
} WORD;

—- 以下的结构是和网页中的一些链接的对象相关的一个数据结构
typedef struct href_struct {
char *href; //该链接的名称
int hops; //发生的跳转次数
int stored; //是否已经存储到数据库中
} HREF;

—- 所有需要更新的和新产生的URL都被放到这个结构中,当它的数量超过一定的范围以后,被一次性的存入数据库。
—- 关于URL的一个数据结构如下:

typedef struct url {
char *schema; //表示该URL是通过什么协议得到的,比如HTTP,
FTP,NNTP等。
char *specific; //主机的名称加上路径
char *hostinfo; //主机的名称加上相关的协议端口
char *hostname; //主机的名称
char *path; //在主机的具体的路径
char *filename; //文件的名称
char *anchor; //相关的anchor
int port; //协议相关的端口
} URL;

—- 这是针对URL的一些相关的属性的描述的一个数据结构。事实上在数据库中,我们存储的只是对网页的描述和对一些文本和HTML页面的关键词的索引信息。我们并不存储网页的实际的内容。
—- 三、用户查询实现描述

—- 关于对用户提交的查询请求的实现分析:

—- 用户想要查询某一方面的信息一般都是通过提供和该领域相关的几个关键字来进行的。

—- 我们来看一下关于用户查询的相关的数据结构和类:

—- 下面是一个关于单词和它的权值的基本结构:

typedef struct word_weight_pair
{
char word[WORD_LEN];
int weight;
}word_weight_pair;

—- 下面的类主要是用来对用户的查询进行处理和分析:
Class CUserQuery
{
char m_UserQuery[MAX_QUERYLEN]; //用户的查询表达式
CPtrArray word_weight_col;
//是关于结构word_weight_pair的动态数组
int m_maxReturnSum; //用户希望返回的最多的网页数
int search_mode;
CObArray m_returnDoc; //是关于CNetDocument对象的一个动态数组
NormalizeWord(char* OneWord); //对单词进行归整化,即Stem.
Find(char* odbcName); //进行数据库查找和匹配
};

—- 系统实现的基本的步骤如下:

—- 1.对用户输入的查询表达式进行分析。事实上,我们在前面的Spider搜索过程中对文档的表示是通过关键字形式描述的,每一个文档可以表示为这样的一个集合

其中 ::=< 单词或短语名称 >< 单词或短语的权值 >

—- 实际上就是采用矢量空间的表示方法来表示的文档。

—- 我们对用户输入的查询表达式也采用矢量空间的表示方法。我们认为用户输入的关键字的顺序代表了它的重要性的程度,所以对于位置靠前的单词有相对比较高的优先级,同时我们对所有的内容以短语或者是单词为最小原子,进行Stem操作,即象前面所提到的:比如单词Encouraging就转化成 Encourage的格式。然后去掉那些Stop Word,比如is ,as等等的单词,这些单词存放在StopWordTbl表中。然后把所有归整化后的内容放入动态数组word_weight_col中去。

—- 2.对于动态数组word_weight_col中的每一个元素,即结构word_weight_pair(包括单词和该单词的权重),我们从表 WordDictionaryTbl中可以找到和这些单词相关的记录,这些记录应该是包括了所有的在word_weight_col中的单词。

—- 进行网页是否和查询相匹配的计算。匹配计算的过程如下:首先我们对所有的记录按URL地址进行排序。因为可能好几条记录对应的是一个URL,然后对每一个网页进行打分,每一条记录的单词权值为INITSCORE*WEIGHT+(TOTALTIMES-1)*WEIGHT* INCREMENT。其中INITSCORE为每一个单词的基准分数,TOTALTIMES为该单词在网页中的出现的次数,WEIGHT是该单词在不同的内容段出现有不同的权值(比如在KEYWORD段,或者是标题段,或者是内容段等等)。INCREMENT是该单词每多出现一次所增加的分数。

—- 3.根据用户指定的m_maxReturnSum,显示匹配程度最高的前m_maxReturnSum页。

—- 四、结束语

—- 我们利用上面所讨论的机制,在WINDOWS NT操作系统下,用VC++和SQL SERVER实现了一个Web搜索引擎的网页搜集过程。在建立了一个基本的搜索引擎的框架以后,我们可以基于这个框架,实现一些我们自己设计的算法,比如如何更好的进行Spider的调度,如何更好的进行文档的归类,如何更好的理解用户的查询,用来使Web搜索引擎具有更好的智能性和个性化的特点。