今天將“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內部結構進行了詳細的分析,可以參考。