之前在學習Lucene這個全文檢索工具,為項目搜索引擎的開發打下基礎。在這里先分享一下關於Lucene的學習心得。
核心的學習流程是:索引文件格式--索引創建過程--檢索流程。
1.首先建議參看這篇精簡的博文,對Lucene的索引創建和檢索功能有個了解。https://www.ibm.com/developerworks/cn/java/j-lo-lucene1/ 需要注意這個博文的jar包是Lucene2.0.0比較老。
2.然后閱讀另外一篇比較細致的博文:http://blog.csdn.net/csh624366188/article/details/6823209;這個博文閱讀時注意它前面一部分演示Lucene搜索應用的時候用的是Lucene3.0.3;后面大部分案例都是用的Lucene2.0.0 。
3.英文水平還過的去的就可以去APACHE官網讀一讀Lucene的官方文檔,然后再看看核心的API:https://lucene.apache.org/core/6_6_0/index.html 注意這個是6.6.0的。我在github上放了兩個Lucene6.6.0的案例,地址:https://github.com/Jethu1/lucene6.git 。
4.如果不想只是了解Lucene的API的基本用法,而是想深入到Lucene內部原理,並且想進一步閱讀源碼的話強烈推薦:這40篇博文,http://www.cnblogs.com/forfuture1978/category/300665.html。我花了兩周時間反復研讀了這些博文,收獲很大。
對文檔建立好索引后,就可以在這些索引上面進行搜索了。搜索引擎首先會對搜索的關鍵詞進行解析,然后再在建立好的索引上面進行查找,最終返回和用戶輸入的關鍵詞相關聯的文檔。
Lucene 軟件包分析
Lucene 軟件包的發布形式是一個 JAR 文件,下面我們分析一下這個 JAR 文件里面的主要的 JAVA 包,使讀者對之有個初步的了解。
Package: org.apache.lucene.document
這個包提供了一些為封裝要索引的文檔所需要的類,比如 Document, Field。這樣,每一個文檔最終被封裝成了一個 Document 對象。
Package: org.apache.lucene.analysis
這個包主要功能是對文檔進行分詞,因為文檔在建立索引之前必須要進行分詞,所以這個包的作用可以看成是為建立索引做准備工作。
Package: org.apache.lucene.index
這個包提供了一些類來協助創建索引以及對創建好的索引進行更新。這里面有兩個基礎的類:IndexWriter 和 IndexReader,其中 IndexWriter 是用來創建索引並添加文檔到索引中的,IndexReader 是用來刪除索引中的文檔的。
Package: org.apache.lucene.search
這個包提供了對在建立好的索引上進行搜索所需要的類。比如 IndexSearcher 和 Hits, IndexSearcher 定義了在指定的索引上進行搜索的方法,Hits 用來保存搜索得到的結果。(Lucene6.x中沒有了Hits對象 改為了ScoreDoc )。
建立索引
為了對文檔進行索引,Lucene 提供了五個基礎的類,他們分別是 Document, Field, IndexWriter, Analyzer, Directory。下面我們分別介紹一下這五個類的用途:
Document
Document 是用來描述文檔的,這里的文檔可以指一個 HTML 頁面,一封電子郵件,或者是一個文本文件。一個 Document 對象由多個 Field 對象組成的。可以把一個 Document 對象想象成數據庫中的一個記錄,而每個 Field 對象就是記錄的一個字段。
Field
Field 對象是用來描述一個文檔的某個屬性的,比如一封電子郵件的標題和內容可以用兩個 Field 對象分別描述。
Analyzer
在一個文檔被索引之前,首先需要對文檔內容進行分詞處理,這部分工作就是由 Analyzer 來做的。Analyzer 類是一個抽象類,它有多個實現。針對不同的語言和應用需要選擇適合的 Analyzer。Analyzer 把分詞后的內容交給 IndexWriter 來建立索引。
IndexWriter
IndexWriter 是 Lucene 用來創建索引的一個核心的類,他的作用是把一個個的 Document 對象加到索引中來。
Directory
這個類代表了 Lucene 的索引的存儲的位置,這是一個抽象類,它目前有兩個實現,第一個是 FSDirectory,它表示一個存儲在文件系統中的索引的位置。第二個是 RAMDirectory,它表示一個存儲在內存當中的索引的位置。
搜索文檔
利用 Lucene 進行搜索就像建立索引一樣也是非常方便的。在上面一部分中,我們已經為一個目錄下的文本文檔建立好了索引,現在我們就要在這個索引上進行搜索以找到包含某個關鍵詞或短語的文檔。Lucene 提供了幾個基礎的類來完成這個過程,它們分別是呢 IndexSearcher, Term, Query, TermQuery, Hits. 下面我們分別介紹這幾個類的功能。
Query
這是一個抽象類,他有多個實現,比如 TermQuery, BooleanQuery, PrefixQuery. 這個類的目的是把用戶輸入的查詢字符串封裝成 Lucene 能夠識別的 Query。
Term
Term 是搜索的基本單位,一個 Term 對象有兩個 String 類型的域組成。生成一個 Term 對象可以有如下一條語句來完成:Term term = new Term(“fieldName”,”queryWord”); 其中第一個參數代表了要在文檔的哪一個 Field 上進行查找,第二個參數代表了要查詢的關鍵詞。
TermQuery
TermQuery 是抽象類 Query 的一個子類,它同時也是 Lucene 支持的最為基本的一個查詢類。生成一個 TermQuery 對象由如下語句完成: TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”)); 它的構造函數只接受一個參數,那就是一個 Term 對象。
IndexSearcher
IndexSearcher 是用來在建立好的索引上進行搜索的。它只能以只讀的方式打開一個索引,所以可以有多個 IndexSearcher 的實例在一個索引上進行操作。
Hits
Hits 是用來保存搜索的結果的。(Lucene6.x之后沒有了Hits對象 改為了ScoreDoc 來保存對象)。