今天將“Lucene學習”里面的程序貼到eclipse工程里實現了一下
加深了我對檢索的理解
在全文檢索中,可以和數據庫進行一個簡單的對比
全文檢索沒有表的概念,也就沒有固定的fields,但是有記錄,每一個記錄就是一個Document對象
每一個document都可以有自己不同的fields,如下:

    Document doc = new Document(); 

   doc.add(Field.Keyword("filename",file.getAbsolutePath())); 
     
   //以下兩句只能取一句,前者是索引不存儲,后者是索引且存儲
   //doc.add(Field.Text("content",new FileReader(file))); 
   doc.add(Field.Text("content",this.chgFileToString(file)));
   
   indexWriter.addDocument(doc);

在查詢的時候,需要三個重要的參數
首先是庫路徑,即在哪個庫里面進行檢索(相當于database的路徑):

Searcher searcher = new IndexSearcher(dbpath);

然后就是你以哪個字段,查詢什么關鍵詞,因為根據字段就可以得到字段對應的內容
在得到的內容中檢索你的關鍵詞,這個累死sql語句,只不過沒有表的概念
Query query
    = QueryParser.parse(searchkey,searchfield,new StandardAnalyzer()); 

然后開始查詢,查詢的結果就是document的集合:
   Hits hits = searcher.search(query); 

對得到的集合進行處理:

   if(hits != null)
  {
       list = new ArrayList();
       int temp_hitslength = hits.length();
       Document doc = null;
       for(int i = 0;i < temp_hitslength; i++){
           doc = hits.doc(i);
           //list.add(doc.get("filename"));
           list.add(doc.get("content"));
       }
   } 

  附常用Field:

常用的
Field方法如下:


方法

切詞

索引

存儲

用途

Field.Text(String name, String value)

Yes

Yes

Yes

切分詞索引并存儲,比如:標題,內容字段

Field.Text(String name, Reader value)

Yes

Yes

No

切分詞索引不存儲,比如:META信息,

不用于返回顯示,但需要進行檢索內容

Field.Keyword(String name, String value)

No

Yes

Yes

不切分索引并存儲,比如:日期字段

Field.UnIndexed(String name, String value)

No

No

Yes

不索引,只存儲,比如:文件路徑

Field.UnStored(String name, String value)

Yes

Yes

No

只全文索引,不存儲


切分詞 就是指對文本進行切詞,用于進行索引,上面可以看到切分的都會進行索引;索引即用于通過搜索詞進行查詢;存儲表示是否存儲內容本身。上面的 Field.Keyword方法就不切分但是可以索引,所以可以用這個字段進行查詢,而Field.UnIndexed就不能進行查詢了。但是由于 Field.Keyword不切分,所以當使用new Term(searchkey,searchfield)進行查詢時,給出的searchkey必須與vaue參數值完全一致才會查詢出來,而 Field.Text和Field.UnStored則就不一樣


Lucene中國是一個非常好的網站,對Lucene內部結構進行了詳細的分析,可以參考。