系统功能需求:
1.可自定义要搜索的网站列表;
2.可对目标列表网站的网页内容进行检索。
系统主要功能模块:
网络蜘蛛:采集、解析并保存目标列表网站的内容(网页)。
全文索引/检索:为目标列表网站内容建立索引,提供内容的全文检索。
采取方案:
网络蜘蛛——采用开源框架Heritrix,Heritrix是一个爬虫框架,可加如入一些可互换的组件。下载页面:http://crawler.archive.org/index.html。如何使用Heritrix可参考相关文献,也可笔者的《使用Heritrix爬虫爬取网页》。这里不再进行详细阐述。
全文索引/检索——该部分基于Lucene实现的。Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene官方网站:http://lucene.apache.org/。
Lucene索引过程的核心类:
IndexWriter :提供对索引的写入操作
Directory:描述了索引存放的位置
Analyzer:对文本进行分析,提取词汇(token),剔除无用的信息
Document:虚拟的文档
Field:每个Document包含一个或多个不同命名的Field,每个Field对应一段数据,这些数据在搜索过程中可能会被查询或在索引中被检索。
示例代码:
Directory dir = FSDirectory.getDirectory(indexDir); Analyzer anlyzer = new SimpleAnalyzer(); IndexWriter writer = new IndexWriter(dir, analyzer, true); Document doc = new Document(); doc.add(Field.Keyword(“id”, “1000”); doc.add(Field.UnIndexed(“name”, “Yao Ming”); doc.add(Field.UnStored(“intro”, “Yao Ming is a player of Houseton Rockets.”); writer.addDocument(doc); writer.close();
Lucene搜索过程的核心类:
IndexSearcher:用于搜索IndexWriter创建的索引
Term:用于搜索的一个基本单元包括了一对字符串元素,与Field相对应
Query :抽象的查询类
TermQuery:最基本的查询类型,用来匹配特定Field中包含特定值的文档
Hits:存放有序搜索结果指针的简单容器
示例代码:
IndexSearcher searcher = new IndexSearcher(directory); Term t = new Term(“intro”, “Yao”); Query query = new TermQuery(t); Hits hits = searcher.search(query); assertEquals(“JUnit test”, 1, hits.length());
在Heritrix下载获取网页资源后,需要对网页内容进行提取,提取网页内容在java世界中,可以使用HtmlParser或者Jsoup等开源软件。
HtmlParser——htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它能超高速解析html,而且不会出错。下载地址:http://sourceforge.net/projects/htmlparser/。
Jsoup——jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。官方网站:http://jsoup.org/。
在使用Lucene建立索引时,需要进行切词,lucene自带了一些切词工具,但主要是面向英文和德文的,中文没有英文那样明显的空格隔开词汇,因此需要另外加入中文切词功能。中文分词相关的工具有很多,比如IKAnalyzer 、ictclas4j、Je—Analyer等。
整个系统主要是基于Heritrix和Lucene实现的,可以基于这两个框架上搭建和完善搜索引擎。