1. 什么是lucene
Apache Lucene是一個(gè)開放源程序的搜尋器引擎,利用它可以輕易地為Java軟件加入全文搜尋功能。Lucene的最主要工作是替文件的每一個(gè)字作索引,索引讓搜尋的效率比傳統(tǒng)的逐字比較大大提高,Lucen提供一組解讀,過濾,分析文件,編排和使用索引的API,它的強(qiáng)大之處除了高效和簡單外,是最重要的是使使用者可以隨時(shí)應(yīng)自已需要自訂其功能。 Lucene是apache軟件基金會項(xiàng)目組的一個(gè)子項(xiàng)目,是一個(gè)開放源代碼的全文檢索引擎工具包,即它不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟件開發(fā)人員提供一個(gè)簡單易用的工具包,以方便的在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎。
2. Lucene能做什么
Lucene使你可以為你的應(yīng)用程序添加索引和搜索能力。Lucene可以索引并能使得可以轉(zhuǎn)換成文本格式的任何數(shù)據(jù)能夠被搜索。Lucene并不關(guān)心數(shù)據(jù)的來源、格式甚至它的語言,只要你能將它轉(zhuǎn)換為文本。這就意味著你可經(jīng)索引并搜索存放于文件中的數(shù)據(jù):在遠(yuǎn)程服務(wù)器上的web頁面,存于本地文件系統(tǒng)的文檔,簡單的文本文件,微軟Word文檔,HTML或PDF文件或任何其它能夠提取出文本信息的格式。
同樣,利用Lucene你可以索引存放于數(shù)據(jù)庫中的數(shù)據(jù),提供給用戶很多數(shù)據(jù)庫沒有提供的全文搜索的能力。一旦你集成了Lucene,你的應(yīng)用程序的用戶就能夠像這樣來搜索:+George +Rice –eat –pudding, Apple –pie +Tiger, animal:monkey AND food:banana等等。利用Lucene,你可以索引和搜索email郵件,郵件列表檔案,即時(shí)聊天記錄,你的Wiki頁面……等等更多。
3. Lucene的優(yōu)點(diǎn)
(1)索引文件格式獨(dú)立于應(yīng)用平臺。Lucene定義了一套以8位字節(jié)為基礎(chǔ)的索引文件格式,使得兼容系統(tǒng)或者不同平臺的應(yīng)用能夠共享建立的索引文件。
(2)在傳統(tǒng)全文檢索引擎的倒排索引的基礎(chǔ)上,實(shí)現(xiàn)了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然后通過與原有索引的合并,達(dá)到優(yōu)化的目的。Lucene提供了索引的擴(kuò)展機(jī)制,因此索引可以動(dòng)態(tài)擴(kuò)展。
(4)設(shè)計(jì)了獨(dú)立于語言和文件格式的文本分析接口,索引器通過接受Token流完成索引文件的創(chuàng)立,用戶擴(kuò)展新的語言和文件格式,只需要實(shí)現(xiàn)文本分析的接口。
(5)已經(jīng)默認(rèn)實(shí)現(xiàn)了一套強(qiáng)大的查詢引擎,用戶無需自己編寫代碼即使系統(tǒng)可獲得強(qiáng)大的查詢能力,Lucene的查詢實(shí)現(xiàn)中默認(rèn)實(shí)現(xiàn)了布爾操作、模糊查詢、分組查詢等等。
(6)搜索過程優(yōu)化。Lucene面向全文檢索的優(yōu)化在于首次索引檢索后,并不把所有的記錄(Document)具體內(nèi)容讀取出來,而起只將所有結(jié)果中匹配度最高的頭100條結(jié)果(TopDocs)的ID放到結(jié)果集緩存中并返回。
(7)Lucene的另外一個(gè)特點(diǎn)是在收集結(jié)果的過程中將匹配度低的結(jié)果自動(dòng)過濾掉了。這也是和數(shù)據(jù)庫應(yīng)用需要將搜索的結(jié)果全部返回不同之處
4. 查詢相關(guān)
Analyzer是分析器,它的作用是把一個(gè)字符串按某種規(guī)則劃分成一個(gè)個(gè)詞語,并去除其中的無效詞語,這里說的無效詞語是指英文中的“of”、 “the”,中文中的“的”、“地”等詞語,這些詞語在文章中大量出現(xiàn),但是本身不包含什么關(guān)鍵信息,去掉有利于縮小索引文件、提高效率、提高命中率。
分詞的規(guī)則千變?nèi)f化,但目的只有一個(gè):按語義劃分。這點(diǎn)在英文中比較容易實(shí)現(xiàn),因?yàn)橛⑽谋旧砭褪且詥卧~為單位的,已經(jīng)用空格分開;而中文則必須以某種方法將連成一片的句子劃分成一個(gè)個(gè)詞語。
(1) 用通配符進(jìn)行搜索
單個(gè)任意字符匹配的是所有可能單個(gè)字符。例如,搜索"text或者"test",可以這樣:te?t
多個(gè)任意字符匹配的是0個(gè)及更多個(gè)可能字符。例如,搜索test, tests 或者 tester,可以這樣:test*
您也可以在字符竄中間使用多個(gè)任意字符通配符。te*t
注意:您不能在搜索的項(xiàng)開始使用*或者?符號。
(2) 模糊查詢
Lucene支持基于Levenshtein Distance與Edit Distance算法的模糊搜索。要使用模糊搜索只需要在單獨(dú)項(xiàng)的最后加上符號"~"。例如搜索拼寫類似于"roam"的項(xiàng)這樣寫:roam~
這次搜索將找到形如foam和roams的單詞。
注意:使用模糊查詢將自動(dòng)得到增量因子(boost factor)為0.2的搜索結(jié)果.
(3) 布爾操作符
布爾操作符可將項(xiàng)通過邏輯操作連接起來。Lucene支持AND, "+", OR, NOT 和 "-"這些操作符。(注意:布爾操作符必須全部大寫)
(4) 轉(zhuǎn)義特殊字符
Lucene支持轉(zhuǎn)義特殊字符,因?yàn)樘厥庾址遣樵冋Z法用到的。現(xiàn)在,特殊字符包括
+ - && || ! ( ) { } [ ] ^ " ~ * ? : "
轉(zhuǎn)義特殊字符只需在字符前加上符號",例如搜索(1+1):2,使用查詢
"(1"+1")":2
5. 一些使用經(jīng)驗(yàn)
(1) 關(guān)鍵詞區(qū)分大小寫
OR AND TO等關(guān)鍵詞是區(qū)分大小寫的,lucene只認(rèn)大寫的,小寫的當(dāng)做普通單詞。
(2) 讀寫互斥性
同一時(shí)刻只能有一個(gè)對索引的寫操作,在寫的同時(shí)可以進(jìn)行搜索。
(3) 文件鎖
在寫索引的過程中強(qiáng)行退出將在tmp目錄留下一個(gè)lock文件,使以后的寫操作無法進(jìn)行,可以將其手工刪除。
(4) 時(shí)間格式
lucene只支持一種時(shí)間格式yyMMddHHmmss,所以你傳一個(gè)yy-MM-dd HH:mm:ss的時(shí)間給lucene它是不會當(dāng)作時(shí)間來處理的。
(5) 索引更新
lucene不支持索引更新,必須是先刪除再新建索引,如果數(shù)據(jù)量很大且更新快則相當(dāng)麻煩,本身建立索引是個(gè)漫長的過程,同時(shí)相當(dāng)耗內(nèi)存且很傷disk,不能實(shí)時(shí)的滿足查詢。
(6) 中間取索引
lucene不支持從中間取索引。例如:用戶取第十頁,lucene需要把前面所有的內(nèi)容都要檢索出,然后所有的排序,過濾掉前面的然后返回。
(7) 英文查詢
若查詢英文,比如有一句話:jiangxi strong 如果你輸入jiang或者stron等不完整的一個(gè)詞,將不能查詢出結(jié)果,當(dāng)你輸入jiangxi或者strong才能查詢出結(jié)果。