色屁屁www影院免费观看入口,欧美性猛交ⅹxxx乱大交妖精,欧美激情第5页,欧美性猛交xxxx三人,欧美一a级做爰片大开眼界

達(dá)觀動態(tài)

達(dá)觀愿與業(yè)內(nèi)同行分享 助力各企業(yè)在大數(shù)據(jù)浪潮來臨之際一起破浪前行

Lucene的索引存儲技術(shù)簡介

6

Lucene是一個高性能、可伸縮的信息搜索(IR)庫。它可以為你的應(yīng)用程序添加索引和搜索能力。Lucene是用java實(shí)現(xiàn)的、成熟的開源項(xiàng)目,是著名的Apache Jakarta大家庭的一員,并且基于Apache軟件許可。同樣,Lucene是當(dāng)前非常流行的、免費(fèi)的Java信息搜索(IR)庫。lucene的檢索算法屬于索引檢索,即用空間來換取時間,對需要檢索的文件、字符流進(jìn)行全文索引,在檢索的時候?qū)λ饕M(jìn)行快速的檢索,得到檢索位置,這個位置記錄檢索詞出現(xiàn)的文件路徑或者某個關(guān)鍵詞。Lucene的索引是用文件存儲,LUCENE中的文件操作都是通過這Directory來實(shí)現(xiàn)的,下面來介紹一下lucene有關(guān)文件存儲和讀取的有關(guān)技術(shù)。

1. 數(shù)據(jù)存儲類Directory

1.1 org.apache.lucene.store.Directory

一個Directory對象是一系列統(tǒng)一的文件列表(a flat list of files)。文件可以在它們被創(chuàng)建的時候一次寫入,一旦文件被創(chuàng)建,它再次打開后只能用于讀?。╮ead)或者刪除(delete)操作。并且同時在讀取和寫入的時候允許隨機(jī)訪問(random access)。

在這里并不直接使用Java I/O API,但是更確切地說,所有I/O操作都是通過這個API處理的。這使得讀寫操作方式更統(tǒng)一起來,如基于內(nèi)存的索引(RAM-basedindices)的實(shí)現(xiàn)(即RAMDirectory)、通過JDBC存儲在數(shù)據(jù)庫中的索引、將一個索引存儲為一個文件的實(shí)現(xiàn)(即FSDirectory)。

Directory的鎖機(jī)制是一個LockFactory的實(shí)例實(shí)現(xiàn)的,可以通過調(diào)用Directory實(shí)例的setLockFactory()方法來更改。

org.apache.lucene.store.Directory類以及它的一些子類的類圖。如下圖所示

1

1.2?org.apache.lucene.store.FSDirectory

FSDirectory類直接實(shí)現(xiàn)Directory抽象類為一個包含文件的目錄。目錄鎖的實(shí)現(xiàn)使用缺省的SimpleFSLockFactory,但是可以通過兩種方式修改,即給getLockFactory()傳入一個LockFactory實(shí)例,或者通過調(diào)用setLockFactory()方法明確制定LockFactory類。

目錄將被緩存(cache)起來,對一個指定的符合規(guī)定的路徑(canonical path)來說,同樣的FSDirectory實(shí)例通常通過getDirectory()方法返回。這使得同步機(jī)制(synchronization)能對目錄起作用。

2

1.3?org.apache.lucene.store.RAMDirectory

RAMDirectory類是一個駐留內(nèi)存的(memory-resident)Directory抽象類的實(shí)現(xiàn)。目錄鎖的實(shí)現(xiàn)使用缺省的SingleInstanceLockFactory,但是可以通過setLockFactory()方法修改。

3

1.4?org.apache.lucene.store.MMapDirectory

Lucene和Solr開始在64位的Windows和Solaris系統(tǒng)中默認(rèn)使用MMapDirectory。簡單說MMapDirectory就是把lucene的索引當(dāng)作swap file來處理。mmap()系統(tǒng)調(diào)用讓OS把整個索引文件映射到虛擬地址空間,這樣Lucene就會覺得索引在內(nèi)存中。然后Lucene就可以像訪問一個超大的byte[]數(shù)據(jù)(在Java中這個數(shù)據(jù)被封裝在ByteBuffer接口里)一樣訪問磁盤上的索引文件。Lucene在訪問虛擬空間中的索引時,不需要任何的系統(tǒng)調(diào)用,CPU里的MMU和TLB會處理所有的映射工作。如果數(shù)據(jù)還在磁盤上,那么MMU會發(fā)起一個中斷,OS將會把數(shù)據(jù)加載進(jìn)文件系統(tǒng)Cache。如果數(shù)據(jù)已經(jīng)在cache里了,MMU/TLB會直接把數(shù)據(jù)映射到內(nèi)存,這只需要訪問內(nèi)存,速度很快。程序員不需要關(guān)心pagingin/out,所有的這些都交給OS。而且,這種情況下沒有并發(fā)的干擾,唯一的問題就是Java的ByteBuffer封裝后的byte[]稍微慢一些,但是Java里要想用mmap就只能用這個接口。還有一個很大的優(yōu)點(diǎn)就是所有的內(nèi)存issue都由OS來負(fù)責(zé),這樣沒有GC的問題。因此在64位平臺上的lucene,盡量使用MMapDirectory。

2. 文件讀取類IndexInput(org.apache.lucene.store.IndexInput)

IndexInput類是一個為了從一個目錄(Directory)中讀取文件的抽象基類,是一個隨機(jī)訪問(random-access)的輸入流(input stream),用于所有Lucene讀取Index的操作。BufferedIndexInput是一個實(shí)現(xiàn)了帶緩沖的IndexInput的基礎(chǔ)實(shí)現(xiàn)。

4

3.? 文件寫入類IndexOutput(org.apache.lucene.store.IndexOutput)

IndexOutput類是一個為了寫入文件到一個目錄(Directory)中的抽象基類,是一個隨機(jī)訪問(random-access)的輸出流(output stream),用于所有Lucene寫入Index的操作。BufferedIndexOutput是一個實(shí)現(xiàn)了帶緩沖的IndexOutput的基礎(chǔ)實(shí)現(xiàn)。RAMOuputStream是一個內(nèi)存駐留(memory-resident)的IndexOutput的實(shí)現(xiàn)類。

5

?

作為一種檢索系統(tǒng)框架,Lucene并不直接提供系統(tǒng)的實(shí)現(xiàn),而僅僅是系統(tǒng)框架而已。因此,為了構(gòu)建一個真正可用的全文檢索系統(tǒng),開發(fā)人員必須熟悉Lucene的基本框架以及API,這樣才能進(jìn)行高效的開發(fā)。這一需求要求了Lucene要具備一種簡明、方便的構(gòu)架與函數(shù)接口來方便用戶(即開發(fā)人員)的使用。這體現(xiàn)了Lucene需要很高的易用性(usability)。 不僅如此,開源是Lucene的一個重大屬性。相比Google的pagerank搜索方案,Lucene必須不斷改進(jìn)其算法以及各種輔助措施來使得其運(yùn)行更加高效,并支持多種語言等。因此,Lucene必須具備很好的可修改性(modifiability)。

?作者介紹:劉光敏??搜索研發(fā)工程師

想查看更多技術(shù)文章,下載達(dá)觀數(shù)據(jù)技術(shù)電子刊,下載地址:http://t.cn/ROFeFHh