搜索引擎的核心元素
-- 攫取(fetching):就是把被指向的網(wǎng)頁(yè)下載下來(lái)。
-- 數(shù)據(jù)庫(kù):保存攫取的網(wǎng)頁(yè)信息,比如那些網(wǎng)頁(yè)已經(jīng)被攫取,什么時(shí)候被攫取的以及他們又有哪些鏈接的網(wǎng)頁(yè)等等。
-- 鏈接分析:對(duì)剛才數(shù)據(jù)庫(kù)的信息進(jìn)行分析,給每個(gè)網(wǎng)頁(yè)加上一些權(quán)值(比如PageRank,WebRank什么的),以便對(duì)每個(gè)網(wǎng)頁(yè)的重要性有所估計(jì)。不過(guò),在我看來(lái),索引那些網(wǎng)頁(yè)標(biāo)記(Anchor)里面的內(nèi)容更為重要。(這也是為什么諸如Google Bombing如此高效的原因)
-- 索引(Indexing): 就是對(duì)攫取的網(wǎng)頁(yè)內(nèi)容,以及鏈入鏈接,鏈接分析權(quán)值等信息進(jìn)行索引以便迅速查詢。
-- 搜索(Searching): 就是通過(guò)一個(gè)索引進(jìn)行查詢?nèi)缓蟀凑站W(wǎng)頁(yè)排名顯示。
Lucene 軟件包的發(fā)布形式是一個(gè) JAR 文件,下面我們分析一下這個(gè) JAR 文件里面的主要的 JAVA 包,使讀者對(duì)之有個(gè)初步的了解。
Package: org.apache.lucene.document
這個(gè)包提供了一些為封裝要索引的文檔所需要的類,比如 Document, Field。這樣,每一個(gè)文檔最終被封裝成了一個(gè) Document 對(duì)象。
Package: org.apache.lucene.analysis
這個(gè)包主要功能是對(duì)文檔進(jìn)行分詞,因?yàn)槲臋n在建立索引之前必須要進(jìn)行分詞,所以這個(gè)包的作用可以看成是為建立索引做準(zhǔn)備工作。
Package: org.apache.lucene.index
這個(gè)包提供了一些類來(lái)協(xié)助創(chuàng)建索引以及對(duì)創(chuàng)建好的索引進(jìn)行更新。這里面有兩個(gè)基礎(chǔ)的類:IndexWriter 和 IndexReader,其中 IndexWriter 是用來(lái)創(chuàng)建索引并添加文檔到索引中的,IndexReader 是用來(lái)刪除索引中的文檔的。
Package: org.apache.lucene.search
這個(gè)包提供了對(duì)在建立好的索引上進(jìn)行搜索所需要的類。比如 IndexSearcher 和 Hits, IndexSearcher 定義了在指定的索引上進(jìn)行搜索的方法,Hits 用來(lái)保存搜索得到的結(jié)果。
建立索引
為了對(duì)文檔進(jìn)行索引,Lucene 提供了五個(gè)基礎(chǔ)的類,他們分別是 Document, Field, IndexWriter, Analyzer, Directory。下面我們分別介紹一下這五個(gè)類的用途:
Document
Document 是用來(lái)描述文檔的,這里的文檔可以指一個(gè) HTML 頁(yè)面,一封電子郵件,或者是一個(gè)文本文件。一個(gè) Document 對(duì)象由多個(gè) Field 對(duì)象組成的??梢园岩粋€(gè) Document 對(duì)象想象成數(shù)據(jù)庫(kù)中的一個(gè)記錄,而每個(gè) Field 對(duì)象就是記錄的一個(gè)字段。
Field
Field 對(duì)象是用來(lái)描述一個(gè)文檔的某個(gè)屬性的,比如一封電子郵件的標(biāo)題和內(nèi)容可以用兩個(gè) Field 對(duì)象分別描述。
Analyzer
在一個(gè)文檔被索引之前,首先需要對(duì)文檔內(nèi)容進(jìn)行分詞處理,這部分工作就是由 Analyzer 來(lái)做的。Analyzer 類是一個(gè)抽象類,它有多個(gè)實(shí)現(xiàn)。針對(duì)不同的語(yǔ)言和應(yīng)用需要選擇適合的 Analyzer。Analyzer 把分詞后的內(nèi)容交給 IndexWriter 來(lái)建立索引。
IndexWriter
IndexWriter 是 Lucene 用來(lái)創(chuàng)建索引的一個(gè)核心的類,他的作用是把一個(gè)個(gè)的 Document 對(duì)象加到索引中來(lái)。
Directory
這個(gè)類代表了 Lucene 的索引的存儲(chǔ)的位置,這是一個(gè)抽象類,它目前有兩個(gè)實(shí)現(xiàn),第一個(gè)是 FSDirectory,它表示一個(gè)存儲(chǔ)在文件系統(tǒng)中的索引的位置。第二個(gè)是 RAMDirectory,它表示一個(gè)存儲(chǔ)在內(nèi)存當(dāng)中的索引的位置。
搜索文檔
利用Lucene進(jìn)行搜索就像建立索引一樣也是非常方便的。在上面一部分中,我們已經(jīng)為一個(gè)目錄下的文本文檔建立好了索引,現(xiàn)在我們就要在這個(gè)索引上進(jìn)行搜索以找到包含某個(gè)關(guān)鍵詞或短語(yǔ)的文檔。Lucene提供了幾個(gè)基礎(chǔ)的類來(lái)完成這個(gè)過(guò)程,它們分別是呢IndexSearcher, Term, Query, TermQuery, Hits. 下面我們分別介紹這幾個(gè)類的功能。
Query
這是一個(gè)抽象類,他有多個(gè)實(shí)現(xiàn),比如TermQuery, BooleanQuery, PrefixQuery. 這個(gè)類的目的是把用戶輸入的查詢字符串封裝成Lucene能夠識(shí)別的Query。
Term
Term是搜索的基本單位,一個(gè)Term對(duì)象有兩個(gè)String類型的域組成。生成一個(gè)Term對(duì)象可以有如下一條語(yǔ)句來(lái)完成:Term term = new Term(“fieldName”,”queryWord”); 其中第一個(gè)參數(shù)代表了要在文檔的哪一個(gè)Field上進(jìn)行查找,第二個(gè)參數(shù)代表了要查詢的關(guān)鍵詞。
TermQuery
TermQuery是抽象類Query的一個(gè)子類,它同時(shí)也是Lucene支持的最為基本的一個(gè)查詢類。生成一個(gè)TermQuery對(duì)象由如下語(yǔ)句完成: TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”)); 它的構(gòu)造函數(shù)只接受一個(gè)參數(shù),那就是一個(gè)Term對(duì)象。
IndexSearcher
IndexSearcher是用來(lái)在建立好的索引上進(jìn)行搜索的。它只能以只讀的方式打開一個(gè)索引,所以可以有多個(gè)IndexSearcher的實(shí)例在一個(gè)索引上進(jìn)行操作。
Hits
Hits是用來(lái)保存搜索的結(jié)果的