用Lucene檢索數(shù)據(jù)庫_第1頁
用Lucene檢索數(shù)據(jù)庫_第2頁
用Lucene檢索數(shù)據(jù)庫_第3頁
用Lucene檢索數(shù)據(jù)庫_第4頁
用Lucene檢索數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、用lucene檢索數(shù)據(jù)庫1.寫一段傳統(tǒng)的jdbc程序,講每條的用戶信息從數(shù)據(jù)庫讀取出來2.針對每條用戶記錄,建立一個(gè)lucene document document doc = new document();并根據(jù)你的需要,將用戶信息的各個(gè)字段對應(yīng)luncene document中的field 進(jìn)行添加,如: doc.add(new field(name,username,field.store.yes,field.index.un_tokenized);然后將該條doc加入到索引中, 如: lucenewriter.adddocument(doc);這樣就建立了lucene的索引庫3.編寫對

2、索引庫的搜索程序(看lucene文檔),通過對lucene的索引庫的查找,你可以快速找到對應(yīng)記錄的id4.通過id到數(shù)據(jù)庫中查找相關(guān)記錄 用lucene索引數(shù)據(jù)庫lucene,作為一種全文搜索的輔助工具,為我們進(jìn)行條件搜索,無論是像google,baidu之類的搜索引擎,還是論壇中的搜索功能,還是其它 c/s架構(gòu)的搜索,都帶來了極大的便利和比較高的效率。本文主要是利用lucene對ms sql server 2000進(jìn)行建立索引,然后進(jìn)行全文索引。至于數(shù)據(jù)庫的內(nèi)容,可以是網(wǎng)頁的內(nèi)容,還是其它的。本文中數(shù)據(jù)庫的內(nèi)容是圖書館管理系統(tǒng)中的某個(gè)作者表 authors表。 因?yàn)榭紤]到篇幅的問題,所以該文

3、不會講的很詳細(xì),也不可能講的很深。本文以這樣的結(jié)構(gòu)進(jìn)行:1.介紹數(shù)據(jù)庫中authors表的結(jié)構(gòu)2.為數(shù)據(jù)庫建立索引3.為數(shù)據(jù)庫建立查詢功能4.在web界面下進(jìn)行查詢并顯示結(jié)果1介紹數(shù)據(jù)庫中authors表的結(jié)構(gòu)字段名稱 字段類型 字段含義au_id varchar(11) 作者號au_name varchar(60) 作者名phone char(12) 電話號碼address varchar(40) 地址city varchar(20) 城市state char(2) 省份zip char(5) 郵編contract bit(1) 外鍵(關(guān)系不大)表中的部分內(nèi)容:2為數(shù)據(jù)庫建立索引首先建立一個(gè)

4、類testlucene.java。這個(gè)類就是對數(shù)據(jù)庫進(jìn)行建立索引,編寫查詢條件等。當(dāng)然,最開始就是建立數(shù)據(jù)庫連接。連接代碼這里就省略了。_接著,新建一個(gè)方法getresutl(string),它返回的是數(shù)據(jù)庫表authors的內(nèi)容。具體代碼如下: public resultset getresult(string sql) try statement stmt = conn.createstatement(); resultset rs = stmt.executequery(sql); return rs; catch(sqlexception e) system.out.println(e

5、); return null; 然后,為數(shù)據(jù)庫建立索引。首先要定義一個(gè)indexwriter(),它是將索引寫進(jìn)lucene自己的數(shù)據(jù)庫中,它存放的位置是有你自己定義的。在定義 indexwriter 是需要指定它的分析器。lucene自己自帶有幾個(gè)分析器,例如:standaranalyzer(),simpleanalyzer(), stopanalyzer()等。它作用是對文本進(jìn)行分析,判斷如何進(jìn)行切詞。接著,要定義一個(gè)document。document相當(dāng)于二維表中一行數(shù)據(jù)一樣。document里包含的是field字段,field相當(dāng)于數(shù)據(jù)庫中一列,也就是一個(gè)屬性,一個(gè)字段。最后應(yīng)該對in

6、dexwriter進(jìn)行優(yōu)化,方法很簡單,就是writer.optimize().具體代碼如下: public void index(resultset rs) try indexwriter writer = new indexwriter(d:/index/, getanalyzer(), true); while(rs.next() document doc=new document(); doc.add(field.keyword(id,rs.getstring(au_id); doc.add(field.text(name,rs.getstring(au_name); doc.add(

7、field.unindexed(address,rs.getstring(address); doc.add(field.unindexed(phone,rs.getstring(phone); doc.add(field.text(city,rs.getstring(city); writer.adddocument(doc); writer.optimize(); writer.close(); catch(ioexception e) system.out.println(e); catch(sqlexception e) system.out.println(e); public an

8、alyzer getanalyzer() return new standardanalyzer(); 3為數(shù)據(jù)庫建立查詢功能在類testlucene中建立一個(gè)新的方法searcher(string),它返回的是一個(gè)搜索的結(jié)構(gòu)集,相當(dāng)于數(shù)據(jù)庫中的resultset一樣。它代的參數(shù)是你要查詢的內(nèi)容。這里,我把要查詢的字段寫死了。你可以在添加一個(gè)參數(shù)表示要查詢的字段。這里主要有兩個(gè)對象indexsearcher和query。indexsearcher是找到索引數(shù)據(jù)庫,query是處理搜索,它包含了三個(gè)參數(shù):查詢內(nèi)容,查詢字段,分析器。具體代碼如下: public hits seacher(stri

9、ng querystring) hits hits=null; try indexsearcher is = new indexsearcher(d:/index/); query query=queryparser.parse(querystring,city,getanalyzer(); hits=is.search(query); catch(exception e) system.out.print(e); return hits; 4在web界面下進(jìn)行查詢并顯示結(jié)果這里建立一個(gè)jsp頁面testlucene.jsp進(jìn)行搜索。在testlucene.jsp頁面中首先引入類 然后定義一個(gè)

10、lucenetest對象,獲取查詢結(jié)果集: lucenttest lucent=new lucenttest(); hits hits=lucent.seacher(request.getparameter(querystring);定義一個(gè)form,建立一個(gè)查詢環(huán)境: 顯示查詢結(jié)果: 作者號 作者名 地址 電話號碼 % for(int i=0;i 用lucene-1.3-final為網(wǎng)站數(shù)據(jù)庫建立索引下是看了lnboy寫的用lucene建立大富翁論壇的全文檢索后寫的測試代碼。 為數(shù)據(jù)庫cwb.mdb建立全文索引的indexdb.jsp 用于顯示查詢結(jié)果的aftsearch.jsp % str

11、ingkeyword=request.getparameter(keyword); keyword=newstring(keyword.getbytes(iso8859_1); out.println(keyword); try stringaa=getservletcontext().getrealpath(/)+index; searchersearcher=newindexsearcher(aa); queryquery=queryparser.parse(keyword,article_name,newstandardanalyzer(); out.println(正在查找:+quer

12、y.tostring(article_name)+); hitshits=searcher.search(query); system.out.println(hits.length()+totalmatchingdocuments); java.text.numberformatformat=java.text.numberformat.getnumberinstance(); for(inti=0;ihits.length();i+) /開始輸出查詢結(jié)果 documentdoc=hits.doc(i); out.println(doc.get(article_id); out.printl

13、n(準(zhǔn)確度為:+format.format(hits.score(i)*100.0)+%); out.println(doc.get(article_name)+); /out.println(doc.get(article_intro); catch(exceptione) out.println(出錯(cuò)了+e.getclass()+n錯(cuò)誤信息為:+e.getmessage(); % 輔助類: packagelucene; importorg.apache.lucene.document.document; importorg.apache.lucene.document.field; imp

14、ortorg.apache.lucene.document.datefield; publicclassmydocument publicstaticdocumentdocument(stringarticle_id,stringarticle_name,stringarticle_intro) documentdoc=newdocument(); doc.add(field.keyword(article_id,article_id); doc.add(field.text(article_name,article_name); doc.add(field.text(article_intr

15、o,article_intro); returndoc; publicmydocument() 用lucene為數(shù)據(jù)庫搜索建立增量索引用lucene建立索引不可能每次都重新開始建立,而是按照新增加的記錄,一次次的遞增建立索引的indexwriter類,有三個(gè)參數(shù)indexwriterwriter=newindexwriter(path,newstandardanalyzer(),isempty);其中第三個(gè)參數(shù)是bool型的,指定它可以確定是增量索引,還是重建索引.對于從數(shù)據(jù)庫中讀取的記錄,譬如要為文章建立索引,我們可以記錄文章的id號,然后下次再次建立索引的時(shí)候讀取存下的id號,從此id后往

16、下繼續(xù)增加索引,邏輯如下.建立增量索引,主要代碼如下publicvoidcreateindex(stringpath)statementmystatement=null;stringarticleid=0;/讀取文件,獲得文章id號碼,這里只存最后一篇索引的文章idtryfilereaderfr=newfilereader(*.txt);bufferedreaderbr=newbufferedreader(fr);articleid=br.readline();if(articleid=null|articleid=)articleid=0;br.close();fr.close();catc

17、h(ioexceptione)system.out.println(error343!);e.printstacktrace();try/sql語句,根據(jù)id讀取下面的內(nèi)容stringsqltext=*+articleid;mystatement=conn.createstatement();resultsetrs=mystatement.executequery(sqltext);/寫索引while(rs.next()documentdoc=newdocument();doc.add(field.keyword(*,dateadded);doc.add(field.keyword(*,art

18、icleid);doc.add(field.text(*,url);doc.add(field.text(*,content);doc.add(field.text(*,title);trywriter.adddocument(doc);catch(ioexceptione)e.printstacktrace();/將我索引的最后一篇文章的id寫入文件tryfilewriterfw=newfilewriter(*.txt);printwriterout=newprintwriter(fw);out.close();fw.close();catch(ioexceptione)e.printstacktrace();ind.close();system.out.println(ok.end);catch(sqlexceptione)e.printstacktrace();finally/數(shù)據(jù)庫關(guān)閉操作然后控制是都建立增量索引的時(shí)候根據(jù)能否都到id值

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論