Spider程序需要下载十个页面,要完成这一任务,程序必须向服务器发出请求然后接受这些网页。当程序等待响应的时候其他任务不能执行,这就影响了程序的效率。如果用多线程技术可以让这些网页的等待时间合在一起,不用互相影响,这就可以极大的改进程序性能。
数据库技术
当Spider程序访问一个大型Web站点时,必须使用一种有效的方法来存储站点队列。这些队列管理Spider程序必须维护大型网页的
列表。如果把他们放在内存中将会是性能下降,所以我们可以把他们放在数据库中减少系统资源的消耗。
3.2.5网络机器人的代码分析
程序结构图如下:
程序代码实现如下:
package news; /** * 新闻搜索引擎 * 版本 1.0 */
import com.heaton.bot.HTTP;
import com.heaton.bot.HTTPSocket;
import com.heaton.bot.ISpiderReportable;
import com.heaton.bot.IWorkloadStorable;
import com.heaton.bot.Spider;
import com.heaton.bot.SpiderInternalWorkload; /** * 构造一个Bot程序 */
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, "127.0.0.1/news.htm", new HTTPSocket(), 100, wl); _spider.setMaxBody(100);
_spider.start(); } // 发现内部连接时调用,url表示程序发现的URL,若返回true则加入
作业中,否则不加入。
public boolean foundInternalLink(String url) {
return false; } // 发现外部连接时调用,url表示程序所发现的URL,若返回true则把加入作业中,否则不加入。
public boolean foundExternalLink(String url) {
return false; } // 当发现其他连接时调用这个方法。其他连接指的是非HTML网页,可能是E-mail或者FTP
public boolean foundOtherLink(String url) {
return false; } // 用于处理网页,这是Spider程序要完成的实际工作。
public void processPage(HTTP http) {
System.out.println("扫描网页:" + http.getURL());
new HTMLParse(http).start(); } // 用来请求一个被处理的网页。
public void completePage(HTTP http, boolean error) { } // 由Spider程序调用以确定查询字符串是否应删除。如果队列中的字符串应当删除,方法返回真。
public boolean getRemoveQuery() {
return true; } // 当Spider程序没有剩余的工作时调用这个方法。
public void spiderComplete() { }
}
3.3小节
在本章中,首先介绍了网络机器人的基本概念,然后具体分析了Spider程序的结构和功能。在最后还结合具体代码进行了详细说明。
本人在编程中运用了JavaTM技术,主要涉及到了net和io两个包。此外还用了第三方开发包Bot(由Jeff Heaton提供的开发包)。
第四章 基于lucene的索引与搜索
4.1什么是Lucene全文检索
Lucene是Jakarta Apache的开源项目。它是一个用Java写的全文索引引擎工具包,可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
4.2 Lucene的原理分析
4.2.1全文检索的实现机制
Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构和接口中。
总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。
索引数据源:doc(field1,field2...) doc(field1,field2...) \ indexer / _____________ | Lucene Index| -------------- searcher \
结果输出:Hits(doc(field1,field2