系統功能需求:
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實現的,可以基於這兩個架構上搭建和完善搜尋引擎。