自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

搜索那點(diǎn)事兒:Lucene 文件存儲(chǔ)和讀取技術(shù)詳解

大數(shù)據(jù)
Lucene是一個(gè)高性能、可伸縮的信息搜索(IR)庫(kù)。它可以為你的應(yīng)用程序添加索引和搜索能力。Lucene是用Java實(shí)現(xiàn)的、成熟的開(kāi)源項(xiàng)目,是著名的Apache Jakarta大家庭的一員,并且基于Apache軟件許可。

[[203641]]

Lucene是一個(gè)高性能、可伸縮的信息搜索(IR)庫(kù)。它可以為你的應(yīng)用程序添加索引和搜索能力。Lucene是用Java實(shí)現(xiàn)的、成熟的開(kāi)源項(xiàng)目,是著名的Apache Jakarta大家庭的一員,并且基于Apache軟件許可。

Lucene的檢索算法屬于索引檢索,即用空間來(lái)?yè)Q取時(shí)間,對(duì)需要檢索的文件、字符流進(jìn)行全文索引,在檢索的時(shí)候?qū)λ饕M(jìn)行快速的檢索,得到檢索位置,這個(gè)位置記錄檢索詞出現(xiàn)的文件路徑或者某個(gè)關(guān)鍵詞。Lucene的索引是用文件存儲(chǔ),Lucene中的文件操作都是通過(guò)Directory來(lái)實(shí)現(xiàn),下面來(lái)介紹一下Lucene有關(guān)文件存儲(chǔ)和讀取的有關(guān)技術(shù)。

1 數(shù)據(jù)存儲(chǔ)類(lèi)Directory(org.apache.lucene.store.Directory)

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

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

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

如下圖是org.apache.lucene.store.Directory類(lèi)以及它的一些子類(lèi)的類(lèi)圖:

(1) org.apache.lucene.store.FSDirectory

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

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

(2) org.apache.lucene.store.RAMDirectory

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

(3) org.apache.lucene.store.MMapDirectory

Lucene和Solr開(kāi)始在64位的Windows和Solaris系統(tǒng)中默認(rèn)使用MMapDirectory。簡(jiǎn)單說(shuō)MMapDirectory就是把Lucene的索引當(dāng)作swap file來(lái)處理。mmap()系統(tǒng)調(diào)用讓OS把整個(gè)索引文件映射到虛擬地址空間,這樣Lucene就會(huì)覺(jué)得索引在內(nèi)存中。然后Lucene就可以像訪問(wèn)一個(gè)超大的byte[]數(shù)據(jù)(在Java中這個(gè)數(shù)據(jù)被封裝在ByteBuffer接口里)一樣訪問(wèn)磁盤(pán)上的索引文件。

Lucene在訪問(wèn)虛擬空間中的索引時(shí),不需要任何的系統(tǒng)調(diào)用,CPU里的MMU和TLB會(huì)處理所有的映射工作。如果數(shù)據(jù)還在磁盤(pán)上,那么MMU會(huì)發(fā)起一個(gè)中斷,OS將會(huì)把數(shù)據(jù)加載進(jìn)文件系統(tǒng)Cache。如果數(shù)據(jù)已經(jīng)在cache里了,MMU/TLB會(huì)直接把數(shù)據(jù)映射到內(nèi)存,這只需要訪問(wèn)內(nèi)存,速度很快。

程序員不需要關(guān)心paging in/out,所有的這些都交給OS。而且,這種情況下沒(méi)有并發(fā)的干擾,***的問(wèn)題就是Java的ByteBuffer封裝后的byte[]稍微慢一些,但是Java里要想用mmap就只能用這個(gè)接口。還有一個(gè)很大的優(yōu)點(diǎn)就是所有的內(nèi)存issue都由OS來(lái)負(fù)責(zé),這樣沒(méi)有GC的問(wèn)題。因此在64位平臺(tái)上的Lucene,盡量使用MMapDirectory。

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

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

3 文件寫(xiě)入類(lèi)IndexOutput(org.apache.lucene.store.IndexOutput)

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

作為一種檢索系統(tǒng)框架,Lucene并不直接提供系統(tǒng)的實(shí)現(xiàn),而僅僅是系統(tǒng)框架而已。因此,為了構(gòu)建一個(gè)真正可用的全文檢索系統(tǒng),開(kāi)發(fā)人員必須熟悉Lucene的基本框架以及API,這樣才能進(jìn)行高效的開(kāi)發(fā)。

這一需求要求了Lucene具備一種簡(jiǎn)明、方便的構(gòu)架與函數(shù)接口來(lái)方便用戶(hù)(即開(kāi)發(fā)人員)的使用。這體現(xiàn)了Lucene需要很高的易用性(usability)。 不僅如此,開(kāi)源是Lucene的一個(gè)重大屬性。相比Google的pagerank搜索方案,Lucene必須不斷改進(jìn)其算法以及各種輔助措施來(lái)使得其運(yùn)行更加高效,并支持多種語(yǔ)言等。因此,Lucene必須具備很好的可修改性(modifiability)。

【本文為51CTO專(zhuān)欄作者“達(dá)觀數(shù)據(jù)”的原創(chuàng)稿件,轉(zhuǎn)載可通過(guò)51CTO專(zhuān)欄獲取聯(lián)系】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2018-05-17 09:46:40

apachenginx阻塞

2022-05-26 15:30:21

Spring AOP框架

2013-12-04 09:46:56

Hyper-VNUMA

2011-12-26 11:13:24

密碼

2015-12-08 14:49:13

SDN軟件定義網(wǎng)絡(luò)

2017-09-12 08:03:29

數(shù)據(jù)庫(kù)MySQL主庫(kù)

2011-12-07 13:54:03

筆記本常見(jiàn)問(wèn)題

2013-12-26 13:35:39

2020-01-03 07:57:39

UDPTCP網(wǎng)絡(luò)協(xié)議

2013-04-09 20:37:56

2022-05-26 09:03:39

AOP編程

2013-09-17 10:37:03

AOPAOP教程理解AOP

2018-03-30 16:03:04

軟件無(wú)狀態(tài)”

2018-09-26 14:42:48

操作系統(tǒng)Web服務(wù)器

2012-03-12 21:23:47

Windows pho

2021-04-13 09:12:45

網(wǎng)絡(luò)設(shè)備無(wú)線路由器交換機(jī)

2023-12-04 11:02:53

C++空類(lèi)

2012-06-21 10:18:43

索引搜索Java

2017-04-19 08:35:34

2017-01-09 18:31:53

微信小程序/白熊技術(shù)簡(jiǎn)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)