jsp基于产品的搜索引擎内容摘要:

构来实现 Spider 程序。 基于的搜索引擎 第 11 页 共 34 页 递归结构 递归是在一个方法中调用自己本身的程序设计技术。 虽然比较容易实现但耗费内存且不能使用多线程技术,故不适合大型项目。 非递归结构 这种方法使用队列的数据结构,当 Spider 程序 发现超连接后并不调用自己本身而是把超连接加入到等待队列中。 当 Spider 程序扫描完当前页面后会根据制定的策略访问队列中的下一个超连接地址。 虽然这里只描述了一个队列,但在实际编程中用到了四个队列,他们每个队列都保存着同一处理状态的 URL。 等待队列 在这个队列中, URL 等待被 Spider 程序处理。 新发现的 URL 也被加入到这个队列中 处理队列 当 Spider 程序开始处理时,他们被送到这个队列中 错误队列 如果在解析网页时出错, URL 将被送到这里。 该队列中的 URL 不能被移入其他队列中 完成队列 如果解析网页没 有出错, URL 将被送到这里。 该队列中的 URL 不能被移入其它队列中 在同一时间 URL 只能在一个队列中,我们把它称为 URL 的状态。 以上的图表示了队列的变化过程,在这个过程中,当一个 URL 被加入到等待队列中时 Spider 程序就会开始运行。 只要等待队列中有一个网页或 Spider 程序正在处理一个网页,程序就会继续他的工作。 当等待队列为空并且当前没有任何网页时, Spider 程序就会停止它的工作。 如何构造 Spider 程序 在构造 Spider 程序之 前我们先了解下程序的各个部分是如何共同工作的。 以及如何对这个程序进行扩展。 流程图如下所示: 发现 URL 等待队列 运行队列 完成队列 错误队列 完成 URL 基于的搜索引擎 第 12 页 共 34 页 把 URL 加入等待队列 Spider 程序工作完成 等待队列中是否有 URL。 否 下载从等待队列中得到的网页,并将他送入运行队列中。 是 这个网页包含其他超级连接吗。 将这一网页送入完成队列并继续 查看网页上的下一个超连接 是否为指向Web 的连接。 报告其他类型连接 连接是否与网页所在主机不同且只处理本地连接。 报告外部连接 报告网页连接 将连接加入等候队列 否 是 否 是 否 是 基于的搜索引擎 第 13 页 共 34 页 IspiderReportable 接口 这是一个必须实现的接口,可以通过回调函数接受 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 程序必须维护大型网页的列表。 如果把他们放在内存中将会是性能下降,所以我们可以把他们放在数据库中减少系统资源的消基于的搜索引擎 第 14 页 共 34 页 耗。 网络机器人的代码分析 程序结构图如下: 程序代码实现如下: package news。 import。 import。 import。 import。 import。 import。 /** * 构造一个 Bot程序 */ public class Searcher implements ISpiderReportable { public static void main(String[] args) throws Exception { IWorkloadStorable wl = new SpiderInternalWorkload()。 Searcher _searcher = new Searcher()。 Spider _spider 基于的搜索引擎 第 15 页 共 34 页 = 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 ) { (扫描网页: + ())。 new HTMLParse().start()。 } // 用 来请求一个被处理的网页。 public void pletePage(HTTP , boolean error) { } // 由 Spider程序调用以确定查询字符串是否应删除。 如果队列中的字符串应当删除,方法返回真。 public boolean getRemoveQuery() { return true。 } 基于的搜索引擎 第 16 页 共 34 页 // 当 Spider程序没有剩余的工作时调用这个方法。 public void spiderComplete() { } } 在本章 中,首先介绍了网络机器人的基本概念,然后具体分析了 Spider 程序的结构和功能。 在最后还结合具体代码进行了详细说明。 本人在编程中运用了 JavaTM技术,主要涉及到了 和 io 两个包。 此外还用了第三方开发包 Bot(由 Jeff Heaton 提供的开发包)。 基于的搜索引擎 第 17 页 共 34 页 第四章 基于 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 的索引效率 通 常书籍后面常常附关键词索引表(比如:北京: 12, 34页,上海: 3,77页 „„ ),它能够帮助读者比较快地找到相关内容的页码。 而数据库索引能够大大提高查询的速度原理也是一样,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍 „„ 而索引之所以效率高,另外一个原因是它是排好序的。 对于检索系统来说核心是一个排序问题。 基于的搜索引擎 第 18 页 共 34 页 由于数据库索引不是为全文索引设计的,因此, 使用 like %keyword%时,数据库索引是不起作用的 ,在使用 like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊 查询的数据库服务来说, LIKE对性能的危害是极大的。 如果是需要对多个关键词进行模糊匹配: like%keyword1% and like %keyword2% ...其效率也就可想而知了。 所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表,用于存储关键词 ==文章映射关系,利用这样的映射关系索引: [关键词 ==出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率 ],检索过程就是把 模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。 从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。 由此可以看出模糊查询相对数据库的精确查询是一个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。 Lucene最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制,并提。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。