lucene3.0 2010-06-15 15:37:43 閱讀79 評論0字號:大中小
一、 概述
Lucene3.0(以下簡(jiǎn)稱(chēng)3.0)已于2009-11-25發(fā)布,3.0版本是重大的版本,改動(dòng)很大。在A(yíng)PI上做了很多的調整,已經(jīng)刪除了很多之前廢棄的方法以及類(lèi),并支持了很多Java5 的新特性:包括泛型、可變參數、枚舉和autoboxing等。
因此,此版本和2.x版本不能兼容,如要使用3.0版本,最好是在新項目中去使用,而不是去升級2.x或之前的版本!
二、3.0的變化
1、2.9版本介紹:
由于新版本變動(dòng)很大,官方是不推薦從舊版本升級到新版本的。因為改動(dòng)會(huì )很大。
其實(shí)在2.9版本時(shí)改動(dòng)就很大,因為2.9版本就是為3.0做準備的,但是為了向下兼容,2.9并沒(méi)有拋棄之前的舊方法,所以可以直接向下兼容。2.9版本主要是在性能方面的優(yōu)化,包括在Lucene對Lucene底層的內部結構改進(jìn)、索引的管理方式等多個(gè)方面。
1.1、索引文件改進(jìn)
Lucene的索引數據是存放在獨立的文件中的,這些文件就是存儲著(zhù)索引數據庫一些列分離的“片段”。當我們想索引中增加文檔時(shí),便會(huì )不斷的創(chuàng )建一些可以合并的新片段,因為讀寫(xiě)文件的開(kāi)銷(xiāo)比較大,因此這些字段信息Lucene并非每次都直接加到索引文件里面去,而是先緩存,等到一定量的時(shí)候再一次寫(xiě)到文件中。在2.9以后,Lucene會(huì )為每個(gè)片段分別管理FieldCache以此避開(kāi)跨片段加載FieldCatch的需求,這樣就解決了Lucene跨片段加載FieldCatch的效率很低下問(wèn)題,這個(gè)改動(dòng)大為提高了性能。Lucid Imagination的Mark Miller運行了一個(gè)簡(jiǎn)單的性能測試,表明在5,000,000個(gè)不同字符串下的情況下,Lucene 相對于2.4版本會(huì )獲得15倍左右的性能提高:
Lucene 2.4: 150.726s
Lucene 2.9: 9.695s
1.2 重開(kāi)搜索
新版本引入了IndexWriter.getReader()方法,它可用于搜索目前完整的索引,包括當前IndexWriter會(huì )話(huà)中還沒(méi)有提交的改變,這帶來(lái)了接近于實(shí)時(shí)搜索的能力。此外,你還可以調用IndexWriter.setMergedSegmentWarmer()方法進(jìn)行“預熱”,這樣那些片斷便可以立即投入使用了。
1.3、數字處理
2.9版本之前的版本,都是基于文本搜索的,因為對于很多數字的處理方式就很頭疼,例如在我們項目中遇到的很多問(wèn)題都是由于把數字當作了文本處理出現的BUG:
1、搜索價(jià)格的5,把包含.5的也搜索出來(lái)了;
2、排序(降序)時(shí),把800排到5000前面;
……
這些都是由于Lucene把所有的都作為文本處理的方式造成的問(wèn)題。Lucene 2.9以后已經(jīng)自帶對數字的處理方式。Field和Query類(lèi)會(huì )采取合適的精度進(jìn)行索引和搜索,這樣大大降低了需要搜索的關(guān)鍵字數量,使查詢(xún)的響應能力得以顯著(zhù)提高。
1.4 其他優(yōu)化
引入了新的查詢(xún)類(lèi)型和適用性更廣的多關(guān)鍵字查詢(xún)(通配、前綴等等)方式,以及新的針對波斯語(yǔ),阿拉伯語(yǔ)及中文的分析器。此外,這次更新還包括更好Unicode支持,一個(gè)新的查詢(xún)分析框架,以及對地理位置的查詢(xún),它允許根據距離信息對文檔進(jìn)行過(guò)濾和排序(如“找出我家5公里范圍內的所有超市”)。
2、2.9版本和3.0比較
雖然2.9是為3.0做準備的一個(gè)版本,但是3.0和2.9相比較,變化還是比較大的,這處要體現在:
1、3.0拋棄了在2.9聲明廢棄的方法,因此3.0無(wú)法向下兼容;
2、3.0放棄了對Java1.4的支持,改為對高版本Java1.5和ant 1.7.0支持;
3、其他內核的一些變化,如oalLock.isLocked()現在會(huì )拋出IOException異常,對于一些靜態(tài)變量的改變等。
3、主要方法的改變
這里這種講下目前新版本后使用建立索引以及搜索的不同。
3.1、建立索引
新版本在建立索引時(shí)拋棄了很多未用的方法,見(jiàn)下圖,所有聲明被拋棄的IndexWriter構造函數都在3.0中被刪除。

3.0版本的IndexWriter構造函數:

在增加索引時(shí),每個(gè)field的常量也有改變,具體如下:
3.0和之前版本的常量修改

3.2、查詢(xún)
刪除了Hits類(lèi),增加了TopScoreDocCollector去取得“Hits”,實(shí)際上在3.0給了個(gè)新命名:collector。使用方式和hits類(lèi)同,同時(shí)刪除了Search以及QueryParser的幾個(gè)構造方法,QueryParser刪除了 QueryParser(String f, Analyzer a)構造方法。
新查詢(xún)例子如下(藍色部分是與以往不同的部分):
view plaincopy to clipboardprint?

3.0版本的Search構造方法:

3.0前的構造方法:

三、總體圖
3.0版本的結構和之前的版本(2.9之前)相比,在程序結構上表現出來(lái)就只是多了一個(gè)message包,用來(lái)專(zhuān)門(mén)處理國際化。

見(jiàn)上圖,可以看到,3.0和之前的版本一樣還是由對外接口、索引核心以及基礎結構封裝三大部分共八個(gè)模塊(也即包package),詳細介紹詳見(jiàn)附件一。
我們從上圖也可以看到Lucene搜索時(shí)的調用關(guān)系:當我們要查詢(xún)一個(gè)詞時(shí),在查詢(xún)模塊(search)會(huì )先調用語(yǔ)法分析器(queryParser)對查詢(xún)語(yǔ)句進(jìn)行分析,語(yǔ)法分析模塊調用了詞法分析器(analysis)進(jìn)行詞法分析,如對搜索關(guān)鍵字分詞、過(guò)濾等,詞法分析器在使用時(shí)會(huì )根據實(shí)際情況調用國際化模塊(message)進(jìn)行一些國際化的處理。當這些前置工作做完之后,才真正進(jìn)入到搜索核心,首先會(huì )調用索引模塊(index),它負責向底層的存儲類(lèi)(store)去讀取索引文件里面的數據,然后返回給查詢(xún)模塊。其他模塊在整個(gè)搜索過(guò)程中是作為公共類(lèi)存在的。
附件一、 Lucnen3.0包詳細介紹
1、analysis
Analysis包含一些內建的分析器,例如按空白字符分詞的WhitespaceAnalyzer,添加了stopwrod過(guò)濾的StopAnalyzer,最常用的是StandardAnalyzer。
2、document
Document包含文檔的數據結構,例如Document類(lèi)定義了存儲文檔的數據結構,Field類(lèi)定義了Document的一個(gè)域。
3、index
Index包含了索引的讀寫(xiě)類(lèi),例如對索引文件的segment進(jìn)行寫(xiě)、合并、優(yōu)化的IndexWriter類(lèi)和對索引進(jìn)行讀取和刪除操作的 IndexReader類(lèi),這里要注意的是不要被IndexReader這個(gè)名字誤導,以為它是索引文件的讀取類(lèi),實(shí)際上刪除索引也是由它完成, IndexWriter只關(guān)心如何將索引寫(xiě)入一個(gè)個(gè)segment,并將它們合并優(yōu)化;IndexReader則關(guān)注索引文件中各個(gè)文檔的組織形式。
4、queryParser
QueryParser包含了解析查詢(xún)語(yǔ)句的類(lèi),lucene的查詢(xún)語(yǔ)句和sql語(yǔ)句有點(diǎn)類(lèi)似,有各種保留字,按照一定的語(yǔ)法可以組成各種查詢(xún)。 Lucene有很多種Query類(lèi),它們都繼承自Query,執行各種特殊的查詢(xún),QueryParser的作用就是解析查詢(xún)語(yǔ)句,按順序調用各種 Query類(lèi)查找出結果。
5、search
Search包含了從索引中搜索結果的各種類(lèi),例如剛才說(shuō)的各種Query類(lèi),包括TermQuery、BooleanQuery等就在這個(gè)包里。
6、store
Store包含了索引的存儲類(lèi),例如Directory定義了索引文件的存儲結構,FSDirectory為存儲在文件中的索引,RAMDirectory為存儲在內存中的索引,MmapDirectory為使用內存映射的索引。
7、util
Util包含一些公共工具類(lèi),例如時(shí)間和字符串之間的轉換工具。
8、message
處理國際化的類(lèi)。
附件二、Lucene相關(guān)名詞解釋?zhuān)ú糠郑?br style="LINE-HEIGHT: 22px">
1、IndexWriter
lucene中最重要的的類(lèi)之一,它主要是用來(lái)將文檔加入索引,同時(shí)控制索引過(guò)程中的一些參數使用。
2、Analyzer
分析器,主要用于分析搜索引擎遇到的各種文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。
3、Directory
索引存放的位置;lucene提供了兩種索引存放的位置,一種是磁盤(pán),一種是內存。一般情況將索引放在磁盤(pán)上;相應地lucene提供了FSDirectory和RAMDirectory兩個(gè)類(lèi)。
4、Document
文檔;Document相當于一個(gè)要進(jìn)行索引的單元,任何可以想要被索引的文件都必須轉化為Document對象才能進(jìn)行索引。
5、Field
字段。
6、IndexSearcher
是lucene中最基本的檢索工具,所有的檢索都會(huì )用到IndexSearcher工具;
7、Query
查詢(xún),lucene中支持模糊查詢(xún),語(yǔ)義查詢(xún),短語(yǔ)查詢(xún),組合查詢(xún)等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些類(lèi)。
8、QueryParser
是一個(gè)解析用戶(hù)輸入的工具,可以通過(guò)掃描用戶(hù)輸入的字符串,生成Query對象。
9、Hits
在搜索完成之后,需要把搜索結果返回并顯示給用戶(hù),只有這樣才算是完成搜索的目的。在lucene中,搜索的結果的集合是用Hits類(lèi)的實(shí)例來(lái)表示的
聯(lián)系客服
微信登錄中...
請勿關(guān)閉此頁(yè)面
