【注意:本文版權歸++yong所有,轉載請註明。 】
【++yong的博客地址:http://blog.csdn.net/qjyong】
開源全文搜索工具包Lucene2.9.1的使用。
1. 搭建Lucene的開發環境:在classpath中添加lucene-core-2.9.1.jar包
2. 全文搜索的兩個工作: 建立索引文件,搜索索引.
3. Lucene的索引文件邏輯結構
1) 索引(Index)由若干塊(片段)(Segment)組成
★2) 塊由若干文檔(Document)組成: 一個文件映射成一個文檔。數據庫表中的一條記錄映射成一個文檔。
★3) 文檔由若干域(Field)組成:文件的屬性(文件路徑,文件的內容)映射成一個域。記錄的某個字段映射成一個域。
☆4) 域由若干詞(關鍵字)(Term)組成:文件的屬性的內容中某個字符串映射成一個詞。
4. Lucene包結構
1) analysis模塊:負責詞法分析及語言處理而形成Term(詞)。提供了一些內置的分析器:最常用的是StandardAnalyzer
2) index模塊:負責索引的讀寫。 對索引文件的segment進行寫、合併、優化的IndexWriter類。對索引進行讀取和刪除操作的IndexReader類。
3) store模塊:負責索引的存儲。提供索引的各種存儲類:FSDirectory,RAMDirectory等。
4) document模塊:索引文件內部的基礎存儲結構封裝。如:Document類和Field類等。
5) search模塊:負責對索引的搜索。提供了索引搜索器IndexSearcher類和各種Query類,如TermQuery、BooleanQuery等。
6) queryParser模塊:負責查詢語句的語法分析。提供瞭解析查詢語句的QueryParser類
7) util模塊:包含一些公共工具類。
5. 創建索引
1) IndexWriter:索引寫出器
a) 構造方法:
IndexWriter(Directory d, Analyzer a, IndexWriter.MaxFieldLength mfl)
如果索引不存在,就會被創建。如果索引存在,就追加.
IndexWriter(Directory d, Analyzer a, boolean create, IndexWriter.MaxFieldLength mfl)
create爲true時,原索引文件不存在就創建,存在就覆蓋。
create爲false時,原索引文件不存在就報錯,存在就追加。
b) 常用方法:
void addDocument(Document doc); //把指定文檔添加到索引寫出器中
void iw.close(); //關閉索引寫出器,此時才把索引寫到目標存儲地
2) Directory: 索引存放地。
a) 文件系統:FSDirectory: FSDirectory.open(File file);
b) 內存RAMDirectory: new RAMDirectory();
3) Analyzer: 分詞器。
a) StandardAnalyzer: 標準分詞器。對英文采用空白, 標點符號進行分詞。對中文采用單字分詞。
b) SmartChineseAnalyzer: 智能中文分詞器。(LUCENE_HOME/contrib/analyzers/smartcn/lucene-smartcn-2.9.1.jar)
C) 第三方的中文分詞器:如PaodingAnalyzer、IKAnalyzer
4) IndexWriter.MaxFieldLength: 指定域值的最大長度。
a) UNLIMITED 無限制的。
b) LIMITED 有限制的。值爲10000
5) Document: 索引的組成單元. 一組Field的集合.
a) 構造方法: Document();
b) 常用方法: void add(Field f); //添加指定域到這個文檔中
6) Field: 域,代表文檔的某個索引域.
a) 構造方法: Field(String name, String value, Field.Store.YES, Field.Index.ANALYZED)
name: 域的名稱, 只能是字符串.
value: 域的值, 只能是字符串.
Field.Store: 指定Field的值是否存儲或怎樣存儲. NO(不存儲), YES(存儲),COMPRESS(壓縮後存儲)
Field.Index: 指定Field是否被索引或怎麼被索引. NO(不索引), ANALYZED(分詞後索引), NOT_ANALYZED(不分詞直接索引)
7) 示例代碼:
6. 查詢索引
1) IndexSearcher: 索引查詢器
a) 構造器: IndexSearcher(Directory path, boolean readOnly)
b) 常用方法:
TopDocs search(Query query, Filter filter, int n); //執行查詢。n指的是最多返回的Document的數量。
Document doc(int 文件內部編號); //根據文檔的內部編號獲取到該Document
void close(); //關閉查詢器
2) Query: 查詢對象。把用戶輸入的查詢字符串封裝成Lucene能夠識別的Query對象。
3) Filter: 用來過慮搜索結果的對象。
4) TopDocs: 代表查詢結果集信息對象。它有兩個屬性:
a) totalHits: 查詢命中數。
b) scoreDocs: 查詢結果信息。它包含符合條件的Document的內部編號(doc)及評分(score)。
5) 示例代碼:
7. 刪除索引
IndexWriter提供deleteDocuments(Term term); //會刪除索引文件裏含有指定Term的所有Document。
IndexReader也提供了deleteDocuments(Term term);
8. 更新索引
IndexWriter提供updateDocument(Term term, Document doc); //實際上是先刪除再創建索引。
9. 常用查詢器
1) TermQuery : 按Term(關鍵字)查詢。構造方法:TermQuery(Term t)
2) BooleanQuery: 布爾查詢。組合多個查詢器。
3) MultiFieldQueryParser: 多Field中查詢。
10. 高亮器Highlighter:在網頁中對搜索結果予以高亮顯示。
1) 在classpath添加contrib/highlighter/lucene-highlighter-2.9.1.jar
2) 示例僞代碼
11. 優化
1) 使用IndexWriter須注意
修改索引後,需flush()或close()方能生效
2) 使用IndexSearcher須注意
一旦打開,不會搜索到以後添加的索引
線程安全,多個線程僅需一個實例
3) 最佳實踐
多個線程共享一個IndexSearcher, 只有當索引修改後才重新打開IndexSearcher
多個線程共享一個IndexWriter並嚴格同步
異步修改索引提高性能(JMS)
爲每個Document創建單獨的索引目錄
12. 在emall項目中整合Lucene對產品的ID,名稱和描述進行全文搜索。
13. 使用Compass簡化Lucene操作。(未完待續)