今天將“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方法如下:


方法

切詞

索引

存儲(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ì)的分析,可以參考。