2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、搜索引擎開發(fā)實(shí)踐第二講全文檢索與Lucene簡介,主講人: 羅剛luogang@gmail.com,概 述,作業(yè)講解:Lucene源代碼項(xiàng)目倒排索引的原理 Lucene的整體結(jié)構(gòu)Lucene基本概念Lucene3.0常用API的介紹與使用Lucene中的壓縮算法,作業(yè)講解:Lucene源代碼項(xiàng)目,從SVN下載Lucene源代碼TortoiseSVN Export https://svn.apache.org/

2、repos/asf/lucene/dev/trunk/lucene把Lucene源代碼導(dǎo)入Eclipse,倒排索引的來源,人工編的名詞索引,第4頁,倒排索引的原理,第5頁,,1,2,4,3,5,排序后的索引詞:,文檔:,北京,武漢,天津,上海,大連,,,,,,,,,,,,,,Lucene中的倒排索引,第6頁,文檔1: When in Rome, do as the Romans do.文檔2: When do you come ba

3、ck from Rome?,停用詞: in, as, the, from,.tis,.frq,.prx,查詢詞,,折半查找,Lucene中的基本概念,索引(Index):文檔的集合組成索引。和一般的數(shù)據(jù)庫不一樣,Lucene不支持定義主鍵,但Solr支持。為了方便索引大量的文檔,Lucene中的一個索引分成若干個子索引,叫做段(segment)。段中包含了一些可搜索的文檔。 文檔(Document):代表索引庫中的一條記錄。

4、一個文檔可以包含多個列(Field)。和一般的數(shù)據(jù)庫不一樣,一個文檔的一個列可以有多個值。例如一篇文檔既可以屬于互聯(lián)網(wǎng)類,又可以屬于科技類。列(Field):命名的詞的集合。詞(Term) :由兩個值定義——詞語和這個詞語所出現(xiàn)的列。倒排索引是基于詞(Term)的搜索。,Lucene的整體結(jié)構(gòu),,search(),addDocument(),,Lucene索引庫,IndexWriter,Document:url:http://w

5、ww.lietu.comtitle:獵兔搜索body:內(nèi)容介紹,,IndexSearcher,,Querytitle:NBA,ScoreDoc[]匹配到的文檔,,索引相關(guān)類,Document,Analyzer,IndexWriter,,,Field(Title),Field(Body),Field(URL),一個Document代表索引庫中的一條記錄。一個Document可以包含多個列。例如一篇文章可以包含“標(biāo)題”、“正文”、“

6、修改時間”等field,創(chuàng)建這些列對象以后,可以通過Document的add方法增加這些列到Document實(shí)例。一段有意義的文字通過Analyzer分割成一個個的詞語后寫入到索引庫。,創(chuàng)建索引,//創(chuàng)建新的索引庫IndexWriter index = new IndexWriter(indexDirectory,//索引庫存放的路徑 new StandardAnalyzer(Version.LU

7、CENE_CURRENT), true,//新建索引庫 IndexWriter.MaxFieldLength.UNLIMITED);//不限制列的長度 File dir = new File(sourceDir);indexDir(dir); //索引sourceDir路徑下的文件 index.optimize();//索引優(yōu)化

8、 index.close();//關(guān)閉索引庫,向索引增加文檔,一個索引和一個數(shù)據(jù)庫表類似,但是數(shù)據(jù)庫中是先定義表結(jié)構(gòu)后使用。但Lucene在放數(shù)據(jù)的時候定義字段結(jié)構(gòu)。Document doc = new Document();//創(chuàng)建網(wǎng)址列Field f = new Field(“url”, news.URL , //news.URL 存放url地址的值 Field.Store.YES,

9、Field.Index. NOT_ANALYZED,//不分詞 Field.TermVector.NO);doc.add(f);//創(chuàng)建標(biāo)題列f = new Field(“title”, news.title , //news.title 存放標(biāo)題的值 Field.Store.YES, Field.Index.ANALYZED,//分詞

10、 Field.TermVector.WITH_POSITIONS_OFFSETS);//存Token位置信息doc.add(f);//創(chuàng)建內(nèi)容列f = new Field(“body”, news.body , //news.body 存放內(nèi)容列的值 Field.Store.YES, Field.Index. ANALYZED, //分詞

11、 Field.TermVector.WITH_POSITIONS_OFFSETS); //存Token位置信息doc.add(f);index.addDocument(doc); //把一個文檔加入索引,,IndexSearcher isearcher = new IndexSearcher(directory,//索引路徑 true); //只讀//搜索標(biāo)題列QueryParser parser = ne

12、w QueryParser(Version.LUCENE_CURRENT,"title", analyzer);Query query = parser.parse(“NBA”); //搜索NBA這個詞//返回前1000條搜索結(jié)果ScoreDoc[] hits = isearcher.search(query, 1000).scoreDocs;//遍歷結(jié)果for (int i = 0; i < hit

13、s.length; i++) { Document hitDoc = isearcher.doc(hits[i].doc); System.out.println(hitDoc.get("title"));}isearcher.close();directory.close();,搜索,查詢語法,加權(quán) solr^4 lucene修飾符 + -

14、 NOT +solr lucene 布爾操作符 OR AND (solr OR lucene) AND user按域查詢 title:NBA,QueryParser,QueryParser將輸入查詢字串解析為Lucene Query對象。QueryParser是使用JavaCC(Java Compiler Compiler

15、)工具生成的詞法解析器。QueryParser.jj中定義了查詢語法。需要讓QueryParser更好的支持中文,例如全角空格等?,分析器(Analyzer),分析公司名的流程Analyzer analyzer = new CompanyAnalyzer(); TokenStream ts = analyzer.tokenStream(“title", new StringReader("北京盈智星科

16、技發(fā)展有限公司"));while (ts.incrementToken()) {System.out.println("token: "+ts));},北京盈智星科技發(fā)展有限公司,ComTokenizer,,北京,盈智星,,,ComFilter,北京,盈智星,科技發(fā)展,有限公司,,公司,科技發(fā)展,有限公司,最基本的詞條查詢-TermQuery,一般用于查詢不切分的字段或者基本詞IndexSear

17、cher isearcher = new IndexSearcher(directory, true);//查詢url地址列Term term = new Term("url","http://www.lietu.com");TermQuery query = new TermQuery(term);//返回前1000條結(jié)果ScoreDoc[] hits = isearcher.sear

18、ch(query, 1000).scoreDocs;,布爾邏輯查詢-BooleanQuery,舉例:同時查詢標(biāo)題列和內(nèi)容列QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "body", analyzer);Query bodyQuery = parser.parse("NBA");//查詢內(nèi)容列parser = ne

19、w QueryParser(Version.LUCENE_CURRENT, "title", analyzer);Query titleQuery = parser.parse("NBA");//查詢標(biāo)題列BooleanQuery bodyOrTitleQuery = new BooleanQuery();//用OR條件合并兩個查詢bodyOrTitleQuery.add(bodyQue

20、ry, BooleanClause.Occur.SHOULD);bodyOrTitleQuery.add(titleQuery, BooleanClause.Occur.SHOULD);//返回前1000條結(jié)果ScoreDoc[] hits = isearcher.search(bodyOrTitleQuery, 1000).scoreDocs;,標(biāo)題列包含查詢詞,內(nèi)容列包含查詢詞,布爾查詢的實(shí)現(xiàn)原理,,,,,,,,索引,mad

21、rid 345, 777, 11437,….museum 777, 1234, 4356, 12457,….,,索引,,,777,RangeQuery-區(qū)間查找,例如日期列time按區(qū)間查詢的語法:time:[2007-08-13T00:00:00Z TO 2008-08-13T00:00:00Z] 后臺實(shí)現(xiàn)代碼:ConstantScoreRangeQuery dateQuery = ne

22、w ConstantScoreRangeQuery("time", t1, t2, true, true);,Lucene2.9以前版本區(qū)間查詢的問題,RangeQuery采用擴(kuò)展成TermQuery來實(shí)現(xiàn),如果查詢區(qū)間范圍太大,RangeQuery會導(dǎo)致TooManyClausesExceptionConstantScoreRangeQuery 內(nèi)部采用Filter來實(shí)現(xiàn),當(dāng)索引很大的時候,查詢速度會很慢,Tr

23、ie結(jié)構(gòu)實(shí)現(xiàn)的區(qū)間查詢,在Lucene2.9以后的版本中,用Trie結(jié)構(gòu)索引日期和數(shù)字等類型。例如:把521 這個整數(shù)索引成為:百位是5、十位是52、個位是521。這樣重復(fù)索引的好處是可以用最低的精度搜索匹配區(qū)域的中心地帶,用較高的精度匹配邊界。這樣減少了要搜索的Term數(shù)量。,Trie結(jié)構(gòu)區(qū)間查詢,例如:TrieRange:[423 TO 642] 分解為5個子條件來執(zhí)行:handreds:5 ORtens:[43 TO 49]

24、ORones:[423 TO 429] ORtens:[60 TO 63] ORones:[640 TO 642],使用Trie結(jié)構(gòu)實(shí)現(xiàn)的區(qū)間查詢,索引時,增加一個浮點(diǎn)數(shù)列到索引:document.add(new NumericField("weight").setFloatValue(value));搜索時,使用NumericRangeQuery來查詢這樣的數(shù)字列。例如:Query q = Numeri

25、cRangeQuery.newFloatRange(“weight”, //列名稱 new Float(0.3f), //最小值從它開始 new Float(0.10f),//最大值到它結(jié)束 true, //是否包含最小值 true); //是否包含最大值,用壓縮來改進(jìn)搜索性能,,沒有壓

26、縮前,,壓縮后,壓縮的原理,因?yàn)榇嬖谌哂?,所以可以壓縮。例如生活中的壓縮寫法:同上。壓縮的原理:使用預(yù)測編碼,對前后相似的內(nèi)容壓縮。壓縮的對象字符串?dāng)?shù)組(Term List)整數(shù)數(shù)組(DocId)字符串?dāng)?shù)組排序后使用前綴壓縮整數(shù)數(shù)組排序后使用差分編碼壓縮壓縮算法的兩個過程:編碼(壓縮)過程和解碼(解壓縮)過程。編碼過程可以時間稍長,解碼過程需要速度快。類似ADSL上網(wǎng)機(jī)制:下載速度快,而上傳速度慢。因?yàn)樵谒饕龜?shù)據(jù)階段

27、執(zhí)行編碼過程,而在搜索階段執(zhí)行解碼過程。索引數(shù)據(jù)速度可以稍慢,但是搜索速度不能慢。,前綴編碼(Front Encoding),因?yàn)樗饕~是排序后寫入索引的,所以前后兩個索引詞詞形差別往往不大。前綴壓縮算法省略存儲相鄰兩個單詞的共同前綴。每個詞的存儲格式是:例如:順序存儲如下三個詞:term、termagancy、termagant不用壓縮算法的存儲方式是,例如: 應(yīng)用前綴壓縮算法后,實(shí)際存儲的內(nèi)容如下: ,差分編碼(Di

28、fferential Encoding),變長壓縮算法對于較小的數(shù)字有較好的壓縮比。差分編碼可以把數(shù)組中較大的數(shù)值用較小的數(shù)來表示,所以可以和變長壓縮算法聯(lián)合使用來實(shí)現(xiàn)數(shù)組的壓縮。編碼過程解碼過程例如,排好序的DocId序列:編碼前:345, 777, 11437, …編碼后:345, 432, 10660, …,,,,,,,,,,變長壓縮(Variable byte encoding),VInt是一個變長的正整數(shù)表示

29、格式,是一種整數(shù)的壓縮格式表示方法。每字節(jié)的最高位表明是否有更多的字節(jié)在后面,如果是0表示這個字節(jié)是尾字節(jié),1表示還有后續(xù)字節(jié)。按如下的規(guī)則編碼正整數(shù)x:if (x < 128),則使用一個字節(jié)(最高位置0,低7位表示數(shù)值);if (x< 128*128),則使用2個字節(jié)(第一個字節(jié)最高位置1,低7位表示低位數(shù)值,第二個字節(jié)最高位置0 ,低7位表示高位數(shù)值);依次類推。 把VInt看成是128進(jìn)制的表示方法,低位優(yōu)先,

溫馨提示

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

評論

0/150

提交評論