基于web搜索引擎的设计与实现本科毕业论文(编辑修改稿)内容摘要:

L 等待被 Spider 程序处理。 新发现的 URL也被加入到这个队列中。 处理队列 : 当 Spider 程序开始处理时,他们被送到这个队列中 错误队列 : 如果在解析网页时出错, URL 将被送到这里。 该队 列中的 URL 不能被移入其他队列中 完成队列 : 如果解析网页没有出错, URL 将被送到这里。 该队列中的 URL 不能被移入其它队列中 在同一时间 URL 只能在一个队列中,我们把它称为 URL 的状态。 13 图 1 队列的变化过程 以上的图表示了队列的变化过程,在这个过程中,当一个 URL 被加入到等待队列中时 Spider 程序就会开始运行。 只要等待队列中有一个网页或 Spider 程序正在处理一个网页,程序就会继续他的工作。 当等待队列为空并且当前没有任何网页时, Spider程序 就会停止它的工作。 如何构造 Spider 程序 在构造 Spider 程序之前我们先了解下程序的各个部分是如何共同工作的。 以及如何对这个程序进行扩展。 流程图如下所示: 发现 URL 等待队列 运行队列 完成队列 错误队列 完成 URL 14 图 2 Spider 程序流程图 把 URL 加入等待队列 Spider 程序工作完成 等待队列中是否有 URL。 否 下载从等待队列中得到的网页,并将他送入运行队列中。 是 这个网页包含其他超级连接吗。 将这一网页送入完成队列并继续 查看网页上的下一个超连接 是否为指向Web 的连接。 报告其他类型连接 连接是否与网页所在主机不同且只处理本地连接。 报告 外部连接 报告网页连接 将连接加入等候队列 否 是 否 是 否 是 15 Ispider Reportable 接口 5 这是一个必须实现的接口,可以通过回调函数接受 Spider 所遇到的页面。 接口定义了 Spider 向他的控制者发送的几个事件。 通过提供对每个事件的处理程序,可以创建各种 Spider 程序。 下面是他的接口声明: public interface IspiderReportable{ public boolean foundInternalLink(String url)。 public boolean foundExternalLink(String url)。 public boolean foundOtherLink(String url)。 public void processPage(HTTP page)。 public void pletePage(HTTP page,boolean error)。 public boolean getRemoveQuery()。 public void SpiderComplete()。 } 如何提高程序性能 Inter 中拥有海量的 Web 页面,如果开发出高效的 Spider 程序是非常重要的。 下面就来介绍下几种提高性能的技术: Java 的多线程技术 线程是通过程序的一条执行路线。 多线程是一个程序同时运行多个任务的能力。 它是在一个程序的内部进行分工合作。 优化程序的通常方法是确定瓶颈并改进它。 瓶颈是一个程序中最慢的部分,它限制了其他任务的运行。 据个例子说明:一个 Spider 程序需要下载十个页面,要完成这一任务,程序必须向服务器发出请求然后接受这些网页。 当程序等待响应的时候其他任务不能执 行,这就影响了程序的效率。 如果用多线程技术可以让这些网页的等待时间合在一起,不用互相影响,这就可以极大的改进程序性能。 数据库技术 当 Spider 程序访问一个大型 Web 站点时,必须使用一种有效的方法来存储站点队列。 这些队列管理 Spider 程序必须维护大型网页的列表。 如果把他们放在内存中 16 将会是性能下降,所以我们可以把他们放在数据库中减少系统资源的消耗。 网络机器人的代码分析 程序结构图如下: 图 3 网络机器人 程序结构图 程序代码实现如下: package news。 /** * 新闻搜索引 擎 * 计算机 99630 沈晨 * 版本 */ import。 import。 import。 import。 import。 import。 /** * 构造一个 Bot程序 */ 17 public class Searcher implements ISpiderReportable { public static void main(String[] args) throws Exception { IWorkloadStorable wl = new SpiderInternalWorkload()。 Searcher _searcher = new Searcher()。 Spider _spider = new Spider(_searcher, new HTTPSocket(), 100, wl)。 (100)。 ()。 } // 发现内部连接时调用, url 表示程序发现的 URL,若返回 true 则加入作业中,否则不加入。 public boolean foundInternalLink(String url) { return false。 } // 发现外部连接时调用, url 表示程序所发现的 URL,若返回 true 则把加入作业中,否则不加入。 public boolean foundExternalLink(String url) { return false。 } // 当发现其他连接时调用这个方法。 其他连接指的是非 HTML 网页,可能是Email 或者 FTP public boolean foundOtherLink(String url) { return false。 } // 用于处理网页,这是 Spider 程序要完成的实际工作。 public void processPage(HTTP ) { (扫描网页: + ())。 18 new HTMLParse().start()。 } // 用来请求一个被处理的网页。 public void pletePage(HTTP , boolean error) { } // 由 Spider 程序调用以确定查询字符串 是否应删除。 如果队列中的字符串应当删除,方法返回真。 public boolean getRemoveQuery() { return true。 } // 当 Spider 程序没有剩余的工作时调用这个方法。 public void spiderComplete() { } } 小结 在本章中,首先介绍了网络机器人的基本概念,然后具体分析了 Spider 程序的结构和功能。 在最后还结合具体代码进行了详细说明。 本人在编程中运用了 JavaTM 技术,主要涉及到了 和 io 两个包。 此外还用了第三方开发包 Bot。 19 第四章 基于 Lucene 的索引与搜索 什么是 Lucene 全文检索 Lucene 是 Jakarta Apache 的开源项目。 它是一个用 Java 写的全文 索引 引擎工具包,可以方便的嵌入到各种应用中实现针对应用的全文索引 /检索功能。 Lucene 的原理分析 全文检索的实现机制 Lucene 的 API 接口设计的比较通用,输入输出结构都很像数据库的表 ==记录==字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到 Lucene 的存 储结构和接口中。 总体上看:可以先把 Lucene 当成一个支持全文索引的数据库系统。 索引数据源: doc(field1,field2...) doc(field1,field2...) \ indexer / _____________ | Lucene Index| / searcher \ 结果输出: Hits(doc(field1,field2) doc(field1...)) Document:一个需要进行索引的“单元”,一个 Document 由多个字段组成 Field:字段 Hits:查询结果集,由匹配的 Document 组成 Lucene 的索引效率 由于数据库索引不是为全文索引设计的,因此,使用 like %keyword%时,数据库索引是不起作用的,在使用 like 查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说, LIKE 对性能的危害是极 大的。 如果是需要对多个关键词进行模糊匹配: like%keyword1% and like %keyword2% ...其效率也就可想而知了。 所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储 20 的同时,有另外一个排好序的关键词列表,用于存储关键词 ==文章映射关系,利用这样的映射关系索引: [关键词 ==出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率 ],检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组 合的过程。 从而大大提高。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。