Lucene3.0使用教程_第1頁
Lucene3.0使用教程_第2頁
Lucene3.0使用教程_第3頁
Lucene3.0使用教程_第4頁
Lucene3.0使用教程_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第一部分:概述1.我們?cè)诤芏嗟胤蕉伎梢钥吹剿阉鞴δ? ,Windows系統(tǒng)中的有搜索功能:打開我的電腦”,按“F3”就可以使用查找的功能,查找指定的文件或文件夾。搜索的范圍是整個(gè)電腦中的文件資源。2 ,Eclipse中的幫助子系統(tǒng):點(diǎn)擊HelpHelpContents,可以查找出相關(guān)的幫助信息。搜索的范圍是Eclipse的所有幫助文件。3,在BBS、BLOG等系統(tǒng)中提供的搜索文章的功能,如這里的貼吧的例子。搜索的范圍是系統(tǒng)內(nèi)的文章數(shù)據(jù)(都在數(shù)據(jù)庫中)。4,搜索引擎,如Baidu或Google等,可以查詢到互聯(lián)網(wǎng)中的網(wǎng)頁、PDF、DOCPPT、圖片、視頻等。下圖是使用百度搜索的效果:百度搜索佶智

2、播客-licrosoftInternetEzplozcr文件編精強(qiáng)看9收蒲工具造助®百度一下新聞?dòng)庙撡N吧知道MP3圖片視頻地圖傳智播客把百度謖為主H東方標(biāo)準(zhǔn)Java培訓(xùn)海歸授課“梗德耳百言,全面提升外企就業(yè)實(shí)力皆業(yè)人才服務(wù)提供就業(yè)保障!WWW來百度推廣您的產(chǎn)品百度一下,找到相關(guān)網(wǎng)貝狗1刖小篇,用時(shí)口口14秒傳智播否-眾多北京間也培訓(xùn)大師,頂領(lǐng)北旗自±部II扒構(gòu).先就業(yè)后.諸多java培訓(xùn)專冢精心打造的知名J別由訓(xùn)曲牌,國內(nèi)java培訓(xùn)技術(shù)蔣名第一盤供項(xiàng)桀的內(nèi)ZA培訓(xùn)就業(yè)率高居北京人的培訓(xùn)機(jī)構(gòu)榜首.最深、,最精的即日培研課程學(xué)員就業(yè)薪水平.www.ilcast:n/2010-

3、3-5-百度快期傳智播客232mn小由clES3.(Aai白汕h由討m館Strut型向丫.潔智播客higgle源碼總詳情76K日傳笆格客司相課堂源碼.面詳借203.6KB傳智播客帳俄羅斯方缺源代碼.r即詳情E25.0KB傳智幡客胸盒吃蛇而戲源代洱.一www.verycd.cm/1opica/SI95/2010-3-2-百度忸照年智播客在結(jié)視頻觀看土豆網(wǎng)視頻計(jì)肆機(jī)視頻網(wǎng)絡(luò)知識(shí)傳智播客latcrnjH以上的查詢功能都類似。都是查詢的文本內(nèi)容,都是相同的查詢方式,即找出含有指定字符串的資源,不同的只是查詢范圍(分別為硬盤、所有幫助文件、數(shù)據(jù)庫、互聯(lián)網(wǎng))。2 .什么是全文檢索對(duì)于搜索,按被搜索的資源類

4、型,分為兩種:可以轉(zhuǎn)為文本的、多媒體類型。我們上一節(jié)提到的搜索功能都是搜索的可以轉(zhuǎn)為文本的資源(第一種)。注意,百度或谷歌提供的音樂或視頻搜索不是多媒體搜索,他們是按文件名搜索。在智能手機(jī)上有一款音樂搜索的軟件,可以讓他聽10秒鐘的音樂,然后他就能上網(wǎng)找出這段音樂的名稱、演奏者等信息。這是多媒體搜索。按搜索的方式,上一節(jié)提到的搜索功能都是不處理語義,只是找出包含指定詞的所有資源(只對(duì)詞進(jìn)行匹配)。下圖就是顯示中國的首都是哪里”這個(gè)搜索要求對(duì)應(yīng)的結(jié)果,可以看到,是沒有北京”這個(gè)結(jié)果的,結(jié)果頁面都是出現(xiàn)了這些詞的網(wǎng)頁:全文檢索(Full-TextRetrieval)是指以文本作為檢索對(duì)象,找出含有

5、指定詞匯的文本。全面、準(zhǔn)確和快速是衡量全文檢索系統(tǒng)的關(guān)鍵指標(biāo)。關(guān)于全文檢索,我們要知道:1,只處理文本。2,不處理語義。3,搜索時(shí)英文不區(qū)分大小寫。4,結(jié)果列表有相關(guān)度排序。在信息檢索工具中,全文檢索是最具通用性和實(shí)用性的。3 .學(xué)完后能做什么我們使用Lucene,主要是做站內(nèi)搜索,即對(duì)一個(gè)系統(tǒng)內(nèi)的資源進(jìn)行搜索。如BBS、BLOG中的文章搜索,網(wǎng)上商店中的商品搜索等。使用Lucene的項(xiàng)目有Eclipse、Jira等。一般不做互聯(lián)網(wǎng)中資源的搜索,因?yàn)椴灰撰@取與管理海量資源(專業(yè)搜索方向的公司除外)。所以,學(xué)完Lucene后我們就可以為自已的系統(tǒng)增加全文檢索的功能。跟這個(gè)學(xué)習(xí)內(nèi)容相關(guān)的練習(xí)為:為

6、傳智手播客貼吧”增加搜索其中的文章的功能。4 .全文檢索不同于數(shù)據(jù)庫搜索全文檢索不同于數(shù)據(jù)庫的SQL查詢。(他們所解決的問題不一樣,解決的方案也不一樣,所以不應(yīng)進(jìn)行對(duì)比)。在數(shù)據(jù)庫中的搜索就是使用SQL,如:SELECT*FROMtWHEREcontentlike,%ant%?。這樣會(huì)有如下問題:1 .匹配效果:如搜索ant會(huì)搜索出planting。這樣就會(huì)搜出很多無關(guān)的信息。2 .相關(guān)度排序:查出的結(jié)果沒有相關(guān)度排序,不知道我想要的結(jié)果在哪一頁。我們?cè)谑褂冒俣人阉鲿r(shí),一般不需要翻頁,為什么?因?yàn)榘俣茸隽讼嚓P(guān)度排序:為每一條結(jié)果打一個(gè)分?jǐn)?shù),這條結(jié)果越符合搜索條件,得分就越高,叫做相關(guān)度得分,結(jié)

7、果列表會(huì)按照這個(gè)分?jǐn)?shù)由高到低排列,所以第1頁的結(jié)果就是我們最想要的結(jié)果。3 .全文檢索的速度大大快于SQL的like搜索的速度。這是因?yàn)椴樵兎绞讲煌斐傻模圆樽值渑e例:數(shù)據(jù)庫的like就是一頁一頁的翻,一行一行的找,而全文檢索是先查目錄,得到結(jié)果所在的頁碼,再直接翻到這一頁。所以數(shù)據(jù)庫搜索不能替代全文檢索。第二部分:入門1.基礎(chǔ)概念1(HelloWorld前)全文檢索就如同ORM是一個(gè)概念。ORM的框架有很多種:Hibernate、TopLink、iBatis等,我們之前學(xué)習(xí)的是Hibernate。同樣的,全文檢索領(lǐng)域中也有多種框架,Lucene就是其中的一個(gè)用開源的全文檢索框架。Lucen

8、e的主頁為:/。本文檔中所使用的Lucene為3.0.1的版本。以下兩小節(jié)是Lucene中重要的概念。1.1. 全文檢索的工作流程如果信息檢索系統(tǒng)在用戶發(fā)出了檢索請(qǐng)求后再去互聯(lián)網(wǎng)上找答案,根本無法在有限的時(shí)間內(nèi)返回結(jié)果。所以要先把要檢索的資源集合放到本地,并使用某種特定的結(jié)構(gòu)存儲(chǔ),稱為索引,這個(gè)索引的集合稱為索引庫。由于索引庫的結(jié)構(gòu)是按照專門為快速查詢?cè)O(shè)計(jì)的,所以查詢的速度非常快。我們每次搜索都是在本地的索引庫中進(jìn)行,如下圖:搜君引整從圖片上可以看出,我們不僅要搜索,還要保證數(shù)據(jù)集合與索引庫的一致性。所以對(duì)于全文檢索功能的開發(fā),要做的有兩個(gè)方面:索

9、引庫管理(維護(hù)索引庫中的數(shù)據(jù))中進(jìn)行搜索。而Lucene就是操作索引庫的工具。、在索引庫1.2.使用Lucene的API操作索引庫LuceneAPI索引庫管理IndexWriteradd-Odelete)update.()>從索引庫中搜索IndexSearcher.,searchf,.)Lucen2的數(shù)據(jù):Document,Field索引庫是一個(gè)目錄,里面是一些二進(jìn)制文件,就如同數(shù)據(jù)庫,所有的數(shù)據(jù)也是以文件的形式存在文件系統(tǒng)中的。我們不能直接操作這些二進(jìn)制文件,而是使用Lucene提供的API完成相應(yīng)的操作,就像操作數(shù)據(jù)庫應(yīng)使用SQL語句一樣。對(duì)索引庫的操作可以分為兩種:管理與查詢。管理

10、索引庫使用IndexWAter,從索引庫中查詢使用IndexSearcher。Lucene的數(shù)據(jù)結(jié)構(gòu)為Document與Field。Document代表一條數(shù)據(jù),F(xiàn)ield代表數(shù)據(jù)中的一個(gè)屬性。一個(gè)Document中有多個(gè)Field,Field的值為String型,因?yàn)長ucene只處理文本。我們只需要把在我們的程序中的對(duì)象轉(zhuǎn)成Document,就可以交給Lucene管理了,搜索的結(jié)果中的數(shù)據(jù)列表也是Document的集合。有了這些概念,可以寫HelloWorld了,其他的概念可以在寫完HelloWorld后再進(jìn)行說明。2.基礎(chǔ)概念2(HelloWorld后)2.1. 索引庫結(jié)構(gòu)一響排序索引我

11、們需要對(duì)文檔進(jìn)行預(yù)處理,建立一種便于檢索的數(shù)據(jù)結(jié)構(gòu),以此來提高信息檢索的速度,這種數(shù)據(jù)結(jié)構(gòu)就是索引。目前廣泛使用的一種索引方式是倒排序索引。倒排序索引的原理就如同查字典。要先查目錄,得到數(shù)據(jù)對(duì)應(yīng)的頁碼,在直接翻到指定的頁碼。不是在文章中找詞,而是從目錄中找詞所在的文章。匯表(目錄),在詞匯表中的每一個(gè)條記錄都是類似于詞記錄了每一個(gè)出現(xiàn)過的單詞,和單詞出現(xiàn)的地方(哪些文檔)檔的編號(hào),再直接取出相應(yīng)的文檔。索引庫這需要在索引庫中生成一個(gè)詞所在文檔的編號(hào)列表”的結(jié)構(gòu),。查詢時(shí)先查詞匯表,得到文詞匯表H63336222客W智國.傳中苜哪一文檔數(shù)據(jù)把數(shù)據(jù)轉(zhuǎn)成指定格式放到索引庫中的操作叫做建立索引。建立索

12、引時(shí),在把數(shù)據(jù)存到索引庫后,再更新詞匯表。進(jìn)行搜索時(shí),先從檢索詞匯表開始,然后找到相對(duì)應(yīng)的文檔。如果查詢中僅包含一個(gè)關(guān)鍵詞,則在詞匯表中找到該單詞,并取出他對(duì)應(yīng)的文檔就可以了。如果查詢中包含多個(gè)關(guān)鍵詞,則需要將各個(gè)單詞檢索出的記錄進(jìn)行合并再取出相應(yīng)的文檔記錄。如果詞匯表中有一個(gè)詞傳智播客”對(duì)應(yīng)的文檔編號(hào)列表為1"。現(xiàn)在又有添加了一個(gè)包含傳智播客”的文檔,則詞匯表中的傳智播客”詞后對(duì)應(yīng)的編號(hào)列表變成了1,2因?yàn)殛P(guān)鍵詞的數(shù)量受實(shí)際語言的限制,所以不用擔(dān)心詞匯表會(huì)變的很大。2.2. 索引文件的檢索與維護(hù),更新是先刪除后創(chuàng)建維護(hù)倒排索引有三個(gè)操作:添加、刪除和更新文檔。但是更新操作需要較高的

13、代價(jià)。因?yàn)槲臋n修改后(即使是很小的修改),就可能會(huì)造成文檔中的很多的關(guān)鍵詞的位置都發(fā)生了變化,這就需要頻繁的讀取和修改記錄,這種代價(jià)是相當(dāng)高的。因此,一般不進(jìn)行真正的更新操作,而是使用先刪除,再創(chuàng)建”的方式代替更新操作。2.3. 建立索引的執(zhí)行過程(Store、Index)在建立索引時(shí),先要把文檔存到索引庫中,還要更新詞匯表。如下圖:索引庫我們要做的操作LucentfiPl轉(zhuǎn)成JndexWriter-Docun?ntdilJDucijnenl:(dac!說騫文個(gè)部保郡一號(hào)個(gè)檔唯編的一內(nèi)相$的列應(yīng)的*是編.面飄明后內(nèi)說詞的1. 我們做的操作:把數(shù)據(jù)對(duì)象轉(zhuǎn)成相應(yīng)的Document,其中的屬性轉(zhuǎn)為F

14、ield。2. 我們做的操作:調(diào)用工具IndexWriter的addDocument(doc),把Document添加到索引庫中。3. Lucene做的操作:把文檔存到索引庫中,并自動(dòng)指定一個(gè)內(nèi)部編號(hào),用來唯一標(biāo)識(shí)這條數(shù)據(jù)。內(nèi)部編號(hào)類似于這條數(shù)據(jù)的地址,在索引庫內(nèi)部的數(shù)據(jù)進(jìn)行調(diào)整后,這個(gè)編號(hào)就可能會(huì)改變,同時(shí)詞匯表中引用的編號(hào)也會(huì)做相應(yīng)改變,以保證正確。但我們?nèi)绻谕饷嬉昧诉@個(gè)編號(hào),前后兩次去取,得到的可能不是同一個(gè)文檔!所以內(nèi)部編號(hào)最好只在內(nèi)部用。4. Lucene做的操作:更新詞匯表。把文本中的詞找出并放到詞匯表中,建立與文檔的對(duì)應(yīng)關(guān)系。要把哪些詞放到詞匯表中呢,也就是文本中包含哪些詞呢

15、?這就用到了一個(gè)叫做Analyzer(分詞器)的工具。他的作用是把一段文本中的詞按規(guī)則取出所包含的所有詞。對(duì)應(yīng)的是Analyzer類,這是一個(gè)抽象類,切分詞的具體規(guī)則是由子類實(shí)現(xiàn)的,所以對(duì)于不同的語言(規(guī)則),要用不同的分詞器。如下圖:Analyzer一段文本>按規(guī)則切分>其中出現(xiàn)的所有的詞在把對(duì)象的屬性轉(zhuǎn)為Field時(shí),相關(guān)代碼為:doc.add(newField("title"article.getTitle(),Store.YES,Index.ANALYZED)。第三與第四個(gè)參數(shù)的意思為:枚舉類型枚舉常量說明StoreNO/、存儲(chǔ)屬性的值YES存儲(chǔ)屬性的值

16、IndexNO不建立索引ANALYZED分詞后建立索引NOT_ANALYZED不分詞,把整個(gè)內(nèi)容作為一個(gè)詞建立索引說明:Store是影響搜索出的結(jié)果中是否有指定屬性的原始內(nèi)容。Index是影響是否可以從這個(gè)屬性中查詢(No),或是查詢時(shí)可以查其中的某些詞(ANALYZED),還是要把整個(gè)內(nèi)容作為一個(gè)詞進(jìn)行查詢(NOT_ANALYZED)。2.4. 從索引庫中搜索的執(zhí)行過程(QueryParser、TopDocs、ScoreDoc)在進(jìn)行搜索時(shí),先在詞匯表中查找,得到符合條件的文檔編號(hào)列表。再根據(jù)文檔編號(hào)真正的去取出數(shù)據(jù)(Document)。如下圖:我們要做的操作索引庫詞匯表Query查詢結(jié)果說

17、明葭只有結(jié)果信息與文檔集合口IDocument結(jié)果indexSearcher.d(£(內(nèi)部編號(hào))InuexSearcher.search(query)傳智32播客33itcast3,5,8LuceneAPI查詢1 ,把要查詢字符串轉(zhuǎn)為Query對(duì)象。這就像在Hibernate中使用HQL查詢時(shí),也要先調(diào)用Session.createQuery(hql)轉(zhuǎn)成Hibernate的Query對(duì)象一樣。把查詢字符串轉(zhuǎn)換成Query是使用QueryParser,或使用MultiFieldQueryParser。查詢字符串也要先經(jīng)過Analyzer(分詞器)。要求搜索時(shí)使用的Analyzer要與

18、建立索引時(shí)使用的Analzyer要一致,否則可能搜不出正確的結(jié)果。2 ,調(diào)用IndexSearcher.search(),進(jìn)行查詢,得到結(jié)果。此方法返回值為TopDocs,是包含結(jié)果的多個(gè)信息的一個(gè)對(duì)象。其中有totalHits代表決記錄數(shù),ScoreDoc的數(shù)組。ScoreDoc是代表一個(gè)結(jié)果的相關(guān)度得分與文檔編號(hào)等信息的對(duì)象。3 ,取出要用到的數(shù)據(jù)列表。調(diào)用IndexSearcher.doc(scoreDoc.doc)以取出指定編號(hào)對(duì)應(yīng)的Document數(shù)據(jù)。在分頁時(shí)要用到:一次只取一頁的數(shù)據(jù)。3.HelloWorld1,準(zhǔn)備場景2,添加Lucene環(huán)境3,完成功能a) 建立索引b) 從索

19、引庫中搜索要加入的jar包有:lucene-core-3.0.1.jar(核心包)contribanalyzerscommonlucene-analyzers-3.0.1.jar(分詞器)contribhighlighterlucene-highlighter-3.0.1.jar(高亮)contribmemorylucene-memory-3.0.1.jar(高亮)第三部分:深入1 .索引庫管理1.1. IndexWriter構(gòu)造方法1:IndexWriter(Directoryd,Analyzera,MaxFieldLengthmfl)構(gòu)造方法2:IndexWriter(Directoryd

20、,Analyzera,booleancreate,MaxFieldLengthmfl),第三個(gè)參數(shù)指定,true表示建立新的索引庫或覆蓋現(xiàn)有的索引庫(刪除后重建);false表示使用已有的索引庫,如果不存在,就報(bào)錯(cuò)。commit()rollback()close()1.2. 使用IndexDao封裝對(duì)索引庫的增刪改查1提出問題:所有的數(shù)據(jù)(對(duì)象),我們都要存到數(shù)據(jù)庫中。對(duì)于要進(jìn)行搜索的數(shù)據(jù),還要存到索引庫中,以供搜索。一份數(shù)據(jù)同時(shí)存到數(shù)據(jù)庫與索引庫中(格式不同),就要想辦法保證他們的狀態(tài)一致。否則,就會(huì)影響搜索結(jié)果。DbDao(sauefentiti/)delete(id)update(ent

21、ity)逑羹的數(shù)據(jù),IndexDaofsave(entitij)delete(id)update(entity)解決思路:對(duì)于上一段提出的問題:保證索引庫中與數(shù)據(jù)庫中的數(shù)據(jù)一致(只要針對(duì)要進(jìn)行搜索的數(shù)據(jù))。我們采用的方法是,在數(shù)據(jù)庫中做了相應(yīng)的操作后,在索引庫中也做相應(yīng)的操作。具體的索引庫操作,是通過調(diào)用相應(yīng)的IndexDao方法完成的。IndexDao類似于數(shù)據(jù)庫層的Dao。我們目前只關(guān)注IndexDao中的每個(gè)方法的作用(怎么用起來方便就怎么設(shè)計(jì))。現(xiàn)在不需要關(guān)心IndexDao的每個(gè)方法怎么實(shí)現(xiàn),因?yàn)槟鞘窍乱徊降氖虑椤TO(shè)計(jì)IndexDao如下:1ndexDaofuoidsaue(Obje

22、ctobj)uoiddpletp(Longid)uoidupdatp(0bjectobj)Li-t-cnLch(StingqueryNtring)IndexDao的使用:PublishAction.execute()/發(fā)表文章actionFormarticle對(duì)象articleDao.save(article);/articleIndexDao.save(article);/DeleteAction.execute()/刪除文章articleDao.delete(id);/articleIndex.delete(id);/UpdateAction.execute()/更新文章actionFor

23、marticle對(duì)象articleDao.update(article);/articleIndexDao.update(article);/保存到數(shù)據(jù)庫保存到索引庫從數(shù)據(jù)庫中刪除從索引庫中刪除更新數(shù)據(jù)庫中的相應(yīng)數(shù)據(jù)更新索引庫中的相應(yīng)數(shù)據(jù)>QueryResultsearch(StringquerpStringrintFirstResult,intmxResults)1.3. 使用工具類做對(duì)象與Document之間的相互轉(zhuǎn)換我們?cè)趹?yīng)用程序中使用對(duì)象表示數(shù)據(jù)。在數(shù)據(jù)庫中使用的是表記錄,所以存在來回轉(zhuǎn)換的問題。同樣,要索引庫中使用的是Document,也存在來回轉(zhuǎn)換的問題。如下圖:增刪改,對(duì)象

24、一表記錄><查詢;表記錄一對(duì)象表記錄增刪改:對(duì)象一DocumentDocument<搜索;Docuiwnt-A對(duì)象索引庫對(duì)于一個(gè)要進(jìn)行搜索的實(shí)體對(duì)象,我們會(huì)寫一個(gè)對(duì)應(yīng)的工具類,其中有兩個(gè)方法:DocumentObject2Document(Objectobject);/對(duì)象DocumentObjectDocument2Object(Documentdoc);/Document對(duì)象在轉(zhuǎn)換時(shí),對(duì)象中的屬性對(duì)應(yīng)Document中的Field。由于Lucene只處理文本,所有所有的屬性值在存儲(chǔ)前都要先轉(zhuǎn)成字符串。使用構(gòu)造方法:Field(Stringname,Stringvalue,

25、Storestore,Indexindex)。Store與Index都是枚舉類型。Store:指定是否把當(dāng)前屬性值的原始內(nèi)容存儲(chǔ)到索引庫中。如果存儲(chǔ)(YES),在搜索出相應(yīng)數(shù)據(jù)時(shí)這個(gè)屬性就有原始的值;如果不存儲(chǔ)(NO),得到的數(shù)據(jù)的這個(gè)屬性的值為null。Index:指定是否建立索引(詞匯表)。建立索引才能被搜索到。不可以不存儲(chǔ)也不建立索引(沒有意義)。/Store指定當(dāng)前字段的數(shù)據(jù)要不要存到索引庫中/Index指定當(dāng)前字段的數(shù)據(jù)是否可以被搜索(是否更新詞匯表)索引設(shè)置的一些建議:1)盡量減少不必要的存儲(chǔ)2)不需要檢索的內(nèi)容不要建立索引3)非文本格式需要提前轉(zhuǎn)化4)需要整體存放的內(nèi)容不要分詞N

26、umericUtils與DateTools如果屬性的類型不是字符串,則要先進(jìn)轉(zhuǎn)換:如果是數(shù)字類型,使用NumericUtils如果是日期類型,則使用DataT001s。1.4. 實(shí)現(xiàn)IndexDao中的方法:建立、刪除、更新索引索引庫的管理操作操作是通過類IndexWriter完成的。創(chuàng)建實(shí)例是使用構(gòu)造方法:IndexWriter(Directoryd,Analyzera,MaxFieldLengthmfl)。用完后要調(diào)用IndexWriter.close()方法釋放資源。1,建立索引:保存文檔到索引庫中。a)把數(shù)據(jù)轉(zhuǎn)成Document對(duì)象的形式。b)調(diào)用方法IndexWriter.addDo

27、cument(Documentdoc)2,刪除索引:刪除所有包含指定Term的文檔。a)生成用于確定要?jiǎng)h除的文檔的Termb)調(diào)用方法IndexWriter.deleteDocuments(Termterm)說明:在生成Term時(shí),一般。如果有多個(gè)文檔含有指定的Term,則都會(huì)被刪掉。3,更新索引:實(shí)際執(zhí)行的是先刪除,后創(chuàng)建的操作。(參見前面的索引文件的檢索與維護(hù))a)把要更新后的對(duì)象轉(zhuǎn)為Document對(duì)象b)生成用于確定要更新的文檔的Termc)調(diào)用方法IndexWriter.updateDocument(Termterm,Documentdoc)說明:如果有多個(gè)文檔含有指定的Term,更

28、新后就只有一條記錄(刪掉所有,再創(chuàng)建一個(gè))。如果沒有文檔含有指定的記錄,不會(huì)報(bào)錯(cuò),更新后有一條(新創(chuàng)建的)記錄。1.5. 索引庫文件優(yōu)化3.1.1. 合并索引庫文件IndexWriter.optimize()indexWriter.setMergeFactor(int)3.1.2. 使用RAMDirectoryLucene的API接口設(shè)計(jì)的比較通用,輸入輸出結(jié)構(gòu)都很像數(shù)據(jù)庫的表=>記錄=>字段,所以很多傳統(tǒng)的應(yīng)用的文件、數(shù)據(jù)庫等都可以比較方便的映射到Lucene的存儲(chǔ)結(jié)構(gòu)/接口中。總體上看:可以先把Lucene當(dāng)成一個(gè)支持全文索引的數(shù)據(jù)庫系統(tǒng)。Lucene的索引存儲(chǔ)位置使用的是一個(gè)

29、接口(抽象類),也就可以實(shí)現(xiàn)各種各樣的實(shí)際存儲(chǔ)方式(實(shí)現(xiàn)類、子類),比如存到文件系統(tǒng)中,存在內(nèi)存中、存在數(shù)據(jù)庫中等等。Lucene提供了兩個(gè)子類:FSDirectory與RAMDirectory。1, FSDirectory:在文件系統(tǒng)中,是真實(shí)的文件夾與文件。2, RAMDirectory:在內(nèi)存中,是模擬的文件夾與文件。與FSDirectory相比:1因?yàn)闆]有IO操作,所以速度快。2,因?yàn)樵趦?nèi)存中,所以在程序退出后索引庫數(shù)據(jù)就不存在了。索引庫的相關(guān)操作:1 ,合并索引庫:Directory.addIndexes()2 ,索引的優(yōu)化:IndexWriter.optimize()看看Compa

30、ss中的Directory的子類,怎么存到數(shù)據(jù)庫中的。2.在索引庫中搜索(查詢語法與Query對(duì)象)2.1. IndexSearcher在索引庫中進(jìn)行搜索是使用類IndexSearcher。創(chuàng)建其實(shí)例的構(gòu)造方法為:IndexSearcher(Directorypath)。用完后要調(diào)用IndexSearcher.close()方法釋放資源。2.2. 通過QueryParser解析用戶的查詢字符串進(jìn)行搜索1 ,QueryParser與MultiFieldQueryParser查詢分析器,處理用戶輸入的查詢條件。把用戶輸入的非格式化檢索詞轉(zhuǎn)化成后臺(tái)檢索可以理解的Query對(duì)象。使用的構(gòu)造方法為:Qu

31、eryParser(VersionmatchVersion,Stringf,Analyzera)2,MultiFieldQueryParser是QueryParser的子類。與父類相比,MultiFieldQueryParser可以在多個(gè)屬性中搜索。使用的構(gòu)造方法為:MultiFieldQueryParser(VersionmatchVersion,Stringfields,Analyzeranalyzer)2.3. 通過構(gòu)建各種Query對(duì)象進(jìn)行查詢(Query的子類)Query:抽象類,必須通過一系列子類來表述檢索的具體需求。TermQuery關(guān)鍵詞查詢NumericRangeQuery范

32、圍查詢。使用靜態(tài)方法構(gòu)造實(shí)例:newIntRange(finalStringfield,finalbooleanmaxInclusive)finalbooleanmaxInclusive)finalbooleanmaxInclusive)finalbooleanmaxInclusive)Integermin,Integermax,finalbooleanminInclusive,newLongRange(finalStringfield,Longmin,Longmax,finalbooleanminInclusive,newFloatRange(finalStringfield,Floatmi

33、n,Floatmax,finalbooleanminInclusive,newDoubleRange(finalStringfield,Doublemin,Doublemax,finalbooleanminInclusive,WildcardQuery通配符查詢PhraseQuery短語查詢publicvoidadd(Termterm,intposition)publicvoidsetSlop(ints)lucene”,1);教程”,3);例:add(newTerm("name"add(newTerm("name',代表搜索的是“Lucene?教程”,?表

34、示中間隔一個(gè)詞。setSlop(2);代表這兩個(gè)詞中間可以最多隔2個(gè)詞BooleanQuerypublicvoidadd(Queryquery,Occuroccur)Occur用于表示布爾查詢子句關(guān)系的類,包括:Occur.MUST,Occur.MUST_NOT,Occur.SHOULD。1, ,MUST和MUST:取得連個(gè)查詢子句的交集。2, MUST和MUST_NOT:包含MUST并且查詢結(jié)果中不包含MUST_NOT的檢索結(jié)果。3, SHOULD與SHOULD,表示或“關(guān)系,最終檢索結(jié)果為所有檢索子句的并集。使用時(shí)注意:1 ,單獨(dú)使用MUST_NOT:無意義,檢索無結(jié)果。(也不報(bào)錯(cuò))2 ,

35、MUST_NOT和MUST_NOT:無意義,檢索無結(jié)果。(也不報(bào)錯(cuò))3,單獨(dú)使用SHOULD:結(jié)果相當(dāng)于MUST。4, SHOULD和MUST_NOT:此時(shí)SHOULD相當(dāng)于MUST,結(jié)果同MUST和MUST_NOT。5, MUST和SHOULD:此時(shí)SHOULD無意義,結(jié)果為MUST子句的檢索結(jié)果。/關(guān)鍵詞查詢TestpublicvoidtestTermQuery()/范圍查詢TestpublicvoidtestRangeQuery()/通配符查詢TestpublicvoidtestWildcardQuery()/短語查詢TestpublicvoidtestPhraseQuery()/布爾查

36、詢TestpublicvoidtestBooleanQuery()1.4. 支持分頁3 .排序(相關(guān)度排序與自定義排序)通過改變文檔Boost值來改變排序結(jié)果。Boost是指索引建立過程中,給整篇文檔或者文檔的某一特定屬性設(shè)定的權(quán)值因子,在4索時(shí),優(yōu)先返回分?jǐn)?shù)高的。通過Document對(duì)象的setBoost()方法和Field對(duì)象的setBoost()方法,可以分別為Document和Field指定Boost參數(shù)。不同在于前者對(duì)文檔中每一個(gè)域都修改了參數(shù),而后者只針對(duì)指定域進(jìn)行修改。默認(rèn)情值為1F,一般不做修改。使用Sort對(duì)象定制排序。Sort支持的排序功能以文檔當(dāng)中的域?yàn)閱挝唬ㄟ^這種方法

37、,可以實(shí)現(xiàn)一個(gè)或者多個(gè)不同域的多形式的值排序。時(shí)間類型的屬性采用STRING常量。3.1. 按相關(guān)度排序1,相關(guān)度得分是在查詢時(shí)根據(jù)查詢條件實(shí)進(jìn)計(jì)算出來的2,如果索引庫據(jù)不變,查詢條件不變,查出的文檔得分也不變3.2. 按指定的字段排序IfyouwanttobeabletosortresultsbyaFieldvalue,youmustadditasaFieldthatisindexedbutnotanalyzed,usingField.Index.NOT_ANALYZED.4 .過濾(Filter)使用Filter可以對(duì)搜索結(jié)果進(jìn)行過濾以獲得更小范圍的結(jié)果。使用Filter對(duì)性能的影響很大(

38、有可能會(huì)使查詢慢上百倍)。使用NumericRangeFilter。也可使用相應(yīng)的查詢實(shí)現(xiàn)一樣的效果。5 .高亮(Highlight)需要的jar包為:contribhighlighterlucene-highlighter-3.0.1.jarcontribmemorylucene-memory-3.0.1.jar/生成tWj鳧器Formatterformatter=newSimpleHTMLFormatter("<spanclass='kw'>","</span>");Scorerscorer=newQueryS

39、corer(query);Highlighterhighlighter=newHighlighter(formatter,scorer);highlighter.setTextFragmenter(newSimpleFragmenter(20);/使用高亮器:對(duì)content屬性值進(jìn)行摘要并高亮Stringtext=highlighter.getBestFragment(LuceneUtils.getAnalyzer(),"content",doc.get("content");/如果進(jìn)行高亮的屬性值中沒有要搜索的關(guān)鍵字,則返回nullif(text!=

40、null)doc.getField("content").setValue(text);6. Analyzer(分詞器:結(jié)構(gòu)與常用的中文分詞器)6.1. 分詞器結(jié)構(gòu)創(chuàng)建索引與進(jìn)行搜索要使用同一個(gè)分詞器。分詞器的一般工作流程:1,切分關(guān)鍵詞2,去除停用詞3,對(duì)于英文單詞,一般要還做:英文單詞的所有字母轉(zhuǎn)為小寫說明:形態(tài)還原,是去除單詞詞尾的形態(tài)變化,將其還原為詞的原形。這樣做可以搜索出更多有意義的結(jié)果。如搜索sutdent時(shí),也可以搜索出students,這是很有用的。6.2. 停用詞有些詞在文本中出現(xiàn)的頻率非常高,但是對(duì)文本所攜帶的信息基本不產(chǎn)生影響,例如英文的、an、the、of",或中文的的、了、著”,以及各種標(biāo)點(diǎn)符號(hào)等,這樣的詞稱為停用,(stopword)。文本經(jīng)過分詞之后,停用詞通常被過濾掉,不會(huì)被進(jìn)行索引。在檢索的時(shí)候,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論