Lucene 就是這麼簡單
本文要點:
1. 簡介
1.1 什麼是lucene?
Lucene是一個開源的使用java語言編寫的全文搜尋引擎開發包,可以融入到自己的專案中來實現增加索引和搜尋功能,其實就是一款高效能的、可擴充套件的資訊檢索工具庫。和其他開源軟體一樣,有著與生俱來的優點:功能和結構的透明性、功能強大且具有較強的擴充套件性、技術社群的強大支援同時也方便技術交流。
Lucene只是一個搜尋的核心庫,並不提供具體的實現,但它的應用十分廣泛,Solr、ElasticSearch 、Katta等底層用的都是Lucene。其特點:API簡單,易於學習(但是不同的版本API差別較大)。
Lucene的原理:是倒排序索引。
那麼到底什麼是倒排序索引,什麼又是正排序索引呢?
個人理解:
倒排序索引:即經過Lucene分詞之後,它會維護一個類似於“詞條--文件ID”的對應關係,當我們進行搜尋某個詞條的時候,就會得到相應的文件ID。
而正排序索引是:當我們進行搜尋的時候,會對整個文件的內容進行搜尋,不維護“詞條--文件ID”的對應關係,然後如果匹配上,得到對應的文件ID,這樣做肯定耗時,因為就像是資料庫裡的表缺少了索引一樣。
2. Lucene 核心API
2.1 索引過程中的核心類
Document、 Field 、IndexWriter、 Directroy、 Analyzer
Dcoument 文件,一個文件代表一些域(Field)的集合。他是承載資料的實體,是一個抽象的概念,並不是word 或者 Txt什麼的。Document代表一個被索引的基本單元。
構造方法
常用的API:
Field 索引中的每一個Document物件都包含一個或者多個不同的域(Field),域是由域名(name)和域值(value)對組成,每一個域都包含一段相應的資料資訊。
常用的構造方法:
IndexWriter 是索引過程的核心元件。這個類用於建立一個新的索引並且把文件 加到已有的索引中去。他可以為你提供對索引的寫入操作,但不能進行讀取或搜尋。
構造方法:
其核心API有:
Directory 是索引的存放位置,是個抽象類。具體的子類提供特定的儲存索引的地址。FSDirectory 將索引存放在指定的磁碟中,RAMDirectory ·將索引存放在記憶體中。
FSDirectory 的建立:
RAMDirectory 建立:
Analyzer 分詞器,在文字被索引之前,需要經過分詞器處理,他負責從將被索引的文件中提取詞彙單元,並剔除剩下的無用資訊(停止詞彙),分詞器十分關鍵,因為 不同的分詞器,解析相同的文件結果會有很大的不同 。Analyzer是一個抽象類,是所有分詞器的基類。他通過TokenStream類似一種很好的方式,將文字逐字。
常用的分詞器有:
2.2 搜尋過程中的核心類
IndexSearcher 、Term、Query、TermQuery、TopDocs
IndexSearcher 呼叫它的search方法,用於搜尋IndexWriter 所建立的索引。
構造方法:
常用API:
Term 使用於搜尋的一個基本單元。
Query Lucene中含有多種查詢(Query)子類。比如,TermQuery(單詞條查詢)、BooleanQuery(布林查詢)、PhraseQuery(短語搜尋)、PrefixQuery(字首搜尋)等。它們用於查詢條件的限定其中TermQuery 是Lucene提供的最基本的查詢型別,也是最簡單的,它主要用來匹配在指定的域(Field)中包含了特定項(Term)的文件。
TopDocs 是一個存放有序搜尋結果指標的簡單容器,在這裡搜尋的結果是指匹配一個查詢條件的一系列的文件。
三、簡單的demo
POM依賴:
工具類:
建立索引:
搜尋索引:
四、檢視Lucene的分詞結果神器之-----Luke
luke 各版本的下載git地址:https://github.com/DmitryKey/luke/releases
具體應用:
開啟索引庫目錄:
檢視詞條:
進行搜尋:
參考:
-
《Lucene 實戰》 - 作者: Michael McCandless / Erik Hatcher / Otis Gospodnetic 出版社: 人民郵電出版社 譯者: 牛長流 / 肖宇 出版年: 2011-6-1
-
http://lucene.apache.org/