【monner題外寄語】lucene的確是個(gè)好東西!如果你有時(shí)間,我強(qiáng)烈推薦你學(xué)習(xí)下!
這幾天,有個(gè)朋友問我如何學(xué)習(xí)編程,我都不知道怎么回答,哈哈,閑聊幾句先:如果你想學(xué)習(xí)一門計(jì)算機(jī)語言,比如java語言,我覺得你沒有必要整天保證那些經(jīng)典書籍啃來啃去,死記硬背基本語法和規(guī)則,拼命理解面向?qū)ο缶幊趟枷?,這些過程其實(shí)很累很枯燥,我見多了很多初學(xué)者抱著大部頭書籍看呀看,到處收集編程入門,代碼技巧等知識(shí),哈哈~真的很累!更有甚者,為了權(quán)衡一門語言孰優(yōu)孰劣,竟然花幾年時(shí)間都不能確定自己的目標(biāo)。什么匯編無用,VB好用、.NET好、JAVA壞,還有什么win平臺(tái)漏洞多,Unix平臺(tái)穩(wěn)定之類的等等~~發(fā)現(xiàn)論壇上初學(xué)者板塊這種話題特別熱特別受歡迎!覺得好可悲,計(jì)算機(jī)語言其實(shí)是一通百通的,你學(xué)任何一門如果學(xué)到極致,想轉(zhuǎn)而學(xué)習(xí)其他語言簡直就是小兒科!其實(shí)如果想學(xué)好一門計(jì)算機(jī)語言,你一定一開始就不要畏懼它,我敢說,計(jì)算機(jī)語言比起我們漢語來,要簡單100倍,你漢語會(huì)說會(huì)寫文章,你就一定可以,甚者你不會(huì)說都不要緊,只要你會(huì)思想,你會(huì)表達(dá)自己的需要,你會(huì)把別人的需要用自己的想法表達(dá)重述出來,你就一定可以學(xué)會(huì)計(jì)算機(jī)開發(fā)?。。?何謂計(jì)算機(jī)語言編程?一言以蔽之:編程就是翻譯過程,把你的需求用計(jì)算機(jī)語言翻譯出來!只要你講得清楚需求,理論上就一定可以用計(jì)算機(jī)語言編程實(shí)現(xiàn)!只是各種計(jì)算機(jī)語言的表達(dá)方式不同! 我敢說,一但你在思想上認(rèn)識(shí)到這一點(diǎn),并從心底深處開始不要畏懼編程,哪么你可以很快的進(jìn)入翻譯狀態(tài)的?。?! 編程就是一種邏輯思維用規(guī)則的語言表述而已!學(xué)習(xí)編程語言的基礎(chǔ)語法知識(shí)只是在熟悉規(guī)則而已,規(guī)則多少不重要,關(guān)鍵是應(yīng)用規(guī)則為你帶來便利,甚者你玩潛規(guī)則,玩規(guī)則漏洞都行,做人做事和編程開發(fā)如出一轍!
哈哈~跑題了,言歸正傳吧。希望我收集整理來的基礎(chǔ)知識(shí)可以讓你學(xué)習(xí)lucene的歷程加速!大多數(shù)資料都來自網(wǎng)絡(luò),我的原創(chuàng)很少,因?yàn)槭占闵?,不一一注明原作者(其?shí)主要作者是車東 車東是國內(nèi)研究lucene搜索引擎的先驅(qū)者,lucene中一些關(guān)于中文處理的代碼就是他寫的,已經(jīng)正式收錄到lucene核心代碼中了),在此一并聲明對(duì)原作者的感謝感謝感謝!版權(quán)都屬于你們,俺是給你們打工做苦力的。
======================================================================
【摘錄收集】
------------------------------------------------------------------------------------------------------------------------------
一、Lucene點(diǎn)滴: (發(fā)音為['lusen]),我經(jīng)常就讀鹿神,是頭活蹦亂跳的好鹿,研究它吧,保證感覺它很神!lucene是一個(gè)非常優(yōu)秀的開源的全文搜索引擎,我們可以在它的上面開發(fā)出各種全文搜索的應(yīng)用來。Lucene在國外有很高的知名度,現(xiàn)在已經(jīng)是Apache的頂級(jí)項(xiàng)目。
二、倒排索引原理簡述:Lucene是一個(gè)高性能的java全文檢索工具包,它使用的是倒排文件索引結(jié)構(gòu)。
具體解釋算法理論就不講了,直接用例子來說明吧,如果你認(rèn)真仔細(xì)的讀懂例子,真正領(lǐng)會(huì)了其中的思想,你肯定就明白了lucene索引的基本原理!記?。豪斫猓“牙佑媚阕约旱恼Z言表述出來,就是翻譯成你自己的東西,以后你想自己寫,也就是換成計(jì)算機(jī)語言再翻譯一次??!
lucene結(jié)構(gòu)及相應(yīng)的生成算法如下:
我們?cè)O(shè)有兩篇文章1和2
文章1的內(nèi)容為:Tom lives in Guangzhou,I live in Guangzhou too.
文章2的內(nèi)容為:He once lived in Shanghai.
1)全文分析:由于lucene是基于關(guān)鍵詞索引和查詢的,首先我們要取得這兩篇文章的關(guān)鍵詞,通常我們需要如下處理措施
a.我們現(xiàn)在有的是文章內(nèi)容,即一大串字符串,我們先要找出全文字符串中的所有單詞,即分詞。英文單詞由于用空格分隔,比較好處理。中文單詞間是連在一起的需要特殊的分詞處理。(中文通常用詞典的方式比較準(zhǔn)確)
b.文章中的”in”, “once” “too”等詞沒有什么實(shí)際意義,中文中的“的”“是”等字通常也無具體含義,這些不代表概念的詞可以過濾掉,即分詞解析中的過濾
c.用戶通常希望查“He”時(shí)能把含“he”,“HE”的文章也找出來,所以所有單詞需要統(tǒng)一大小寫。即解析過程中的額外處理(用戶可以根據(jù)自己需要增加多重處理)。
d.用戶通常希望查“l(fā)ive”時(shí)能把含“l(fā)ives”,“l(fā)ived”的文章也找出來,所以需要把“l(fā)ives”,“l(fā)ived”還原成“l(fā)ive”即進(jìn)一步優(yōu)化處理(可以更人性更友好)
e.文章中的標(biāo)點(diǎn)符號(hào)通常不表示某種概念,也可以過濾掉
所有上面描述的步驟在lucene中都由Analyzer類完成!你了解了過程,你就可以根據(jù)自己的興趣或者需要去關(guān)心特點(diǎn)的步驟相關(guān)代碼,或者自己進(jìn)一步添磚加瓦擴(kuò)展功能。
經(jīng)過上面處理后
文章1的所有關(guān)鍵詞為:[tom] [live] [guangzhou] [i] [live] [guangzhou]
文章2的所有關(guān)鍵詞為:[he] [live] [shanghai]
2)倒排索引:有了關(guān)鍵詞后,我們就可以建立倒排索引了。
上面經(jīng)過解析后的對(duì)應(yīng)關(guān)系是:“文章號(hào)”對(duì)“文章中所有關(guān)鍵詞”。
這種對(duì)應(yīng)比較符合我們正常的思維習(xí)慣,反過來對(duì)應(yīng)的話,就要顛倒思維,所以這種算法叫做倒排! 倒排索引把這個(gè)關(guān)系倒過來,變成:“關(guān)鍵詞”對(duì)“擁有該關(guān)鍵詞的所有文章號(hào)”。文章1,2經(jīng)過倒排后變成
關(guān)鍵詞 文章號(hào)
guangzhou 1
he 2
i 1
live 1,2
shanghai 2
tom 1
進(jìn)一步擴(kuò)展上述基本倒排索引,通常我們僅知道關(guān)鍵詞在哪些文章中出現(xiàn)還不夠,我們還需要知道關(guān)鍵詞在文章中出現(xiàn)次數(shù)和出現(xiàn)的位置,通常有兩種位置:a)字符位置,即記錄該詞是文章中第幾個(gè)字符(優(yōu)點(diǎn)是關(guān)鍵詞亮顯時(shí)定位快);b)關(guān)鍵詞位置,即記錄該詞是文章中第幾個(gè)關(guān)鍵詞(優(yōu)點(diǎn)是節(jié)約索引空間、詞組(phase)查詢快),lucene 中記錄的就是這種位置。
加上“出現(xiàn)頻率”和“出現(xiàn)位置”信息后,我們的索引結(jié)構(gòu)充實(shí)后變?yōu)椋?nbsp;
關(guān)鍵詞 | 文章號(hào) | [出現(xiàn)頻率] | 出現(xiàn)位置 |
guangzhou | 1 | [2] | 3,6 |
he | 2 | [1] | 1 |
i | 1 | [1] | 4 |
live | 1 | [2] | 2,5 |
2 | [1] | 2 | |
shanghai | 2 | [1] | 3 |
tom | 1 | [1] | 1 |
以第4行的 live 詞語索引記錄作實(shí)例我們說明一下該結(jié)構(gòu):
live在文章1中出現(xiàn)了2次,文章2中出現(xiàn)了一次,它的出現(xiàn)位置為“2,5,2”這表示什么呢?我們需要結(jié)合文章號(hào)和出現(xiàn)頻率來分析,文章1中出現(xiàn)了2次,那么“2,5”就表示live在文章1中出現(xiàn)的兩個(gè)位置,文章2中出現(xiàn)了一次,剩下的“2”就表示live是文章2中第 2個(gè)關(guān)鍵字。
以上就是lucene索引結(jié)構(gòu)中最核心的部分。是不是描述起來很簡單,沒錯(cuò),其實(shí)也就是這么簡單!算法都是人想出來的,毛主席說過 辦法總比困難多,計(jì)算機(jī)算法也不例外,你何必恐懼它呢,本來就是很容易的事情!??!
【進(jìn)一步深入探索,如果你不想深入,完全可以略過不看】
如果你對(duì)計(jì)算機(jī)算法和數(shù)據(jù)結(jié)構(gòu)稍有研究,你就很容易發(fā)現(xiàn),我們上面生成的倒排索引關(guān)鍵字是按字母字符順序排列的(lucene沒有使用B樹結(jié)構(gòu)),因此lucene可以用二元搜索算法快速定位關(guān)鍵詞。
具體實(shí)現(xiàn)時(shí) lucene將上面三列分別作為詞典文件(Term Dictionary)、頻率文件(frequencies)、位置文件(positions)保存。其中詞典文件不僅保存有每個(gè)關(guān)鍵詞,還保留了指向頻率文件和位置文件的指針,通過指針可以找到該關(guān)鍵字的頻率信息和位置信息。
Lucene中使用了field的概念,用于表達(dá)信息所在位置(如標(biāo)題中,文章中,url中),在建索引中,該field信息也記錄在詞典文件中,每個(gè)關(guān)鍵詞都有一個(gè)field信息(因?yàn)槊總€(gè)關(guān)鍵字一定屬于一個(gè)或多個(gè)field)。
為了減小索引文件的大小,Lucene對(duì)索引還使用了壓縮技術(shù)。首先,對(duì)詞典文件中的關(guān)鍵詞進(jìn)行了壓縮,關(guān)鍵詞壓縮為<前綴長度,后綴>,例如:當(dāng)前詞為“阿拉伯語”,上一個(gè)詞為“阿拉伯”,那么“阿拉伯語”壓縮為<3,語>。其次大量用到的是對(duì)數(shù)字的壓縮,數(shù)字只保存與上一個(gè)值的差值(這樣可以減小數(shù)字的長度,進(jìn)而減少保存該數(shù)字需要的字節(jié)數(shù))。例如當(dāng)前文章號(hào)是16389(不壓縮要用3個(gè)字節(jié)保存),上一文章號(hào)是16382,壓縮后保存7(只用一個(gè)字節(jié))。注意是“上一個(gè)詞”。由于詞典是按順序排列的,這種壓縮方法的效果會(huì)非常顯著。
三、全文檢索框架的實(shí)現(xiàn)機(jī)制:
Lucene的API接口設(shè)計(jì)的比較通用,輸入輸出結(jié)構(gòu)都很像數(shù)據(jù)庫的表==>記錄==>字段,所以很多傳統(tǒng)的應(yīng)用的文件、數(shù)據(jù)庫等都可以比較方便的映射到Lucene的存儲(chǔ)結(jié)構(gòu)/接口中??傮w上看:可以先把Lucene當(dāng)成一個(gè)支持全文索引的數(shù)據(jù)庫系統(tǒng)。
比較一下Lucene數(shù)據(jù)存儲(chǔ) 和 傳統(tǒng)的關(guān)系數(shù)據(jù)庫之間的區(qū)別:
Lucene | 數(shù)據(jù)庫 |
索引數(shù)據(jù)源:doc(field1,field2...) doc(field1,field2...) \ indexer / 結(jié)果輸出:Hits(doc(field1,field2) doc(field1...)) | 索引數(shù)據(jù)源:record(field1,field2...) record(field1..) \ SQL: insert/ 結(jié)果輸出:results(record(field1,field2..) record(field1...)) |
Document:一個(gè)需要進(jìn)行索引的“單元,一個(gè)Document由多個(gè)字段組成 | Record:記錄,包含多個(gè)字段 |
Field:字段 | Field:字段 |
Hits:查詢結(jié)果集,由匹配的Document組成 | RecordSet:查詢結(jié)果集,由多個(gè)Record組成 |
請(qǐng)一定記?。喝臋z索 ≠ 數(shù)據(jù)庫SQL語句中的 like "%keyword%"
由于數(shù)據(jù)庫索引不是為全文索引設(shè)計(jì)的,因此,使用like "%keyword%"時(shí),數(shù)據(jù)庫索引是不起作用的,在使用like查詢時(shí),搜索過程又變成類似于一頁頁翻書的遍歷過程了,所以對(duì)于含有模糊查詢的數(shù)據(jù)庫服務(wù)來說,LIKE對(duì)性能的危害是極大的。如果是需要對(duì)多個(gè)關(guān)鍵詞進(jìn)行模糊匹配:like"%keyword1%" and like "%keyword2%" ...其效率也就可想而知了。
通常比較厚的書籍后面常常附關(guān)鍵詞索引表(比如:北京:12, 34頁,上海:3,77頁……),它能夠幫助讀者比較快地找到相關(guān)內(nèi)容的頁碼。而數(shù)據(jù)庫索引能夠大大提高查詢的速度原理也是一樣,想像一下通過書后面的索引查找的速度要比一頁一頁地翻內(nèi)容高多少倍……而索引之所以效率高,另外一個(gè)原因是它是排好序的。對(duì)于檢索系統(tǒng)來說核心是一個(gè)排序問題。
所以建立一個(gè)高效檢索系統(tǒng)的關(guān)鍵是建立一個(gè)類似于科技索引一樣的反向索引機(jī)制,將數(shù)據(jù)源(比如多篇文章)排序順序存儲(chǔ)的同時(shí),有另外一個(gè)排好序的關(guān)鍵詞列表,用于存儲(chǔ)關(guān)鍵詞==>文章映射關(guān)系,利用這樣的映射關(guān)系索引:[關(guān)鍵詞==>出現(xiàn)關(guān)鍵詞的文章編號(hào),出現(xiàn)次數(shù)(甚至包括位置:起始偏移量,結(jié)束偏移量),出現(xiàn)頻率],檢索過程就是把模糊查詢變成多個(gè)可以利用索引的精確查詢的邏輯組合的過程。從而大大提高了多關(guān)鍵詞查詢的效率,所以,全文檢索問題歸結(jié)到最后是一個(gè)排序問題。
由此可以看出模糊查詢相對(duì)數(shù)據(jù)庫的精確查詢是一個(gè)非常不確定的問題,這也是大部分?jǐn)?shù)據(jù)庫對(duì)全文檢索支持有限的原因。
Lucene最核心的特征是通過特殊的索引結(jié)構(gòu)實(shí)現(xiàn)了傳統(tǒng)數(shù)據(jù)庫不擅長的全文索引機(jī)制,并提供了擴(kuò)展接口,以方便針對(duì)不同應(yīng)用的定制。
我們對(duì)比一下Lucene全文索引 和 關(guān)系數(shù)據(jù)庫模糊查詢 算法區(qū)別:
Lucene全文索引引擎 | 數(shù)據(jù)庫 | |
索引 | 將數(shù)據(jù)源中的數(shù)據(jù)都通過全文索引一一建立倒排索引 | 對(duì)于LIKE查詢來說,數(shù)據(jù)傳統(tǒng)的索引是根本用不上的。數(shù)據(jù)需要逐個(gè)便利記錄進(jìn)行GREP式的模糊匹配,比有索引的搜索速度要有多個(gè)數(shù)量級(jí)的下降。 |
匹配效果 | 通過詞元(term)進(jìn)行匹配,通過語言分析接口的實(shí)現(xiàn),可以實(shí)現(xiàn)對(duì)中文等非英語的支持。 | 使用:like "%net%" 會(huì)把netherlands也匹配出來, 多個(gè)關(guān)鍵詞的模糊匹配:使用like "%com%net%":就不能匹配詞序顛倒的xxx.net..xxx.com |
匹配度 | 有匹配度算法,將匹配程度(相似度)比較高的結(jié)果排在前面。 | 沒有匹配程度的控制:比如有記錄中net出現(xiàn)5詞和出現(xiàn)1次的,結(jié)果是一樣的 |
結(jié)果輸出 | 通過特別的算法,將最匹配度最高的頭100條結(jié)果輸出,結(jié)果集是緩沖式的小批量讀取的。 | 返回所有的結(jié)果集,在匹配條目非常多的時(shí)候(比如上萬條)需要大量的內(nèi)存存放這些臨時(shí)結(jié)果集。 |
可定制性 | 通過不同的語言分析接口實(shí)現(xiàn),可以方便的定制出符合應(yīng)用需要的索引規(guī)則(包括對(duì)中文的支持) | 沒有接口或接口復(fù)雜,無法定制 |
結(jié)論 | 高負(fù)載的模糊查詢應(yīng)用,需要負(fù)責(zé)的模糊查詢的規(guī)則,索引的資料量比較大 | 使用率低,模糊匹配規(guī)則簡單或者需要模糊查詢的資料量少 |
全文檢索和數(shù)據(jù)庫應(yīng)用最大的不同在于:讓最相關(guān)的頭100條結(jié)果滿足98%以上用戶的需求。
Lucene的創(chuàng)新之處:
大部分的搜索(數(shù)據(jù)庫)引擎都是用B樹結(jié)構(gòu)來維護(hù)索引,索引的更新會(huì)導(dǎo)致大量的IO操作,Lucene在實(shí)現(xiàn)中,對(duì)此稍微有所改進(jìn):不是維護(hù)一個(gè)索引文件,而是在擴(kuò)展索引的時(shí)候不斷創(chuàng)建新的索引文件,然后定期的把這些新的小索引文件合并到原先的大索引中(針對(duì)不同的更新策略,批次的大小可以調(diào)整),這樣在不影響檢索的效率的前提下,提高了索引的效率。
Lucene和其他一些全文檢索系統(tǒng)/應(yīng)用的比較:
Lucene | 其他開源全文檢索系統(tǒng) | |
增量索引和批量索引 | 可以進(jìn)行增量的索引(Append),可以對(duì)于大量數(shù)據(jù)進(jìn)行批量索引,并且接口設(shè)計(jì)用于優(yōu)化批量索引和小批量的增量索引。 | 很多系統(tǒng)只支持批量的索引,有時(shí)數(shù)據(jù)源有一點(diǎn)增加也需要重建索引。 |
數(shù)據(jù)源 | Lucene沒有定義具體的數(shù)據(jù)源,而是一個(gè)文檔的結(jié)構(gòu),因此可以非常靈活的適應(yīng)各種應(yīng)用(只要前端有合適的轉(zhuǎn)換器把數(shù)據(jù)源轉(zhuǎn)換成相應(yīng)結(jié)構(gòu))。 | 很多系統(tǒng)只針對(duì)網(wǎng)頁,缺乏其他格式文檔的靈活性。 |
索引內(nèi)容抓取 | Lucene的文檔是由多個(gè)字段組成的,甚至可以控制那些字段需要進(jìn)行索引,那些字段不需要索引,近一步索引的字段也分為需要分詞和不需要分詞的類型: 需要進(jìn)行分詞的索引,比如:標(biāo)題,文章內(nèi)容字段 不需要進(jìn)行分詞的索引,比如:作者/日期字段 | 缺乏通用性,往往將文檔整個(gè)索引了 |
語言分析 | 通過語言分析器的不同擴(kuò)展實(shí)現(xiàn): 可以過濾掉不需要的詞:an the of 等, 西文語法分析:將jumps jumped jumper都?xì)w結(jié)成jump進(jìn)行索引/檢索 非英文支持:對(duì)亞洲語言,阿拉伯語言的索引支持 | 缺乏通用接口實(shí)現(xiàn) |
查詢分析 | 通過查詢分析接口的實(shí)現(xiàn),可以定制自己的查詢語法規(guī)則: 比如: 多個(gè)關(guān)鍵詞之間的 + - and or關(guān)系等 | 功能較強(qiáng)大 |
并發(fā)訪問 | 能夠支持多用戶的使用 | 功能較強(qiáng)大 |
四、關(guān)于亞洲語言的的切分詞問題(Word Segment)
對(duì)于中文來說,全文索引首先還要解決一個(gè)語言分析的問題,對(duì)于英文來說,語句中單詞之間是天然通過空格分開的,但亞洲語言的中日韓文語句中的字是一個(gè)字挨一個(gè),所有,首先要把語句中按“詞”進(jìn)行索引的話,這個(gè)詞如何切分出來就是一個(gè)很大的問題。
首先,肯定不能用單個(gè)字符作(si-gram)為索引單元,否則查“上海”時(shí),不能讓含有“海上”也匹配。
但一句話:“北京天安門”,計(jì)算機(jī)如何按照中文的語言習(xí)慣進(jìn)行切分呢?
“北京 天安門” 還是“北 京 天安門”?讓計(jì)算機(jī)能夠按照語言習(xí)慣進(jìn)行切分,往往需要機(jī)器有一個(gè)比較豐富的詞庫才能夠比較準(zhǔn)確的識(shí)別出語句中的單詞。
另外一個(gè)解決的辦法是采用自動(dòng)切分算法:將單詞按照2元語法(bigram)方式切分出來,比如:
"北京天安門" ==> "北京 京天 天安 安門"。
這樣,在查詢的時(shí)候,無論是查詢"北京" 還是查詢"天安門",將查詢?cè)~組按同樣的規(guī)則進(jìn)行切分:"北京","天安安門",多個(gè)關(guān)鍵詞之間按與"and"的關(guān)系組合,同樣能夠正確地映射到相應(yīng)的索引中。這種方式對(duì)于其他亞洲語言:韓文,日文都是通用的。
基于自動(dòng)切分的最大優(yōu)點(diǎn)是沒有詞表維護(hù)成本,實(shí)現(xiàn)簡單,缺點(diǎn)是索引效率低,但對(duì)于中小型應(yīng)用來說,基于2元語法的切分還是夠用的?;?元切分后的索引一般大小和源文件差不多,而對(duì)于英文,索引文件一般只有原文件的30%-40%不同。
自動(dòng)切分 | 詞表切分 | |
實(shí)現(xiàn) | 實(shí)現(xiàn)非常簡單 | 實(shí)現(xiàn)復(fù)雜 |
查詢 | 增加了查詢分析的復(fù)雜程度 | 適于實(shí)現(xiàn)比較復(fù)雜的查詢語法規(guī)則 |
存儲(chǔ)效率 | 索引冗余大,索引幾乎和原文一樣大 | 索引效率高,為原文大小的30%左右 |
維護(hù)成本 | 無詞表維護(hù)成本 | 詞表維護(hù)成本非常高:中日韓等語言需要分別維護(hù)。 還需要包括詞頻統(tǒng)計(jì)等內(nèi)容 |
適用領(lǐng)域 | 嵌入式系統(tǒng):運(yùn)行環(huán)境資源有限 分布式系統(tǒng):無詞表同步問題 多語言環(huán)境:無詞表維護(hù)成本 | 對(duì)查詢和存儲(chǔ)效率要求高的專業(yè)搜索引擎 |
目前比較大的搜索引擎的語言分析算法一般是基于以上2個(gè)機(jī)制的結(jié)合。
五、Lucene的結(jié)構(gòu)框架:
注意:Lucene中的一些比較復(fù)雜的詞法分析是用JavaCC生成的(JavaCC:JavaCompilerCompiler,純Java的詞法分析生成器),所以如果從源代碼編譯或需要修改其中的QueryParser、定制自己的詞法分析器,還需要從https://javacc.dev.java.net/下載javacc。
lucene的組成結(jié)構(gòu):對(duì)于外部應(yīng)用來說索引模塊(index)和檢索模塊(search)是主要的外部應(yīng)用入口。
org.apache.Lucene.search/ | 搜索入口 |
org.apache.Lucene.index/ | 索引入口 |
org.apache.Lucene.analysis/ | 語言分析器 |
org.apache.Lucene.queryParser/ | 查詢分析器 |
org.apache.Lucene.document/ | 存儲(chǔ)結(jié)構(gòu) |
org.apache.Lucene.store/ | 底層IO/存儲(chǔ)結(jié)構(gòu) |
org.apache.Lucene.util/ | 一些公用的數(shù)據(jù)結(jié)構(gòu) |
六、從Lucene學(xué)到更多:
Luene的確是一個(gè)面對(duì)對(duì)象設(shè)計(jì)的典范。如果你要學(xué)習(xí)面向?qū)ο缶幊?,你要學(xué)習(xí)java,建議你學(xué)習(xí)lucene吧,玩一個(gè)實(shí)實(shí)在在的項(xiàng)目,而且是有名的基礎(chǔ)項(xiàng)目,在無形之中你既可以學(xué)習(xí)這個(gè)項(xiàng)目的使用,又可以學(xué)習(xí)java語法,又可以學(xué)習(xí)大師們的代碼技巧,還可以以后為lucene做點(diǎn)什么,真的你可以一舉多得!?。『螛凡粸槟??!
聯(lián)系客服