Lucene2.9.1使用小結(同樣適用於Lucene 3.0 )

【注意:本文版權歸++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操作。(未完待續)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章