什么是Lucene?? Lucene 是 apache 軟件基金會發(fā)布的一個開放源代碼的全文檢索引擎工具包,由資深全文檢索專家 Doug Cutting 所撰寫,它是一個全文檢索引擎的架構,提供了完整的創(chuàng)建索引和查詢索引,以及部分文本分析的引擎。 Lucene的目的是為軟件開發(fā)人員提供一個簡單易用的工具包,以方便在目標系統(tǒng)中實現(xiàn)全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎,Lucene在全文檢索領域是一個經(jīng)典的祖先,現(xiàn)在很多檢索引擎都是在其基礎上創(chuàng)建的,思想是相通的。 Lucene是根據(jù)關健字來搜索的文本搜索工具,只能在某個網(wǎng)站內部搜索文本內容,不能跨網(wǎng)站搜索。 既然談到了網(wǎng)站內部的搜索,那么我們就談談我們熟悉的百度、google那些搜索引擎又是基于什么搜索的呢....
從圖上已經(jīng)看得很清楚,baidu、google等搜索引擎其實是通過網(wǎng)絡爬蟲的程序來進行搜索的... 為什么我們要用Lucene? 在介紹Lucene的時候,我們已經(jīng)說了:Lucene又不是搜索引擎,僅僅是在網(wǎng)站內部進行文本的搜索。那我們?yōu)槭裁匆獙W他呢??? 我們之前編寫納稅服務系統(tǒng)的時候,其實就已經(jīng)使用過SQL來進行站內的搜索.. 既然SQL能做的功能,我們還要學Lucene,為什么呢??? 我們來看看我們用SQL來搜索的話,有什么缺點:
我們來看看在baidu中搜索Lucene為關鍵字搜索出的內容是怎么樣的:
以上所說的,我們如果使用SQL的話,是做不到的。因此我們就學習Lucene來幫我們在站內根據(jù)文本關鍵字來進行搜索數(shù)據(jù)! 我們如果網(wǎng)站需要根據(jù)關鍵字來進行搜索,可以使用SQL,也可以使用Lucene...那么我們Lucene和SQL是一樣的,都是在持久層中編寫代碼的。。
一、快速入門 接下來,我們就講解怎么使用Lucene了.....在講解Lucene的API之前,我們首先來講講Lucene存放的究竟是什么內容...我們的SQL使用的是數(shù)據(jù)庫中的內存,在硬盤中為DBF文件...那么我們Lucene內部又是什么東西呢?? Lucene中存的就是一系列的二進制壓縮文件和一些控制文件,它們位于計算機的硬盤上, 這些內容統(tǒng)稱為索引庫,索引庫有二部份組成:
也就是說:Lucene存放數(shù)據(jù)的地方我們通常稱之為索引庫,索引庫又分為兩部分組成:原始記錄和詞匯表.... 1.1原始記錄和詞匯表 當我們想要把數(shù)據(jù)存到索引庫的時候,我們首先存入的是將數(shù)據(jù)存到原始記錄上面去.... 又由于我們給用戶使用的時候,用戶使用的是關鍵字來進行查詢我們的具體記錄。因此,我們需要把我們原始存進的數(shù)據(jù)進行拆分!將拆分出來的數(shù)據(jù)存進詞匯表中。 詞匯表就是類似于我們在學Oracle中的索引表,拆分的時候會給出對應的索引值。 一旦用戶根據(jù)關鍵字來進行搜索,那么程序就先去查詢詞匯表中有沒有該關鍵字,如果有該關鍵字就定位到原始記錄表中,將符合條件的原始記錄返回給用戶查看。 我們查看以下的圖方便理解:
到了這里,有人可能就會疑問:難道原始記錄拆分的數(shù)據(jù)都是一個一個漢字進行拆分的嗎??然后在詞匯表中不就有很多的關鍵字了??? 其實,我們在存到原始記錄表中的時候,可以指定我們使用哪種算法來將數(shù)據(jù)拆分,存到詞匯表中.....我們的圖是Lucene的標準分詞算法,一個一個漢字進行拆分。我們可以使用別的分詞算法,兩個兩個拆分或者其他的算法。 1.2編寫第一個Lucene程序 首先,我們來導入Lucene的必要開發(fā)包:
創(chuàng)建User對象,User對象封裝了數(shù)據(jù)....
我們想要使用Lucene來查詢出站內的數(shù)據(jù),首先我們得要有個索引庫吧!于是我們先創(chuàng)建索引庫,將我們的數(shù)據(jù)存到索引庫中。 創(chuàng)建索引庫的步驟:
程序執(zhí)行完,我們就會在硬盤中見到我們的索引庫。
那我們現(xiàn)在是不知道記錄是否真真正正存儲到索引庫中的,因為我們看不見。索引庫存放的數(shù)據(jù)放在cfs文件下,我們也是不能打開cfs文件的。 于是,我們現(xiàn)在用一個關鍵字,把索引庫的數(shù)據(jù)讀取。看看讀取數(shù)據(jù)是否成功。 根據(jù)關鍵字查詢索引庫中的內容:
效果:
1.3進一步說明Lucene代碼 我們的Lucene程序就是大概這么一個思路:將JavaBean對象封裝到Document對象中,然后通過IndexWriter把document寫入到索引庫中。當用戶需要查詢的時候,就使用IndexSearcher從索引庫中讀取數(shù)據(jù),找到對應的Document對象,從而解析里邊的內容,再封裝到JavaBean對象中讓我們使用。
二、對Lucene代碼優(yōu)化 我們再次看回我們上一篇快速入門寫過的代碼,我來截取一些有代表性的: 以下代碼在把數(shù)據(jù)填充到索引庫,和從索引庫查詢數(shù)據(jù)的時候,都出現(xiàn)了。是重復代碼! 以下的代碼其實就是將JavaBean的數(shù)據(jù)封裝到Document對象中,我們是可以通過反射來對其進行封裝....如果不封裝的話,我們如果有很多JavaBean都要添加到Document對象中,就會出現(xiàn)很多類似的代碼。 以下代碼就是從Document對象中把數(shù)據(jù)取出來,封裝到JavaBean去。如果JavaBean中有很多屬性,也是需要我們寫很多次類似代碼.... 2.1編寫Lucene工具類 在編寫工具類的時候,值得注意的地方:
2.2使用LuceneUtils改造程序 三、索引庫優(yōu)化 我們已經(jīng)可以創(chuàng)建索引庫并且從索引庫讀取對象的數(shù)據(jù)了。其實索引庫還有地方可以優(yōu)化的.... 3.1合并文件 我們把數(shù)據(jù)添加到索引庫中的時候,每添加一次,都會幫我們自動創(chuàng)建一個cfs文件...
這樣其實不好,因為如果數(shù)據(jù)量一大,我們的硬盤就有非常非常多的cfs文件了.....其實索引庫會幫我們自動合并文件的,默認是10個。 如果,我們想要修改默認的值,我們可以通過以下的代碼修改: 3.2設置內存索引庫 我們的目前的程序是直接與文件進行操作,這樣對IO的開銷其實是比較大的。而且速度相對較慢....我們可以使用內存索引庫來提高我們的讀寫效率... 對于內存索引庫而言,它的速度是很快的,因為我們直接操作內存...但是呢,我們要將內存索引庫是要到硬盤索引庫中保存起來的。當我們讀取數(shù)據(jù)的時候,先要把硬盤索引庫的數(shù)據(jù)同步到內存索引庫中去的。
四、分詞器 我們在前面中就已經(jīng)說過了,在把數(shù)據(jù)存到索引庫的時候,我們會使用某些算法,將原始記錄表的數(shù)據(jù)存到詞匯表中.....那么這些算法總和我們可以稱之為分詞器 分詞器: ** 采用一種算法,將中英文本中的字符拆分開來,形成詞匯,以待用戶輸入關健字后搜索** 對于為什么要使用分詞器,我們也明確地說過:由于用戶不可能把我們的原始記錄數(shù)據(jù)完完整整地記錄下來,于是他們在搜索的時候,是通過關鍵字進行對原始記錄表的查詢....此時,我們就采用分詞器來最大限度地匹配相關的數(shù)據(jù)
4.1分詞器流程
4.2分詞器API 我們在選擇分詞算法的時候,我們會發(fā)現(xiàn)有非常非常多地分詞器API,我們可以用以下代碼來看看該分詞器是怎么將數(shù)據(jù)分割的: 在實驗完之后,我們就可以選擇恰當?shù)姆衷~算法了.... 4.3IKAnalyzer 分詞器 這是一個第三方的分詞器,我們如果要使用的話需要導入對應的jar包
這個第三方的分詞器有什么好呢????他是中文首選的分詞器...也就是說:他是按照中文的詞語來進行拆分的! 五、對搜索結果進行處理 5.1搜索結果高亮 我們在使用SQL時,搜索出來的數(shù)據(jù)是沒有高亮的...而我們使用Lucene,搜索出來的內容我們可以設置關鍵字為高亮...這樣一來就更加注重用戶體驗了! 5.2搜索結果摘要 如果我們搜索出來的文章內容太大了,而我們只想顯示部分的內容,那么我們可以對其進行摘要... 值得注意的是:搜索結果摘要需要與設置高亮一起使用 5.3搜索結果排序 我們搜索引擎肯定用得也不少,使用不同的搜索引擎來搜索相同的內容。他們首頁的排行順序也會不同...這就是它們內部用了搜索結果排序.... 影響網(wǎng)頁的排序有非常多種:
而在Lucene中我們就可以設置相關度得分來使不同的結果對其進行排序:
當然了,我們也可以按單個字段排序: 也可以按多個字段排序:在多字段排序中,只有第一個字段排序結果相同時,第二個字段排序才有作用 提倡用數(shù)值型排序 5.4條件搜索 在我們的例子中,我們使用的是根據(jù)一個關鍵字來對某個字段的內容進行搜索。語法類似于下面: 其實,我們也可以使用關鍵字來對多個字段進行搜索,也就是多條件搜索。我們實際中常常用到的是多條件搜索,多條件搜索可以使用我們最大限度匹配對應的數(shù)據(jù)!
六、總結
這篇這是Lucene的冰山一角,一般現(xiàn)在用的可能都是Solr、Elasticsearch的了,但想要更加深入了解Lucene可翻閱其他資料哦~ |
|