今天將“Lucene學(xué)習(xí)”里面的程序貼到eclipse工程里實(shí)現(xiàn)了一下
加深了我對(duì)檢索的理解
在全文檢索中,可以和數(shù)據(jù)庫(kù)進(jìn)行一個(gè)簡(jiǎn)單的對(duì)比
全文檢索沒有表的概念,也就沒有固定的fields,但是有記錄,每一個(gè)記錄就是一個(gè)Document對(duì)象
每一個(gè)document都可以有自己不同的fields,如下:
Document doc = new Document();
doc.add(Field.Keyword("filename",file.getAbsolutePath()));
//以下兩句只能取一句,前者是索引不存儲(chǔ),后者是索引且存儲(chǔ)
//doc.add(Field.Text("content",new FileReader(file)));
doc.add(Field.Text("content",this.chgFileToString(file)));
indexWriter.addDocument(doc);
在查詢的時(shí)候,需要三個(gè)重要的參數(shù)
首先是庫(kù)路徑,即在哪個(gè)庫(kù)里面進(jìn)行檢索(相當(dāng)于database的路徑):
Searcher searcher = new IndexSearcher(dbpath);
然后就是你以哪個(gè)字段,查詢什么關(guān)鍵詞,因?yàn)楦鶕?jù)字段就可以得到字段對(duì)應(yīng)的內(nèi)容
在得到的內(nèi)容中檢索你的關(guān)鍵詞,這個(gè)累死sql語句,只不過沒有表的概念
Query query
= QueryParser.parse(searchkey,searchfield,new StandardAnalyzer());
然后開始查詢,查詢的結(jié)果就是document的集合:
Hits hits = searcher.search(query);
對(duì)得到的集合進(jìn)行處理:
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方法如下:
切分詞 就是指對(duì)文本進(jìn)行切詞,用于進(jìn)行索引,上面可以看到切分的都會(huì)進(jìn)行索引;索引即用于通過搜索詞進(jìn)行查詢;存儲(chǔ)表示是否存儲(chǔ)內(nèi)容本身。上面的 Field.Keyword方法就不切分但是可以索引,所以可以用這個(gè)字段進(jìn)行查詢,而Field.UnIndexed就不能進(jìn)行查詢了。但是由于 Field.Keyword不切分,所以當(dāng)使用new Term(searchkey,searchfield)進(jìn)行查詢時(shí),給出的searchkey必須與vaue參數(shù)值完全一致才會(huì)查詢出來,而 Field.Text和Field.UnStored則就不一樣。
Lucene中國(guó)是一個(gè)非常好的網(wǎng)站,對(duì)Lucene內(nèi)部結(jié)構(gòu)進(jìn)行了詳細(xì)的分析,可以參考。
加深了我對(duì)檢索的理解
在全文檢索中,可以和數(shù)據(jù)庫(kù)進(jìn)行一個(gè)簡(jiǎn)單的對(duì)比
全文檢索沒有表的概念,也就沒有固定的fields,但是有記錄,每一個(gè)記錄就是一個(gè)Document對(duì)象
每一個(gè)document都可以有自己不同的fields,如下:
Document doc = new Document();
doc.add(Field.Keyword("filename",file.getAbsolutePath()));
//以下兩句只能取一句,前者是索引不存儲(chǔ),后者是索引且存儲(chǔ)
//doc.add(Field.Text("content",new FileReader(file)));
doc.add(Field.Text("content",this.chgFileToString(file)));
indexWriter.addDocument(doc);
在查詢的時(shí)候,需要三個(gè)重要的參數(shù)
首先是庫(kù)路徑,即在哪個(gè)庫(kù)里面進(jìn)行檢索(相當(dāng)于database的路徑):
Searcher searcher = new IndexSearcher(dbpath);
然后就是你以哪個(gè)字段,查詢什么關(guān)鍵詞,因?yàn)楦鶕?jù)字段就可以得到字段對(duì)應(yīng)的內(nèi)容
在得到的內(nèi)容中檢索你的關(guān)鍵詞,這個(gè)累死sql語句,只不過沒有表的概念
Query query
= QueryParser.parse(searchkey,searchfield,new StandardAnalyzer());
然后開始查詢,查詢的結(jié)果就是document的集合:
Hits hits = searcher.search(query);
對(duì)得到的集合進(jìn)行處理:
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方法如下:
方法 |
切詞 |
索引 |
存儲(chǔ) |
用途 |
Field.Text(String name, String value) |
Yes |
Yes |
Yes |
切分詞索引并存儲(chǔ),比如:標(biāo)題,內(nèi)容字段 |
Field.Text(String name, Reader value) |
Yes |
Yes |
No |
切分詞索引不存儲(chǔ),比如:META信息, 不用于返回顯示,但需要進(jìn)行檢索內(nèi)容 |
Field.Keyword(String name, String value) |
No |
Yes |
Yes |
不切分索引并存儲(chǔ),比如:日期字段 |
Field.UnIndexed(String name, String value) |
No |
No |
Yes |
不索引,只存儲(chǔ),比如:文件路徑 |
Field.UnStored(String name, String value) |
Yes |
Yes |
No |
只全文索引,不存儲(chǔ) |
切分詞 就是指對(duì)文本進(jìn)行切詞,用于進(jìn)行索引,上面可以看到切分的都會(huì)進(jìn)行索引;索引即用于通過搜索詞進(jìn)行查詢;存儲(chǔ)表示是否存儲(chǔ)內(nèi)容本身。上面的 Field.Keyword方法就不切分但是可以索引,所以可以用這個(gè)字段進(jìn)行查詢,而Field.UnIndexed就不能進(jìn)行查詢了。但是由于 Field.Keyword不切分,所以當(dāng)使用new Term(searchkey,searchfield)進(jìn)行查詢時(shí),給出的searchkey必須與vaue參數(shù)值完全一致才會(huì)查詢出來,而 Field.Text和Field.UnStored則就不一樣。
Lucene中國(guó)是一個(gè)非常好的網(wǎng)站,對(duì)Lucene內(nèi)部結(jié)構(gòu)進(jìn)行了詳細(xì)的分析,可以參考。