1、Lucene簡介java
Lucene是有知名全文檢索/索引專家Doug Cutting採用Java語言開發的基於全文搜索的軟件工具,以後貢獻給Apache軟件基金會作爲一個開源項目,成爲一個開放源代碼的全文檢索引擎工具包,因爲他的高性能,可伸縮性並且經歷了很長時間的沉澱,已是很成熟的項目,被普遍集成於系統軟件中,甚至一些商用軟件也採用了Lucene作爲其內部全文檢索子系統的核心,如IBM的開源軟件Eclipse 的幫助文檔,也是採用了Lucene作爲其全文搜索引擎。Lucene 可以爲文本類型的數據創建索引,因此你只要能把你要索引的數據格式轉化的文本的,Lucene 就能對你的文檔進行索引和搜索。好比你要對一些 HTML 文檔,PDF 文檔進行索引的話你就首先須要把 HTML 文檔和 PDF 文檔轉化成文本格式的,而後將轉化後的內容交給 Lucene 進行索引,而後把建立好的索引文件保存到磁盤或者內存中,最後根據用戶輸入的查詢條件在索引文件上進行查詢。不指定要索引的文檔的格式也使 Lucene 可以幾乎適用於全部的搜索應用程序。算法
下載地址:http://www.apache.org/dyn/closer.cgi/lucene/java/4.9.0數據庫
2、Lucene的優勢apache
1、索引文件格式獨立於應用平臺。Lucene定義了一套以8位字節爲基礎的索引文件格式,使得兼容系統或者不一樣平臺的應用可以共享創建的索引文件。服務器
2、在傳統全文檢索引擎的倒排索引的基礎上,實現了分塊索引,可以針對新的文件創建小文件索引,提高索引速度。而後經過與原有索引的合併,達到優化的目的。數據結構
3、優秀的面向對象的系統架構,使得對於Lucene擴展的學習難度下降,方便擴充新功能。架構
4、設計了獨立於語言和文件格式的文本分析接口,索引器經過接受Token流完成索引文件的創立,用戶擴展新的語言和文件格式,只須要實現文本分析的接口。工具
5、已經默認實現了一套強大的查詢引擎,用戶無需本身編寫代碼即便系統可得到強大的查詢能力,Lucene的查詢實現中默認實現了布爾操做、模糊查詢、分組查詢等等。性能
3、什麼是全文檢索學習
全文檢索是指計算機索引程序經過掃描文章中的每個詞,對每個詞創建一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先創建的索引進行查找,並將查找的結果反饋給用戶的檢索方式。這個過程相似於經過字典中的檢索字表查字的過程。
全文檢索的方法主要分爲按字檢索和按詞檢索兩種。按字檢索是指對於文章中的每個字都創建索引,檢索時將詞分解爲字的組合。對於各類不一樣的語言而言,字有不一樣的含義,好比英文中字與詞其實是合一的,而中文中字與詞有很大分別。按詞檢索指對文章中的詞,即語義單位創建索引,檢索時按詞檢索,而且能夠處理同義項等。英文等西方文字因爲按照空白切分詞,所以實現上與按字處理相似,添加同義處理也很容易。中文等東方文字則須要切分字詞,以達到按詞索引的目的,關於這方面的問題,是當前全文檢索技術尤爲是中文全文檢索技術中的難點,在此不作詳述。
4、Lucene系統結構
系統結構與源碼組織圖:
從圖中咱們清楚的看到,Lucene的系統由基礎結構封裝、索引核心、對外接口三大部分組成。其中直接操做索引文件的索引核心又是系統的重點。Lucene的將全部源碼分爲了7個模塊(在java語言中以包即package來表示):Analysis,Document,Index,QueryParser,Search,Store,Util.各個模塊所屬的系統部分也如上圖所示。須要說明的是org.apache.lucene.queryPaser是作爲org.apache.lucene.search的語法解析器存在,不被系統以外實際調用,所以這裏沒有看成對外接口看待,而是將之獨立出來。
從面象對象的觀點來考察,Lucene應用了最基本的一條程序設計準則:引入額外的抽象層以下降耦合性。首先,引入對索引文件的操做org.apache.lucene.store的封裝,而後將索引部分的實現創建在(org.apache.lucene.index)其之上,完成對索引核心的抽象。在索引核心的基礎上開始設計對外的接口org.apache.lucene.search與org.apache.lucene.analysis。在每個局部細節上,好比某些經常使用的數據結構與算法上,Lucene也充分的應用了這一條準則。在高度的面向對象理論的支撐下,使得Lucene的實現容易理解,易於擴展。
Lucene在系統結構上的另外一個特色表現爲其引入了傳統的客戶端服務器結構之外的的應用結構。Lucene能夠做爲一個運行庫被包含進入應用自己中去,而不是作爲一個單獨的索引服務器存在。這天然和Lucene開放源代碼的特徵分不開,可是也體現了Lucene在編寫上的原本意圖:提供一個全文索引引擎的架構,而不是實現。
包名 |
功能 |
org.apache.lucene.analysis |
語言分析器,主要用於的切詞,支持中文主要是擴展此類 |
org.apache.lucene.document |
索引存儲時的文檔結構管理,相似於關係型數據庫的表結構 |
org.apache.lucene.index |
索引管理,包括索引創建、刪除等 |
org.apache.lucene.queryParser |
查詢分析器,實現查詢關鍵詞間的運算,如與、或、非等 |
org.apache.lucene.search |
檢索管理,根據查詢條件,檢索獲得結果 |
org.apache.lucene.store |
數據存儲管理,主要包括一些底層的I/O操做 |
org.apache.lucene.util |
一些公用類 |
Lucene主要邏輯圖:
Lucene功能強大,但從根本上說,主要包括兩塊:一是文本內容經切詞後索引入庫;二是根據查詢條件返回結果。
搜索應用程序和 Lucene 之間的關係
如圖:用戶要找Document得信息。最早將爲Document文檔創建Index索引。而後經過search搜索Index從而找到咱們想要的內容。
首先是建立索引
索引通俗地說就是將內容作成書籤目錄,這樣使得咱們能更快地搜索獲得內容。對文檔創建好索引後,就能夠在這些索引上面進行搜索了。搜索引擎首先會對搜索的關鍵詞進行解析,而後再在創建好的索引上面進行查找,最終返回和用戶輸入的關鍵詞相關聯的文檔。因此建立索引很重要。
5、檢索流程
1. 索引過程:(紅線)
1) 有一系列被索引文件
2) 被索引文件通過語法分析和語言處理造成一系列詞(Term)。
3) 通過索引建立造成詞典和反向索引表。
4) 經過索引存儲將索引寫入硬盤。
2. 搜索過程:(藍線)
a) 用戶輸入查詢語句。(Query)
b) 對查詢語句通過語法分析和語言分析獲得一系列詞(Term)。(QueryParser和Analyzer)
c) 經過語法分析獲得一個查詢樹。
d) 經過索引存儲將索引讀入到內存。(IndexWriter)
e) 利用查詢樹搜索索引,從而獲得每一個詞(Term)的文檔鏈表,對文檔鏈表進行交,差,並得
到結果文檔。
f) 將搜索到的結果文檔對查詢的相關性進行排序。
g) 返回查詢結果給用戶。
6、Lucene全文索引引擎與數據庫索
數據庫 |
Lucene全文索引引擎 |
|
索引 |
對於LIKE查詢來講,數據傳統的索引是根本用不上的。數據須要逐個便利記錄進行GREP式的模糊匹配,比有索引的搜索速度要有多個數量級的降低。 |
將數據源中的數據都經過全文索引一一創建反向索引 |
匹配效果 |
使用:like "%net%" 會把netherlands也匹配出來, 多個關鍵詞的模糊匹配:使用like "%com%net%":就不能匹配詞序顛倒的xxx.net..xxx.com |
經過詞元(term)進行匹配,經過語言分析接口的實現,能夠實現對中文等非英語的支持。 |
匹配度 |
沒有匹配程度的控制:好比有記錄中net出現5詞和出現1次的,結果是同樣的 |
有匹配度算法,將匹配程度(類似度)比較高的結果排在前面。 |
結果輸出 |
返回全部的結果集,在匹配條目很是多的時候(好比上萬條)須要大量的內存存放這些臨時結果集。 |
經過特別的算法,將最匹配度最高的頭100條結果輸出,結果集是緩衝式的小批量讀取的。 |
可定製性 |
沒有接口或接口複雜,沒法定製 |
經過不一樣的語言分析接口實現,能夠方便的定製出符合應用須要的索引規則(包括對中文的支持) |
結論 |
使用率低,模糊匹配規則簡單或者須要模糊查詢的資料量少 |
高負載的模糊查詢應用,須要負責的模糊查詢的規則,索引的資料量比較大 |
7、關於亞洲語言的的切分詞問題(Word Segment)
對於中文來講,全文索引首先還要解決一個語言分析的問題,對於英文來講,語句中單詞之間是自然經過空格分開的,但亞洲語言的中日韓文語句中的字是一個字挨一個,全部,首先要把語句中按「詞」進行索引的話,這個詞如何切分出來就是一個很大的問題。 首先,確定不能用單個字符做(si-gram)爲索引單元,不然查「上海」時,不能讓含有「海上」也匹配。 但一句話:「北京天安門」,計算機如何按照中文的語言習慣進行切分呢? 「北京 天安門」 仍是「北 京 天安門」?讓計算機可以按照語言習慣進行切分,每每須要機器有一個比較豐富的詞庫纔可以比較準確的識別出語句中的單詞。 另一個解決的辦法是採用自動切分算法:將單詞按照2元語法(bigram)方式切分出來,好比: "北京天安門" ==> "北京 京天 天安 安門"。 這樣,在查詢的時候,不管是查詢"北京" 仍是查詢"天安門",將查詢詞組按一樣的規則進行切分:"北京","天安安門",多個關鍵詞之間按與"and"的關係組合,一樣可以正確地映射到相應的索引中。這種方式對於其餘亞洲語言:韓文,日文都是通用的。