第十五階段lucene技術(shù)教案_第1頁(yè)
第十五階段lucene技術(shù)教案_第2頁(yè)
第十五階段lucene技術(shù)教案_第3頁(yè)
第十五階段lucene技術(shù)教案_第4頁(yè)
第十五階段lucene技術(shù)教案_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Lucene介L(zhǎng)uceneapache下的一個(gè)開源的全文檢索引擎工具包。它為軟件開發(fā)人員提供一個(gè)簡(jiǎn)站內(nèi)搜索(關(guān)注SearchLucene實(shí)現(xiàn)全文檢索的流索程:即數(shù)據(jù)→構(gòu)建文檔對(duì)象→分析文檔(分詞)→創(chuàng)建索引3程使用Lucene實(shí)現(xiàn)項(xiàng)目中類商品的索引和搜索功能JdkIde環(huán)境:eclipseLucene安Lucene是開發(fā)全文檢索功能的工具包,使用時(shí)從,并解壓。:目前版本地址:JDK要求:1.7以上(4.81.7以下工程搭建(兩步j(luò)avajarjar 索為什么要數(shù)索引擎能搜索互聯(lián)上的網(wǎng)頁(yè)(html)、互聯(lián)網(wǎng)上的音樂(mp3..)、(avi..)、pdf電子非結(jié)構(gòu)化數(shù)據(jù):指不定長(zhǎng)或無固定格式的數(shù)據(jù),如郵件,word文檔等。like查詢,likelike如何數(shù)2、如果數(shù)據(jù)在數(shù)據(jù)庫(kù)中就連接數(shù)據(jù)庫(kù)表中的數(shù)據(jù)網(wǎng)頁(yè)(了解((httphtml網(wǎng)頁(yè)信息庫(kù)、xml)solrapache jsoup址、HTMLAPIDOM,CSS Heritrix數(shù)據(jù)庫(kù)(掌握針對(duì)站內(nèi)搜索功能,全文檢索的數(shù)據(jù)源在數(shù)據(jù)庫(kù)中,需要通過jdbc數(shù)據(jù)庫(kù)bookpublicpublicclassBook privateInteger//名privateString//價(jià)privateFloat//privateString//描privateString}publicpublicinterfaceBookDao publicList<Book>queryBookList()throws}publicclassBookDaoImplimplementsBookDaopublicList<Book>queryBookList()throwsExceptionConnectionconnection=預(yù)編譯PreparedStatementpreparedStatement=ResultSetresultSet=列List<Book>list=newtryconnection=DriverManager.getConnection("jdbc:mysql://localhost:3306/solr","root","root");SQLStringsql="SELECT*FROM創(chuàng)建preparedStatement=resultSet=while(resultSet.next()){Bookbook=newBook();}}catch(Exceptione){}return}}Field(域descriptiondescriptionbooknamebooknamebooknamebookname field的個(gè)數(shù)可以不同,建議相同類型的文檔包括相同的field。 對(duì)應(yīng)一條book表的記錄。 中的Field的內(nèi)容進(jìn)行分詞,將分好的詞創(chuàng)建索引,索引=Field:創(chuàng)建索程索 索 除索引操作。IndexWriter需要通過Directory對(duì)索引進(jìn)行操作。個(gè)抽象類,它的子類常用的包括FSDirectory(在文件系統(tǒng)索引、RAMDirectory(在內(nèi)存索引。創(chuàng)數(shù)據(jù)的目的是為了索引,在索引前需要將原始內(nèi)容創(chuàng)建成文檔 , (Field代碼實(shí)BookDaodao=newList<Book>list=>docList=newdoc=for(Bookbook:list)//創(chuàng) doc= 根據(jù)需求創(chuàng)建不同的Fieldid=newTextField("id",book.getId().toString(), Fieldname=newTextField("name",book.getName(),Store.YES);Fieldprice=newTextField("price",Fieldpic=newTextField("pic",book.getPic(),Store.YES);Fielddesc=newTextField("description",book.getDescription(),}分分詞過Docuemnt分詞就是將到的文檔內(nèi)容切分成一個(gè)一個(gè)的詞具體應(yīng)該說是將中過慮包括去除標(biāo)點(diǎn)符號(hào)、去除停用詞(的、是、a、an、the等、大寫轉(zhuǎn)小寫、詞的形 注意由于語言不同分析器的切分規(guī)則也不同,本例子使用Standard ponents ponents(finalStringfieldName,finalreader)finalStandardTokenizersrc=newStandardTokenizer(getVersion(),reader);TokenStreamtok=newStandardFilter(getVersion(),src);tok=newLowerCaseFilter(getVersion(),tok);tok=newStopFilter(getVersion(),tok,returnnew ponents(src,tok){protectedvoidsetReader(finalReaderreader)throwsIOException{ }}如下是 yzer的部分源碼Tokenizer是分詞器,負(fù)責(zé)將reader轉(zhuǎn)換為語匯單元即進(jìn)行分詞,Lucene提供了很多的分詞器,也可以使用第的分詞,比如IK yzer一個(gè)中文分詞器。Lucene提供了很多的分詞器過濾器,比如大小寫轉(zhuǎn)換、去除停用詞等。從一個(gè)Reader字符流開始,創(chuàng)建一個(gè)基于Reader的TokenizerLuceneLuceneisaJavafull-textsearch例如:信息里面,名稱中的java和描述中的java對(duì)應(yīng)不同的代碼實(shí) yzer=new 創(chuàng)建索////分析文檔,對(duì)文檔中的field域進(jìn)行分 yzer=new aDirectorydirectory=FSDirectory.open(newFile("E:\\11-b創(chuàng)建IndexWriterConfigIndexWriterConfigcfg=new c創(chuàng)建IndexWriterIndexWriterwriter=newIndexWriter(directory,//d)通過IndexWriter對(duì)象添加文檔對(duì)象 for :docList) }f關(guān)閉IndexWriterLuke查看Luke作為L(zhǎng)ucene工具包中的一個(gè)工具(可以通過界面來Luke命令運(yùn)行:cmd運(yùn)行 索索 sql語句。3、IndexReader索引對(duì)象,它對(duì)應(yīng)的索引對(duì)象IndexWriter,IndexSearcher通IndexReader索 4、Directory索對(duì)象,IndexReader需要Directory索引庫(kù),使用FSDirectory文件系sql一樣,lucene全文檢索也有固定的語法:最基本的有比如:AND,OR,NOT等descriptionjavalucene關(guān)鍵字的文檔。它對(duì)應(yīng)的查詢語句:description:javaANDlucene比如:輸入搜索關(guān)鍵字“javajavajava和培訓(xùn)有關(guān)根據(jù)關(guān)鍵字從索引中找到對(duì)應(yīng)的索引信息,即詞term。term與 了term就找到了關(guān)聯(lián)的 取出Field中的信息即是要搜索的信息。查詢查詢索publicvoidsearcherIndex()throwsException1(Query對(duì)象 yzer=newQueryParserqueryParser=newQueryquery=queryParser.parse("description:javaAND2a)Directorydirectory=FSDirectory.open(newFile("E:\\11-b)創(chuàng)建IndexReaderIndexReaderreader=c)創(chuàng)建IndexSearcherIndexSearchersearcher=newd)通過IndexSearcher對(duì)象執(zhí)行查詢索引庫(kù),返回TopDocsTopDocstopDocs=searcher.search(query,e)提取TopDocs對(duì)象中前nScoreDoc[]scoreDocs=topDocs.scoreDocs;System.out.println("查詢出文檔個(gè)數(shù)為:topDocs.totalHits);for(ScoreDocscoreDoc:scoreDocs){文檔對(duì)象intdocId=doc=f)System.out.println("文檔id:"+docId); id:"+doc.get("id")); name:"+doc.get("name")); price:"+doc.get("price")); pic:"+doc.get("pic")); description:"+}g)關(guān)閉IndexReader}FieldFieldFieldFieldField值兩部分,一個(gè)文檔可以包括多個(gè)Field,F(xiàn)ield的一個(gè)承載體,F(xiàn)ield值即為要索引的內(nèi)容,也是要搜索的內(nèi)容。是否分詞是否索引是否是:將Field值在文檔中,在文檔中的Field才可以從 中獲取的Field都要。否:不Field值,不的Field無法通過 FieldFiledFieldField字符NYY或這個(gè)Field用來構(gòu)建一個(gè)字符串整個(gè)串在索引中,比如(訂單號(hào),號(hào)等)是否在文檔中LongYYY或這個(gè)Field用來構(gòu)建一個(gè)Long數(shù)字型Field,進(jìn)行分詞和索引,比是否在文檔中多種類NNY這個(gè)Field用來構(gòu)建不同類不分析,不索引,但要Field在檔FieldValueStore.NO)YYY或如果是一個(gè)Readerlucene猜測(cè)內(nèi)容比較多,會(huì)采用Unstored的Fieldid:id來搜索商品是否索引:不索引,因?yàn)椴恍枰鶕?jù)ID進(jìn)行搜索是否:要,因?yàn)椴樵兘Y(jié)果頁(yè)面需要使用id這個(gè)值是否分詞:要分詞,因?yàn)橐獙⒌拿Q內(nèi)容分詞索引,根據(jù)關(guān)鍵搜索名稱抽取的詞。是否:要是 不是來不在lucene的索引文件中記錄,節(jié)省lucene的索引文件空間,如果要在詳情頁(yè)從lucene中取出的id,根據(jù)的id查詢關(guān)系數(shù)據(jù)庫(kù)中book表得到描述信息//////參數(shù):、域中的內(nèi)容、是//不分詞、索引、//Fieldid=newTextField("id",//Fieldid=newStoredField("id",book.getId().toString(),//名分詞、索引Fieldbookname=newTextField("bookname",book.getName(),//價(jià)分詞、索引Fieldprice=newFloatField("price",book.getPrice(),////不分詞、不索引、Fieldpic=newStoredField("pic", 描//分詞、索引、Fielddescription=newTextField("description",book.getDescription(),Store.NO);索引管理人員通過系統(tǒng)更改信息,這時(shí)更新的是數(shù)據(jù)庫(kù),如果使用lucene搜索圖booklucene索引庫(kù)。調(diào)用indexWriter.add 參考程序的創(chuàng)建索引。刪除索刪除索publicvoiddeleteIndex()throwsException1、指定索引Directorydirectory=FSDirectory.open(newFile("E:\\11-2、創(chuàng)建IndexWriterConfigcfg=newnew //3建IndexWriterwriter=newIndexWriter(directory,4、通過IndexWriter來刪除索b)、刪除指定索 s(newTerm("filename",5、關(guān)閉IndexWriter}刪除全部索引(慎用將索 publicvoiddeleteIndex()throwsException1Directorydirectory=FSDirectory.open(newFile("E:\\11-2、創(chuàng)建IndexWriterConfigcfg=newnew 3IndexWriterwriter=newIndexWriter(directory,4、通過IndexWriter//a)、刪除全部索引5、關(guān)閉IndexWriter}Field,F(xiàn)ield刪除。Lucene的回收站中,Lucene3.X版本可以恢復(fù)刪除的文檔,3.X之后修改修改索publicvoidupdateIndex()throwsException1、指定索引Directorydirectory=FSDirectory.open(newFile("E:\\11-2、創(chuàng)建IndexWriterConfigcfg=newnew //3建IndexWriterwriter=newIndexWriter(directory,4、通過IndexWriter來修改索a)、創(chuàng)建修改后的文檔對(duì)= 文件名FieldfilenameField=newStringField("filename","updateIndex",//// (newTerm("filename",5、關(guān)閉}搜Query查詢對(duì)象,LuceneQuery查詢對(duì)象生成最終的查詢name:lucene”Fieldname為“l(fā)ucene”的文檔信息。LuceneQueryQuery是一個(gè)抽象類,lucene提供了很多查詢對(duì)象,比如TermQueryNumericRangeQuery數(shù)字范圍查詢等。 Queryquery=newTermQuery(newTerm("name", QueryParserqueryParser=newQueryParserqueryParser=newQueryParser("name",newQueryquery=QueryprivatevoiddoSearch(Queryquery){IndexReaderreader=null;tryprivatevoiddoSearch(Queryquery){IndexReaderreader=null;trya指定索引Directoryindexdirectory=FSDirectory.open(newFile(b創(chuàng)建IndexReader對(duì)reader=c創(chuàng)建IndexSearcher對(duì)IndexSearchersearcher=new//d)通過IndexSearcher對(duì)象執(zhí)行查詢索引庫(kù),返回TopDocs對(duì)//第一個(gè)參數(shù):查詢//第二個(gè)參數(shù):最大的n條記TopDocstopDocs=searcher.search(query,//e)提取TopDocs對(duì)象中的文檔ID,如何找出對(duì)應(yīng)的ScoreDoc[]scoreDocs=System.out.println("總共查詢出的結(jié)果總數(shù)為:topDocs.totalHits);for(ScoreDocscoreDoc:scoreDocs)文檔對(duì)象intdocId=scoreDoc.doc;doc=searcher.doc(docId);f輸出文檔內(nèi)}}catch(IOExceptione){}finallyif(reader!=null)try{}catch(IOExceptione){}}}}publicvoidtestTermQuery()throwsException1建查詢(Query對(duì)象Queryquery=newTermQuery(newTerm("filename",2行搜}publicvoidtestNumbericRangeQuery()throwsException創(chuàng)建查第一個(gè)參數(shù)//第二個(gè)參數(shù):最小//第三個(gè)參數(shù):最大//第四個(gè)參數(shù):是否包含最小//第五個(gè)參數(shù):是否包含最大Queryquery=NumericRangeQuery.newLongRange("size",1l,100l,2行搜}publicvoidbooleanQuery()throwsException{BooleanQueryquery=publicvoidbooleanQuery()throwsException{BooleanQueryquery=newQueryquery1=newTermQuery(newTerm("id",Queryquery2=NumericRangeQuery.newFloatRange("price",10f,true,//MUST:查詢條件必須滿足,相當(dāng)于//SHOULD:查詢條件可選,相當(dāng)于query.add(query1,Occur.MUST);query.add(query2,Occur.SHOULD);}3、MUST_NOT和MUST_NOT4、SHOULDMUST表示MUST,SHOULD5、SHOUlDMUST_NOT相當(dāng)于MUSTMUST_NOT6、SHOULDSHOULDQueryParserQueryParserQuery,QueryParserParse方法,此方法可以直接根據(jù)查詢語法來查詢。QuerySystem.out.println(query);查詢。代碼實(shí)publicvoidtestQueryParser()throwsException創(chuàng)建//第一個(gè)參數(shù):默//第二個(gè)參數(shù):分詞QueryParserqueryParser=newQueryParser("name",newIK//指定查詢語法,如果不指定域,就搜索默認(rèn)的域QueryqueryqueryParser.parse("lucene");2行搜}查詢語+++“:”+[TO最大值]例如:size:[1TO1000]索建議使用NumericRangeQuery+(加號(hào)+++12:必須滿足第一個(gè)條件,忽略第二個(gè)條件例如:+filename:apachecontent:apache12:兩個(gè)條件滿足其一即可。例如:filename:apachecontent:apache4)-1211AND1OR1NOTpublicvoidpublicvoidtestMultiFieldQueryParser()throwsException//可以指定默認(rèn)搜索的域是多String[]fields={"name","description"http://創(chuàng)建一個(gè)MulitFiledQueryParser對(duì)QueryParserparser=newMultiFieldQueryParser(fields,new //指定查詢語法,如果不指定域,就搜索默認(rèn)的Queryquery=2行搜}匹配搜索條件的錄,相關(guān)度排Lucene對(duì)查詢關(guān)鍵字和索引文檔的相關(guān)度進(jìn)行打分,得分高的就排邊。如何打分呢Term在此文檔中出現(xiàn)了多少次。tfLucene技術(shù)的。Frequency(df):Term。df文檔包含此詞(Term),說明此詞(Term)太普通,不足以區(qū)分這些文檔,因而重要性越低。boost1.0f,在索引時(shí)對(duì)某個(gè)文檔中的field設(shè)置值高,在搜索時(shí)匹配到這個(gè)文檔就可能排設(shè)置boost是給域(field)或 設(shè)置的FieldBoost1.0f。一旦設(shè)定,除非刪除此文檔,否則無法改變。代碼實(shí)publicvoidsetBoost4createIndex()throwsException創(chuàng)建分詞 yzer=new IndexWriterConfigcfg=newIndexWriterConfig(Version.LUCENE_4_10_3,Directorydirectory=FSDirectory.open(newFile("E:\\11-//創(chuàng)建IndexWriter對(duì)象,通過它把分好的詞寫到索引庫(kù)IndexWriterwriter=newIndexWriter(directory,doc=Fieldid=newStringField("id","11",FielddescriptionnewTextField("description測(cè)試設(shè)置BOOSTlucene",//設(shè)置boost//把域添加到文檔 關(guān)閉IndexWriter}輸代碼實(shí)輸未設(shè) 值中文分詞格

溫馨提示

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

評(píng)論

0/150

提交評(píng)論