課件階段15lucence-教案01lucenesolr-day_第1頁
課件階段15lucence-教案01lucenesolr-day_第2頁
課件階段15lucence-教案01lucenesolr-day_第3頁
課件階段15lucence-教案01lucenesolr-day_第4頁
課件階段15lucence-教案01lucenesolr-day_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

課程計Lucene與搜索引擎區(qū)別luceneLuceneLucene(重點需求:使用Lucene完成信息的全文檢索功能開發(fā)如何數(shù)據(jù)LukeField域?qū)傩詫W(xué)習(xí)(重點Query搜索結(jié)果TopDocs(重點什么是全文檢順序掃描法(Serial全文檢索(Full-text——全文檢索是一種將文件中所有文本與檢索項匹配的文字資料檢索方法。全文檢索首先Search據(jù)查詢索引,最終找到包含的文章。整個過程類似于查字典的過程?!瓐D像、活動影像等非結(jié)構(gòu)化數(shù)據(jù)進行綜合管理的大型軟件。本只討本檢索。對于數(shù)據(jù)量大、數(shù)據(jù)結(jié)構(gòu)不固定的數(shù)據(jù)可采用全文檢索方式搜索,比如、等搜索引擎、站內(nèi)搜索、站內(nèi)搜索等。什么是Luceneapache下的一個開放源代碼的全文檢索引擎工具包。提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟件開發(fā)人員提供一個簡單易用的工Lucene引結(jié)構(gòu)等功能。例如:搜索、eclipse幫助搜索、淘寶網(wǎng)商品搜索。對包含這些檢索詞的文章進行排序,最后輸出排序的結(jié)果。全文檢索技術(shù)是搜索引擎的Lucene和搜索引擎不同,Lucenejava或其它語言寫的全文檢索的工具包,為Lucene是開發(fā)全文檢索功能的工具包,從Lucene4.10.3,并解壓。Jdk要求:1.7Luceneorg.apache.lucene.Lucene mon-與、或、非等,生成查詢表達(dá)式,數(shù)據(jù)管理,包括一些I/O操1、數(shù)系 MysqlapiapiJava索引庫索引索引庫索引IOMysql數(shù)據(jù)庫mysql5.1eclipsemysql5.1驅(qū)動包:mysql-connector-java-5.1.7-bin.jarlucene包:lucene-core-4.10.3.jarlucene分析器通用包:lu lucene查詢解析器包:lucene-queryparser-4.10.3.jarjunit包:junit-java工程加入以上jar為什么要數(shù)據(jù)全文檢索要搜索的數(shù)據(jù)信息格式多種多樣,拿搜索引擎(,)來說,通過搜索引擎能搜索互聯(lián)上的網(wǎng)頁(html)、互聯(lián)網(wǎng)上的音樂(mp3..)、(avi..)、pdf電如何數(shù)據(jù)用一種爬蟲程序抓取網(wǎng)頁(httphtml網(wǎng)頁信息:)solrapache庫、xml web數(shù)據(jù)。jsoup(,jsoup是一款Java的HTML解析器,可直接解析某個URLHeritrix針對站內(nèi)搜索功能,全文檢索的數(shù)據(jù)源在數(shù)據(jù)庫中,需要通過jdbc數(shù)據(jù)庫中publicclasspublicclassBookprivateIntegerid;privateStringname;privateFloatprice;privateStringpic;privateStringDaopublicinterfaceBookDao publicList<Book>findBookList()throws}publicclassBookDaoImplimplementsBookDao查詢privatestaticStringsql="SELECT*FROMpublicList<Book>findBookList()throwsExceptionConnectionconnection=預(yù)編譯PreparedStatementpreparedStatement=ResultSetresultSet=List<Book>list=newtryconnection=DriverManager.getConnection("jdbc:mysql://localhost:3306/lucene","root",創(chuàng)建preparedStatementpreparedStatement=resultSet=while(resultSet.next()){Bookbook=new}}catch(Exceptione){}}}}return}}創(chuàng)建文檔是Lucene對索引對外表示的邏輯結(jié)構(gòu),采用NOSql的理念,每個中有很多Field組成,F(xiàn)ield中key/value對即name:XXX,value:XXX創(chuàng)建索引前要將要索引的內(nèi)容用表示,這一步就相當(dāng)于提取非結(jié)構(gòu)數(shù)據(jù)的息然后結(jié)構(gòu)化為形式。創(chuàng)建索引就是針對中的內(nèi)容進行索引確切的說是針對中FieldBookDaoBookDaobookDao=new//從數(shù)據(jù)庫中查 信List<Book>bookList=bookDao.findBookList(); >docs=newArrayList< for(Bookbook:bookList){ = TextFieldid=newTextField("id",//TextFieldname=newTextField("name",book.getName(),//FloatFieldprice=newFloatField("price",//TextFieldpic=newTextField("pic",book.getPic(),//TextFielddescription=newTextField("description",book.getDescription(),Store.YES);}descriptiondescriptionnamenamenamename field的個數(shù)可以不同,建議相同類型的文檔包括相同的field。 對應(yīng)一條book表的記錄。 中field中的value值進行分詞 中的Field的內(nèi)容進行分詞,將分好的詞創(chuàng)建索引,索引=Field:創(chuàng)建索程 1、對原始內(nèi)容信息抽取,并創(chuàng)建文檔2、使用yzer分詞器對文檔中的內(nèi)容進行分詞IndexWriter是索引過程的組件,通過IndexWriter可以創(chuàng)建新索引、更新索引、刪除索引操作。IndexWriter需要通過Directory對索引進行操作。類常用的包括FSDirectory(在文件系統(tǒng)索引、RAMDirectory(在內(nèi)存索引。分詞就是將原始文檔內(nèi)容切分成一個一個的詞也就是將中Field的value值切分成過慮包括去除標(biāo)點符號、去除停用詞(的、是、a、an、the等、大寫轉(zhuǎn)小寫、詞的形態(tài)還Standardyzer,標(biāo)準(zhǔn)分詞器可a/an/the等停用:LuceneisaJavafull-textsearchengine. Luceneisnotacompleteapplication,butratheracodelibraryandAPIthatcaneasilybeusedtoaddsearchcapabilitiestoapplications.yzeryzer=newyzeryzer=newIndexWriterConfigindexWriterConfig=Version.LUCENE_4_10_3, //創(chuàng)建索 流對Directorydirectory=FSDirectory.open(newIndexWriterindexWriter=newIndexWriter(directory,for:docs) }//LukeluceneLukecmd運行 -jarlukeall-索索 1querysql3、IndexSearcher通過IndexReader索引文件中6TopDocs的內(nèi)容展示給用戶。sql一樣,lucene全文檢索也有固定的語法:最基本的有比如:AND,OR,NOT等descriptionjavalucene關(guān)鍵字的文檔。luke搜索的例子:lucene會首先對語法進行分析,判斷語法關(guān)鍵字的正NOT、AND、OR,分別抽取出語法關(guān)鍵字和搜索關(guān)鍵字。比如:輸入搜索關(guān)鍵字“javajavajava和培訓(xùn)有關(guān)根據(jù)關(guān)鍵字從索引中找到索引信息,索引即詞term,term與 了term就找到了關(guān)聯(lián)的 取出Field中的信息即是要搜索的信息。//// yzer=new ////QueryParserqueryParser=newQueryParser("description",Queryquery=queryParser.parse("description:javaAND//索 流對Directorydirectory=FSDirectory.open(new//索 對IndexReaderindexReader=//IndexSearcherindexSearcher=//執(zhí)行搜索,取出符合記錄的前100TopDocstopDocs=indexSearcher.search(query,for(ScoreDocintdocID=doc= Stringid=doc.get("id");Stringname=doc.get("name");Floatprice=Float.parseFloat(doc.get("price"));Stringdescription=doc.get("description"); }}索Field根據(jù)數(shù)據(jù)庫中的信息表結(jié)構(gòu),改造中filed類FieldFieldFieldFieldField,F(xiàn)ield的一個承載體,F(xiàn)ield值即為要索引的內(nèi)容,也是要搜索的內(nèi)容。Field分詞后進行索引也可以對整個Field進行索引。比如:名稱、簡介分詞后進行索引,訂單號、號不用分詞但也要索引,這些將來都要作為查詢條件,如果將來查詢要根據(jù)表的主鍵id查詢,那id也要索3、是否是:將Field值在文檔中,在文檔中的Field才可以從 中獲取的Field都要。否:不Field值,不的Field無法通 據(jù)庫中獲取商品簡介,思路是從lucene索引獲取id,根據(jù)id查詢關(guān)系數(shù)據(jù)庫。FieldFiledFieldField字符NYY或這個Field用來構(gòu)建一個字符串整個串在索引中,比如(訂單是否在文檔中LongYYY或這個Field用來構(gòu)建一個Long數(shù)字型Field多種類NNY這個Field用來構(gòu)建不同類FieldValueStore.NO)YYY或如果是一個Readerlucene猜測內(nèi)容比較多,會采用Unstored的Field修改原來的創(chuàng)建代碼StringFieldid=new//TextFieldname=newTextField("name",book.getName(),//FloatFieldprice=newFloatField("price",//商 ,不分詞,不索引,//TextFielddescription=newTextField("description",book.getDescription(),Store.NO);【索引管理人員通過系統(tǒng)更改信息,這時更新的是數(shù)據(jù)庫,如果使用lucene搜索圖booklucene索引庫。////yzeryzer=newIndexWriterConfigindexWriterConfig=Version.LUCENE_4_10_3, //創(chuàng)建索 流對Directorydirectory=FSDirectory.open(new//QueryParserqueryParser=newQueryParser("description", Queryquery=queryParser.parse("description:javaAND//IndexWriterindexWriter=newIndexWriter(directory, //}方式,所以在創(chuàng)建索引時需要創(chuàng)建一個主鍵Field比如id,它對應(yīng)數(shù)據(jù)庫表中的主鍵,F(xiàn)ield刪除。Lucene3.XLucene的回收站中,可以恢復(fù)刪除的文檔,3.X之后無 Termterm=newTerm("id","1");//doc= //商品idStringFieldid=new//TextFieldnamenewTextField("name","java",// (term,//說明:更新索引是先刪除再添加,根據(jù)term找到匹配field的,并刪除,再添加新的到索引庫。建議將term設(shè)置為主鍵Field這樣根據(jù)主鍵Field只會刪除一搜QueryQuery查詢對象,LuceneQuery查詢對象生成最終的查詢name:luceneFieldname為“l(fā)ucene”的文檔信息。LuceneQueryQuery是一個抽象類,lucene提供了很多查詢對象,比如TermQueryQueryquery=Queryquery=newTermQuery(newTerm("name",QueryParserqueryParser=newQueryParserqueryParser=newQueryParser("name", Queryquery=////IndexReaderreader=//IndexSearcherindexSearcher=new//NumericRangeQuery<Long>numericRangeQuery=.newLongRangeNumericRangeQuery<Long>numericRangeQuery=.newLongRange("price",0l,200l,true,//.newLongRange("price",0l,200l,true,////BooleanBooleanQuerybooleanQuery=new//price0200//IndexSearchersearcher=newIndexSearcher(reader);Occur.MUSTandOccur.SHOULDorOccur.MUST_NOTnot非MUSTMUST_NOTMUST_NOT所對應(yīng)得查詢子句的檢索結(jié)SHOULDMUST_NOTMUST和MUST_NOTSHOULDMUST連用時,結(jié)果為MUST子句的檢索結(jié)果,SHOULDMUST_NOTMUST_NOTOccur.MUST_NOT//fQueryParserqueryParser=newQueryParser("f",descriptionQueryquery2=Queryquery2=上邊介紹的基于類的查詢方法,使用QueryParserFieldName:FieldName:[minTO索建議使用NumericRangeQuery。+price:[0TO200]price0200name為“java”,必須滿足與BooleanQueryOccur+(加號 AND關(guān)鍵字OR:關(guān)鍵字 OR關(guān)鍵字NOT:關(guān)鍵字 NOT關(guān)鍵字12String[]fields= Queryquery=queryParser.parse("java");匹配搜索條件的錄頂部匹配記錄,Searchn條記錄:indexSearcher.search(queryn),n表示指定中文分詞yzeryzer是一個抽象類在Lucene的lu mon包中提供了很多分析器,比如:org.apache.lucene.ysis.standard.standardyzer標(biāo)準(zhǔn)分詞器,它是Lucene的=toknewLowerCaseFilter(getVersiontok);//在標(biāo)準(zhǔn)分詞過濾器的基礎(chǔ)上加大小寫轉(zhuǎn)換過濾tok=newStopFilter(getVersion(),tok,stopwords);//在上邊過濾器基礎(chǔ)上加停用詞過濾Tokenizer是分詞器,負(fù)責(zé)將reader轉(zhuǎn)換為語匯單元即進行分詞,Lucene提供了很多的分詞器,也可以使用第的分詞,比如IK yzer一個中文分詞器。IloveChina,love和China很容易被程序區(qū)分開是:我愛中國。Lucene 二分法分詞:按兩個字進行切分。如:“我人”,效果:“我是”、“是中”、“中國”“國上邊兩個分詞器需求第產(chǎn)品介 IKyzerjava2006年121.0IKyzer4Luence2012版本中,IKIK分詞器從單純的詞典分詞向模用Chih-HaoTsai的MMSeg算法()實現(xiàn)的中文分詞器,并實現(xiàn)lucene的yze

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論