Lucene總的來(lái)說(shuō)是:
- 一個(gè)高效的,可擴(kuò)展的,全文檢索庫(kù)。
- 全部用Java實(shí)現(xiàn),無(wú)須配置。
- 僅支持純文本文件的索引(Indexing)和搜索(Search)。
- 不負(fù)責(zé)由其他格式的文件抽取純文本文件,或從網(wǎng)絡(luò)中抓取文件的過(guò)程。
在Lucene in action中,Lucene 的構(gòu)架和過(guò)程如下圖,
說(shuō)明Lucene是有索引和搜索的兩個(gè)過(guò)程,包含索引創(chuàng)建,索引,搜索三個(gè)要點(diǎn)。
讓我們更細(xì)一些看Lucene的各組件:
- 被索引的文檔用Document對(duì)象表示。
- IndexWriter通過(guò)函數(shù)addDocument將文檔添加到索引中,實(shí)現(xiàn)創(chuàng)建索引的過(guò)程。
- Lucene的索引是應(yīng)用反向索引。
- 當(dāng)用戶有請(qǐng)求時(shí),Query代表用戶的查詢語(yǔ)句。
- IndexSearcher通過(guò)函數(shù)search搜索Lucene Index。
- IndexSearcher計(jì)算term weight和score并且將結(jié)果返回給用戶。
- 返回給用戶的文檔集合用TopDocsCollector表示。
那么如何應(yīng)用這些組件呢?
讓我們?cè)僭敿?xì)到對(duì)Lucene API 的調(diào)用實(shí)現(xiàn)索引和搜索過(guò)程。
- 索引過(guò)程如下:
- 創(chuàng)建一個(gè)IndexWriter用來(lái)寫(xiě)索引文件,它有幾個(gè)參數(shù),INDEX_DIR就是索引文件所存放的位置,Analyzer便是用來(lái)對(duì)文檔進(jìn)行詞法分析和語(yǔ)言處理的。
- 創(chuàng)建一個(gè)Document代表我們要索引的文檔。
- 將不同的Field加入到文檔中。我們知道,一篇文檔有多種信息,如題目,作者,修改時(shí)間,內(nèi)容等。不同類型的信息用不同的Field來(lái)表示,在本例子中,一共有兩類信息進(jìn)行了索引,一個(gè)是文件路徑,一個(gè)是文件內(nèi)容。其中FileReader的SRC_FILE就表示要索引的源文件。
- IndexWriter調(diào)用函數(shù)addDocument將索引寫(xiě)到索引文件夾中。
- 搜索過(guò)程如下:
- IndexReader將磁盤(pán)上的索引信息讀入到內(nèi)存,INDEX_DIR就是索引文件存放的位置。
- 創(chuàng)建IndexSearcher準(zhǔn)備進(jìn)行搜索。
- 創(chuàng)建Analyer用來(lái)對(duì)查詢語(yǔ)句進(jìn)行詞法分析和語(yǔ)言處理。
- 創(chuàng)建QueryParser用來(lái)對(duì)查詢語(yǔ)句進(jìn)行語(yǔ)法分析。
- QueryParser調(diào)用parser進(jìn)行語(yǔ)法分析,形成查詢語(yǔ)法樹(shù),放到Query中。
- IndexSearcher調(diào)用search對(duì)查詢語(yǔ)法樹(shù)Query進(jìn)行搜索,得到結(jié)果TopScoreDocCollector。
以上便是Lucene API函數(shù)的簡(jiǎn)單調(diào)用。
然而當(dāng)進(jìn)入Lucene的源代碼后,發(fā)現(xiàn)Lucene有很多包,關(guān)系錯(cuò)綜復(fù)雜。
然而通過(guò)下圖,我們不難發(fā)現(xiàn),Lucene的各源碼模塊,都是對(duì)普通索引和搜索過(guò)程的一種實(shí)現(xiàn)。
此圖是上一節(jié)介紹的全文檢索的流程對(duì)應(yīng)的Lucene實(shí)現(xiàn)的包結(jié)構(gòu)。(參照http://www.lucene.com.cn/about.htm中文章《開(kāi)放源代碼的全文檢索引擎Lucene》)
- Lucene的analysis模塊主要負(fù)責(zé)詞法分析及語(yǔ)言處理而形成Term。
- Lucene的index模塊主要負(fù)責(zé)索引的創(chuàng)建,里面有IndexWriter。
- Lucene的store模塊主要負(fù)責(zé)索引的讀寫(xiě)。
- Lucene的QueryParser主要負(fù)責(zé)語(yǔ)法分析。
- Lucene的search模塊主要負(fù)責(zé)對(duì)索引的搜索。
- Lucene的similarity模塊主要負(fù)責(zé)對(duì)相關(guān)性打分的實(shí)現(xiàn)。
了解了Lucene的整個(gè)結(jié)構(gòu),我們便可以開(kāi)始Lucene的源碼之旅了。