1. 程式人生 > >搜尋那些事——細談lucene(二)lucene搜尋程式元件詳解

搜尋那些事——細談lucene(二)lucene搜尋程式元件詳解


算算差不多有小半年沒正兒八經的寫部落格了,從考完專升本考試就直接參加了工作,工作四個月之後又回來上本科,開學又在校內創辦了CSDN高校俱樂部,制定學員學習方向,搞講座,辦公開課,反正一切事情很多。現在開學已經差不多一個月了吧,一切基本都走上了正軌,但發覺自己的未來發展之路卻進入了一個迷茫期,專科階段一直致力於web應用方面的學習,現在想提升一下自己的能力和平臺,但一直找不到學習方向。還有一個問題是考研不考研的問題。所以一直很糾結。如果大家有什麼好的建議,歡迎給予評論和建議。在迷茫中給自己選擇了一個搜尋和大資料方向,其實我對這個方向也沒有很明確的見解,只是以前比較留意了一些。不知道這個方向是否適合自己,但我一直堅定,沒有適合不適合,只有努力不努力。本“搜尋那些事”系列部落格主要以“lucene——》nutch——》hadoop”為路線,我不知道自己能不能堅持下來,也希望大家給予監督。


一:lucene歷史和簡介


Lucene 是apache軟體基金會一個開放原始碼的全文檢索引擎工具包,是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文字分析引擎。它不是一個完整的搜尋應用程式,而是為你的應用程式提供索引和搜尋功能。Lucene 目前是 Apache Jakarta 家族中的一個開源專案。Lucene的目的是為軟體開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。

Lucene最初是由Doug Cutting所撰寫的,他是一位資深的全文索引及檢索專家,曾經是V-Twin搜尋引擎的主要開發者,後來在Excite擔任高階系統架構設計師,目前從事於一些INTERNET底層架構的研究。他同時也是當前最火的大資料處理框架hadoop的創始人,其實,hadoop剛開始就是以Lucene的子專案Nutch的一部分正式引入的。我也打算在“搜尋那些事”系列部落格中可以從lucene——》nutch——hadoop的一點點的全部寫出來。Doug Cutting貢獻出Lucene的目標是為各種中小型應用程式加入全文檢索功能。lucene 能夠為文字型別的資料建立索引,所以你只要能把你要索引的資料格式轉化的文字的,Lucene 就能對你的文件進行索引和搜尋。比如你要對一些 HTML 文件,PDF 文件進行索引的話你就首先需要把 HTML 文件和 PDF 文件轉化成文字格式的,然後將轉化後的內容交給 Lucene 進行索引,然後把建立好的索引檔案儲存到磁碟或者記憶體中,最後根據使用者輸入的查詢條件在索引檔案上進行查詢。不指定要索引的文件的格式也使 Lucene 能夠幾乎適用於所有的搜尋應用程式。儘管當時lucene是由java編寫的,不過由於它設計思想的先進和用於廣泛,所以現在已有其他程式語言的版本(c/c++,c#,python等)。已經有很多Java專案都使用了Lucene作為其後臺的全文索引引擎,比較著名的有:

  • Jive:WEB論壇系統;
  • Eyebrows:郵件列表HTML歸檔/瀏覽/查詢系統,本文的主要參考文件“TheLucene search engine: Powerful, flexible, and free”作者就是EyeBrows系統的主要開發者之一,而EyeBrows已經成為目前APACHE專案的主要郵件列表歸檔系統。
  • Cocoon:基於XML的web釋出框架,全文檢索部分使用了Lucene
  • Eclipse:基於Java的開放開發平臺,幫助部分的全文索引使用了Lucene


二:lucene特性簡介

我們處在一個資訊爆炸的時代,所以資訊搜尋對於當前社會發展是非常重要的。作為一個開放原始碼專案,Lucene

從問世之後,引發了開放原始碼社群的巨大反響,程式設計師們不僅使用它構建具體的全文檢索應用,而且將之整合到各種系統軟體中去,以及構建Web應用,甚至某些商業軟體也採用了Lucene作為其內部全文檢索子系統的核心。apache軟體基金會的網站使用了Lucene作為全文檢索的引擎,IBM的開源軟體eclipse的2.1版本中也採用了Lucene作為幫助子系統的全文索引引擎,相應的IBM的商業軟體Web Sphere中也採用了Lucene。Lucene以其開放原始碼的特性、優異的索引結構、良好的系統架構獲得了越來越多的應用。

 

Lucene作為一個全文檢索引擎,其具有如下突出的優點:

(1)索引檔案格式獨立於應用平臺。Lucene定義了一套以8位位元組為基礎的索引檔案格式,使得相容系統或者不同平臺的應用能夠共享建立的索引檔案。

(2)在傳統全文檢索引擎的倒排索引的基礎上,實現了分塊索引,能夠針對新的檔案建立小檔案索引,提升索引速度。然後通過與原有索引的合併,達到優化的目的。

(3)優秀的面向物件的系統架構,使得對於Lucene擴充套件的學習難度降低,方便擴充新功能。

(4)設計了獨立於語言和檔案格式的文字分析介面,索引器通過接受Token流完成索引檔案的創立,使用者擴充套件新的語言和檔案格式,只需要實現文字分析的介面。

(5)已經預設實現了一套強大的查詢引擎,使用者無需自己編寫程式碼即使系統可獲得強大的查詢能力,Lucene的查詢實現中預設實現了布林操作、模糊查詢(Fuzzy Search[11])、分組查詢等等。


特性:

1.索引過程:

·        在現在流行的硬體平臺上每個小時可處理超過 150GB 的資料

·        記憶體佔用小,只需 1MB 的堆記憶體

·        增量索引和批量索引速度一樣快

·        索引大小約為文字索引的 20-30% 大小

·        靜態索引修剪


2.搜尋演算法:

·        範圍搜尋 - 優先返回最佳結果

·        很多強大的查詢型別:短語查詢、萬用字元查詢、近似查詢、範圍查詢等

·        可單獨針對某個欄位查詢

·        可單獨根據某個欄位排序

·        多索引搜尋併合並搜尋結果

·        允許同步更新索引和搜尋

·        靈活的門面搜尋、高亮顯示、結果集的聯合和分組

·        快速,低記憶體佔用和容錯

·        可插入式排名模型,包括 VSM 和Okapi MB25

·        可配置的儲存引擎


3.跨平臺解決方案

·        100% 純 Java

·        其他語言提供索引相容的實現

 

 搜尋應用程式和 Lucene 之間的關係,也反映了利用 Lucene 構建搜尋應用程式的流程:

      


三:索引和搜尋

索引是現代搜尋引擎的核心,建立索引的過程就是把源資料處理成非常方便查詢的索引檔案的過程。為什麼索引這麼重要呢,試想你現在要在大量的文件中搜索含有某個關鍵詞的文件,那麼如果不建立索引的話你就需要把這些文件順序的讀入記憶體,然後檢查這個文章中是不是含有要查詢的關鍵詞,這樣的話就會耗費非常多的時間,想想搜尋引擎可是在毫秒級的時間內查找出要搜尋的結果的。這就是由於建立了索引的原因,你可以把索引想象成這樣一種資料結構,他能夠使你快速的隨機訪問儲存在索引中的關鍵詞,進而找到該關鍵詞所關聯的文件。Lucene 採用的是一種稱為反向索引(inverted index)的機制。反向索引就是說我們維護了一個詞 / 短語表,對於這個表中的每個詞 / 短語,都有一個連結串列描述了有哪些文件包含了這個詞 / 短語。這樣在使用者輸入查詢條件的時候,就能非常快的得到搜尋結果。我們將在本系列文章的第二部分詳細介紹 Lucene 的索引機制,由於 Lucene 提供了簡單易用的 API,所以即使讀者剛開始對全文字進行索引的機制並不太瞭解,也可以非常容易的使用Lucene 對你的文件實現索引。對文件建立好索引後,就可以在這些索引上面進行搜尋了。搜尋引擎首先會對搜尋的關鍵詞進行解析,然後再在建立好的索引上面進行查詢,最終返回和使用者輸入的關鍵詞相關聯的文件。對於中文使用者來說,最關心的問題是其是否支援中文的全文檢索。由於Lucene良好架構設計,對中文的支援只需對其語言詞法分析介面進行擴充套件就能實現對中文檢索的支援。

 

推薦閱讀:搜尋那些事——細談lucene(二)lucene搜尋程式元件詳解

 

 

 

參考資料:

lucene百度百科:http://baike.baidu.com/view/371811.htm

實戰lucenehttp://www.ibm.com/developerworks/cn/java/j-lo-lucene1/

七個搜尋引擎http://www.oschina.net/news/39289/7-search-engines-for-big-data