擴(kuò)展Lucene的索引文件存儲(chǔ)2007/02/01 作者:劉冬 心情: 星期四 (12:01)本文主要敘述如何通過引入Commons-VFS項(xiàng)目來擴(kuò)展Lucene的索引文件存儲(chǔ)方式。在閱讀本文之前,您必須對(duì)Lucene有一定的了解,最好是有編寫過Lucene代碼。另外文章中所提到的Lucene如果不做特殊說明指的是Lucene的Java版本。 使用過Lucene來做為搜索引擎的朋友知道,Lucene默認(rèn)的使用文件系統(tǒng)來存儲(chǔ)索引文件。一般我們需要指定一個(gè)路徑做為參數(shù)來初始化索引的讀寫類。例如下面語句準(zhǔn)備在D盤的lucene_idx目錄下寫索引信息。
因此整個(gè)系統(tǒng)的索引一般就會(huì)集中在某臺(tái)服務(wù)器的某個(gè)目錄。為了保證寫索引不會(huì)產(chǎn)生沖突,經(jīng)常我們只運(yùn)行一個(gè)負(fù)責(zé)寫索引的進(jìn)程,其他的應(yīng)用可以訪問索引目錄進(jìn)行查詢。當(dāng)應(yīng)用程序是集群環(huán)境下的不同機(jī)器時(shí),其他的機(jī)器如何訪問到索引服務(wù)器上的索引數(shù)據(jù)目錄呢?你肯定已經(jīng)想到很多種方法來訪問其他機(jī)器的目錄:例如Windows機(jī)器可以通過網(wǎng)上鄰居;Linux服務(wù)器之間可以通過NFS訪問;或者Linux和Windows服務(wù)器之間可以通過SAMBA來相互訪問各自的文件系統(tǒng)。還有沒有其他更加靈活的解決方案嗎? 當(dāng)然有,通過擴(kuò)展Lucene的索引存儲(chǔ)接口,你可以通過FTP、HTTP來讀寫索引文件,你甚至可以將Lucene的索引數(shù)據(jù)保存在數(shù)據(jù)庫中,雖然我不知道這到底是不是一個(gè)好主意,但起碼技術(shù)上是可行的。 為了使我們對(duì)Lucene的擴(kuò)展有著實(shí)際的意義,我們將引入另外一個(gè)Apache組織新的開源項(xiàng)目—— Commons-VFS,我們簡(jiǎn)稱為VFS。VFS項(xiàng)目把對(duì)各種各樣的文件系統(tǒng)的訪問封裝成統(tǒng)一的應(yīng)用程序接口,這大大的簡(jiǎn)化了應(yīng)用程序本身代碼的復(fù)雜度。目前VFS支持下面一些文件系統(tǒng),而這個(gè)列表會(huì)越來越多,當(dāng)然你也可以自行進(jìn)行擴(kuò)展。 FTP 或許你已經(jīng)猜出來了引入VFS項(xiàng)目的目的:我們要利用VFS 項(xiàng)目和Lucene結(jié)合,使Lucene的索引文件可以存放在VFS所支持的各種可讀寫的文件系統(tǒng)中。 因此接下來我們的任務(wù)就是讓Lucene使用VFS來存取索引數(shù)據(jù),至于這些數(shù)據(jù)放在哪里,是放在數(shù)據(jù)庫、文件系統(tǒng)還是其他地方,這個(gè)問題就交給VFS的配置去處理了。 你準(zhǔn)備好了嘛?下面我們要深入到Lucene的代碼中去探個(gè)究竟了。首先我們注意到了IndexReader、IndexWriter、IndexSearcher等這幾個(gè)索引數(shù)據(jù)的讀寫類的構(gòu)造函數(shù)都可以接受名為org.apache.lucene.store.Directory 的類做為參數(shù)。再查看api文檔發(fā)現(xiàn)Directory有兩個(gè)子類分別是:FSDirectory和RAMDirectory,從類名上可以猜出FSDirectory是基于文件系統(tǒng)的,而RAMDirectory是基于內(nèi)存的。再讀一下IndexWriter類的源碼后證實(shí)了這個(gè)猜想,當(dāng)我們傳遞路徑字符串而不是Directory對(duì)象給IndexXxxxx類時(shí),Lucene會(huì)初始化一個(gè)FSDirectory對(duì)象來處理索引數(shù)據(jù)的讀寫操作。 而另外一個(gè)RAMDirectory類是基于內(nèi)存的索引數(shù)據(jù)存取,它是Lucene所提供的第二種索引數(shù)據(jù)存取方式。它可以接受一個(gè)FSDirectory做為構(gòu)造函數(shù)的參數(shù),相當(dāng)于把存放在磁盤中的索引數(shù)據(jù)全部加載到內(nèi)存中,以提高索引搜索的性能,我們暫不理會(huì)這種方式。但我們已經(jīng)了解到org.apache.lucene.store包中的類便是Lucene存儲(chǔ)的核心,我們可以通過擴(kuò)展Directory類來實(shí)現(xiàn)存儲(chǔ)自定義。姑且把所要擴(kuò)展的這個(gè)類命名為VFSDirectory。
上面這些都是跟文件操作密切相關(guān)的方法,應(yīng)該也是大家天天要打交道的文件操作方法。為了不至于誤解這些方法的意思,我們不妨看看FSDirectory的源碼。以下VFSDirectory類的完整代碼,該類已經(jīng)在實(shí)際的應(yīng)用中測(cè)試無誤。此類的構(gòu)造函數(shù)接受兩個(gè)uri做為參數(shù),分別是存放索引文件的URI以及鎖文件的URI,關(guān)于URI的格式請(qǐng)參考VFS項(xiàng)目的文檔。性能方面由于采用了跟FSDirectory一致的BufferedIndexInput和BufferedIndexOuput,因此二者并沒有太大區(qū)別。
有了VFSDirectory這個(gè)類后,使用就非常方便了。我們只需要構(gòu)造一個(gè)VFSDirectory對(duì)象,并傳遞給IndexReader、IndexWriter、IndexSearcher等即可。為了方便各位讀者進(jìn)行測(cè)試,本文中的所有代碼請(qǐng)看參考資料中的源碼下載。 完成了VFSDirectory后,就相當(dāng)于給Lucene注入更多的功力。任何VFSDirectory所支持的可讀寫文件系統(tǒng)都可以被Lucene用來存放索引數(shù)據(jù)。如果是VFS本身不支持的文件系統(tǒng)我們也可以通過擴(kuò)展VFS來實(shí)現(xiàn)對(duì)Lucene的擴(kuò)展。 最后補(bǔ)充一點(diǎn)關(guān)于本文所涉及的源碼的使用說明,編譯源碼需要lucene以及vfs包的支持,編譯成功后直接運(yùn)行TestLuceneVFS類即可進(jìn)行測(cè)試。 參考資料: 源碼下載地址:http://www./uploads/files/lucene_and_vfs.zip 關(guān)于作者: 劉冬,一直使用J2EE/J2ME從事移動(dòng)互聯(lián)網(wǎng)方面的開發(fā)。您可以通過Java自由人網(wǎng)站來跟他聯(lián)系,網(wǎng)址是:http://www./javayou ,另外他的郵件地址是javayou@gmail.com。引用地址: http://www./html/trackback.do?id=5903&type=1 (復(fù)制地址)
|
|