heyjava播客全文檢索lucene_第1頁
heyjava播客全文檢索lucene_第2頁
heyjava播客全文檢索lucene_第3頁
heyjava播客全文檢索lucene_第4頁
heyjava播客全文檢索lucene_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1. 信息檢索與全文檢索引擎 Lucene 簡介1.1. 信息檢索的概念息檢索就是從信息集合中找出與用戶需求相關(guān)的信息。被檢索的 息除了文本外,還有圖像、音頻、等多信息,只文本的檢索。1.2. 信息檢索技術(shù)的分類目前信息檢索技術(shù)可分為 3 類:全文檢索:把用戶的查詢請求和全文中的每一個(gè)詞進(jìn)行比較,不考慮查詢請求與文本語義上的匹配。在信息檢索工具中,全文檢索是最具通用性和實(shí)用性的。數(shù)據(jù)檢索:查詢要求和信息系統(tǒng)中的數(shù)據(jù)都遵循一定的格式,具有一定的結(jié)構(gòu),允許對特定的字段檢索。其性能與使用有很大的局限性,并且支持語義匹配的能知識檢索:強(qiáng)調(diào)的是基于知識的、語義上的匹配。較差。要學(xué)習(xí)的就是全文檢索技術(shù)。為

2、應(yīng)用程序添加全文檢索的功能。1.3. 信息檢索的基本流程以下以在中搜索為例,說明信息檢索的基本流程步驟 :1, 在搜索框中輸入一段文本或幾個(gè)關(guān)鍵字(用戶需求)2, 搜索引擎( 息檢索系統(tǒng))從互聯(lián)網(wǎng)( 息集合)中找出包含這些的若干網(wǎng)頁(相關(guān)信息),并按照一定的準(zhǔn)則(相關(guān)度)排序,然后將部分結(jié)果返回(分頁)說明:1, 搜索的速度很快,是毫秒級的。如 2009-9-21 搜索“播客”時(shí),有如下提示:“一下,找到相關(guān)網(wǎng)頁約 96,900 篇,用時(shí) 0.002 秒”2, 結(jié)果列 中越靠前的,就是最符合所預(yù)期的結(jié)果,一般在第 1 頁中就可以找到想要的文章,越往后翻就越離題。這是因?yàn)榻Y(jié)果列 是按照相關(guān)度排過

3、序的3, 在返回的結(jié)果中頁面中,每條結(jié)果只顯示網(wǎng)頁的部分內(nèi)容,并且把搜索的關(guān)鍵字以不同的顏色顯示()。批注: 只是知道一下就可以了,不應(yīng)進(jìn)行對比1.4. 信息檢索與數(shù)據(jù)庫的搜索對比數(shù)據(jù)庫的搜索不能實(shí)現(xiàn)的全文檢索的要求,原因如下:1, 匹配效果:如搜索 ant,在 sql 中使用like %ant%是會搜索出 planting 的,但他不應(yīng)出現(xiàn)。批注: 是指計(jì)算機(jī)索引程序通過掃描文章中的每一個(gè)詞,對每一個(gè)詞建立一個(gè)索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當(dāng)用戶查詢時(shí),檢索程序就根據(jù)事先建立的索引進(jìn)行查找,并將查找的結(jié)果反饋給用戶的檢索方式。批注: 數(shù)據(jù)檢索查詢要求和信息系統(tǒng)中的數(shù)據(jù)都遵循一定的格

4、式,具有一定的結(jié)構(gòu),特定的字段檢索。例如,數(shù)據(jù)均按“時(shí)間、人物、地點(diǎn)、事件”的形式 ,查詢可以為:地點(diǎn)=“”。 數(shù)據(jù)檢索的性能取決于所使 用的標(biāo)識字段的方法和用戶 對這種方法的理解,因此具有很大的局限性。2, 查出的結(jié)果沒有相關(guān)度排序,不知道有用的結(jié)果在哪一頁。3, 搜索速度太慢,達(dá)不到毫秒級的要求。1.5. 全文檢索中的建立索引與進(jìn)行檢索的流程搜索的目的是為了在大量的信息中發(fā)現(xiàn)自己感的信息。但是,當(dāng)有了足夠的資料(比如網(wǎng)頁、Word 文檔、Pdf 文檔,或數(shù)據(jù)庫中的資料等)之后,并不能立即開始搜索,在此之前,必須先對信息建立索引。就好比在館里存放著大量書籍,當(dāng)想查找關(guān)于某個(gè)的書籍時(shí),不能一本

5、一本的翻閱,書進(jìn)入到先查閱書籍的索引卡,根據(jù)索引卡上的信息找到相應(yīng)的書籍。所以,當(dāng)一本館后,最重要的工作就是要馬上建立索引卡。同樣,對于所擁用的信息,也需要為其建立索引。建立索引,就是對待搜索的信息進(jìn)行一定的分析,并將分析結(jié)果按照一定的組織方式起來,通常將這些結(jié)果在文件中。分析結(jié)果的文件的集合就是索引。在查詢時(shí),先從索引中查找,由于索引是按照一定的結(jié)構(gòu)組織的,所以查詢的速度非??臁榱颂峁z索的功能,信息檢索系統(tǒng)會事先做一些準(zhǔn)備工作:信息與加工。信息:把信息源的信息拷貝到本地,待檢索的信息集合。(信息源可以是互聯(lián)網(wǎng)中的網(wǎng)頁、電腦中的 txt、doc、ppt、pdf 等格式的電子文檔,或是文件系

6、統(tǒng)上的文件等等)。信息加工:為到本地的信息編排索引,為查詢做好準(zhǔn)備。流程如下:輸入要搜索文本.html用戶搜索的過程.doc索引庫建立索引建立索引的過程說明:在ernet 上 每一個(gè)網(wǎng)頁,每ernet 上信息的被稱為爬蟲或蜘蛛,或稱做網(wǎng)絡(luò)機(jī)器人。爬蟲在一個(gè)網(wǎng)頁就把其中的內(nèi)容傳回本地服務(wù)器。信息加工最主要的任務(wù)就是為到本地的信息編排索引,為查詢做好準(zhǔn)備。就好比在傳統(tǒng)的編目工作中,管理員需要對書籍進(jìn)行分類、標(biāo)引、并撰寫摘要。信息加工的過程的過程和編目過程類似,但全部由計(jì)算機(jī)自動完成。.pdf加工/分析分析.txt批注: 如果信息檢索系統(tǒng)在用戶發(fā)出了檢索請求后再去互聯(lián)網(wǎng)上找,根本無法在有限的時(shí)間返回

7、結(jié)果。批注: 這里使用管理的例子2. 分詞器2.1. 分詞器的作用分詞器,對文本資源進(jìn)行切分,將文本按規(guī)則切分為一個(gè)個(gè)可以進(jìn)行索引的最小鍵詞)。(關(guān)一段文本,如下:“在ernet上信息的被叫做爬蟲或蜘蛛?!眅rnet信息切分好的爬蟲蜘蛛某文檔中的一段文本,經(jīng)過分詞后如下:建立索引和進(jìn)行搜索時(shí)都要用到分詞器。為了保證能正確的搜索到結(jié)果,在建立索引與進(jìn)行搜索時(shí)使用的分詞器應(yīng)是同一個(gè)。2.2. 英文分詞(分詞器的工作流程)英文分詞過程大致如下:輸入文本說明:形態(tài)還原,是去除單詞詞尾的形態(tài)變化,將其還原為詞的。如下所示:批注: 或叫做詞干抽取,比如將running 還原為runworked work轉(zhuǎn)

8、為小寫形態(tài)還原去除停用詞關(guān)建詞切分12345678910111213在ernet上信息的被叫做爬蟲或蜘蛛。分詞器working work studies study如對“IndexWriter adds a javadoc.txt”進(jìn)行分詞:1)切分詞 “IndexWriter”、“ add排除停用詞 “IndexWriter”、“ add形態(tài)還原 “IndexWriter”、“ add轉(zhuǎn)為小寫“IndexWriter”、“ adds”、“a”、“ javadoc.txt”2)s”、“ javadoc.txt”3)”、“ javadoc.txt”4)”、“ javadoc.txt”2.3. 中

9、文分詞中文的文詞比較復(fù)雜,因?yàn)椴皇且粋€(gè)字就是一個(gè)詞,而且一個(gè)詞在另外一個(gè)地方就可能不是一個(gè)詞,如在“帽子和服裝”中,“和服”就不是一個(gè)詞。對于中文分詞,通常有三種方式:單字分詞、二分法分詞、詞典分詞。單字分詞:就是按照中文一個(gè)字一個(gè)字地進(jìn)行分詞。如:“效果:“我”、“們”、“是”、“中”、“國”、“人”。(Standard人”,yzer 就是這樣)。二分法分詞:按兩個(gè)字進(jìn)行切分。如:“人”,效果:“”、“們是”、“是中”、“中國”、“國人”。(CJKyzer 就是這樣)。詞典分詞:按某種算法構(gòu)造詞,然后去匹配已建好的詞庫集合,如果匹配到就切分出來成為詞語。通常詞庫分詞被認(rèn)為是最理想的中文分詞算

10、法。如:“人”,效果為:“或者是“”、“”。(使用極易分詞的 MMyzer)??梢允褂谩皹O易分詞”,分詞”分詞器。2.4. 停用詞有些詞在文本中出現(xiàn)的頻率非常高,而且對文本所攜帶的信息基本不產(chǎn)生影響,例如英文的“a、an、the、of”,或中文的“的、了、著”,以及各種標(biāo)點(diǎn)符號等,這樣的詞稱為停用詞(stop word)。文本經(jīng)過分詞之后,停用詞通常被過濾掉,不會被進(jìn)行索引。在檢索的時(shí)候,用戶的查詢中如果含有停用詞,檢索系統(tǒng)也會將其過濾掉(因?yàn)橛脩糨斎氲牟樵冏址惨M(jìn)行分詞處理)。排除停用詞可以加快建立索引的速度,還可以減小索引文件的大小。測試分詞器3. 倒排序索引結(jié)構(gòu)3.1. 索引文件結(jié)構(gòu)

11、倒排索引,索引對象是文檔中的單詞等,用來這些單詞在一個(gè)文檔中的位置。例如,有些書在最后提供的索引(單詞頁碼 的對應(yīng)列表),就可以看成是一種倒排序索引??梢酝ㄟ^一些關(guān)鍵字,在全書中檢索出與之相關(guān)的部分。詞匯表以上只是用于說明倒排序索引的結(jié)構(gòu),最終的索引結(jié)構(gòu)要復(fù)雜的多,還要在文本中的位置(或是首字母的字符位置)等信息。3.2. 索引文件的檢索與詞匯表規(guī)模相對較小,文檔集合規(guī)模較大。進(jìn)行檢索時(shí),先從檢索詞匯表開始,然后找到相對應(yīng)的文檔。如果查詢中僅包含一個(gè)文檔就可以了。如果查詢中包含多個(gè),則在詞匯表中找到該單詞,并取出他對應(yīng)的,則需要將各個(gè)單詞檢索出的進(jìn)行合并。倒排索引有三個(gè)操作:、刪除和更新文檔。

12、但是更新操作需要較高的代價(jià)。因?yàn)樗诘奈臋n1,3信息1,51,2,5 文檔集合文檔 1文檔 2文檔 3文檔 4文檔 5public sic void prKeywords(yzeryzer, String content)throws Exception System.out.prln(- 分詞器: +yzer.getClass();Reader reader = new StringReader(content);TokenStream tokenStream =yzer.tokenStream(content, reader);Token token = new Token();while

13、 (token = tokenStream.next(token) != null) System.out.prln(token);文檔修改后(即使是很小的修改),就可能會造成文檔中的很多的的位置都發(fā)生了變化,這就需要頻繁的和修改,這種代價(jià)是相當(dāng)高的。因此,一般不進(jìn)行更新操作,而是使用“先刪除,后創(chuàng)建”的方式代替更新操作。4. Lucene 介紹與初步使用(oWorld)4.1. Lucene 介紹Lucene 是一個(gè)高性能、可伸縮的全文檢索工具包??梢允褂盟麨槟愕膽?yīng)用程序添加索引和搜索能力。Lucene 的作者 Doug Cutting 是資深的全文檢索。最初,Lucene 以開源的形式出現(xiàn)

14、在SourceFet 上。2001 年,Lucene 加入了 Apache 旗下的 Jakarta 項(xiàng)目。2005 年,Lucene 正式脫離Jakarta 成為 Apache 旗下的頂級項(xiàng)目。現(xiàn)在,Lucene 的主頁為:。有很多應(yīng)用程序使用 Lucene 來提供全文檢索的功能,如經(jīng)常使用的 Eclipse 的幫助子系統(tǒng),就是使用 Lucene 實(shí)現(xiàn)的。(在第一次使用的時(shí)候,會有一個(gè)進(jìn)度條,那是在創(chuàng)建索引)。批注:karta-lucene/eredBy4.2.oWorld 程序(索引與搜索)添加 jar 包lucene-core-2.4.0.jar();lucene-yzers-2.4.0.

15、jar(分詞器);lucene-highlighter-2.4.0.jar(器);4.2.1.建立索引/* 創(chuàng)建索引*/ Testpublic void createIndex() throws Exception / file - docdoc = File2Utils.file2(filePath);/ 建立索引IndexWriter indexWriter =new IndexWriter(indexPath,yzer, true, MaxFieldLength.LIMITED); indexWriter.add(doc);indexWriter.close();4.2.2.搜索4.2.

16、3.練習(xí):使用 Lucene 進(jìn)行索引與搜索完成建立索引與搜索的兩個(gè)方法。5. LuceneIndex完成對索引的增刪改查。5.1. 創(chuàng)建索引的方案定時(shí)重新創(chuàng)建索引同步創(chuàng)建索引/* 搜索 */ Testpublic void search() throws Exception String queryString = ;/ 1,把要搜索的文本為 QueryString fields = name, content ;QueryParser queryParser = new MultiFieldQueryParser(fields,yzer); Query query = queryParsa

17、rse(queryString);/ 2,進(jìn)行查詢IndexSearcher indexSearcher = new IndexSearcher(indexPath); Filter filter = null;TopDocs topDocs = indexSearcher.search(query, filter, 10000); System.out.prln(總共有【+topDocs.totalHits+】條匹配結(jié)果);/ 3,打印結(jié)果for(ScoreDoc scoreDoc : topDocs.scoreDocs) docSn = scoreDoc.doc; / 文檔doc = in

18、dexSearcher.doc(docSn); / 根據(jù)取出相應(yīng)的文檔File2Utils.prInfo(doc); / 打印出文檔信息異步任務(wù)創(chuàng)建索引6. Lucene 使用6.1. 工具類 DateTools、NumberTools在對屬性值進(jìn)行大小比較時(shí)(通常是使用范圍查詢,比較數(shù)字類型的時(shí)候),是按照字符串的比較規(guī)則,因?yàn)樗麄兌际寝D(zhuǎn)成字符串后的。這樣就會出現(xiàn)問題,如 “20”是大于“100”的(根據(jù)字符串的比較規(guī)則)。解決的方法是:讓數(shù)字轉(zhuǎn)成的字符串具有相同的位數(shù),如位數(shù),就 面補(bǔ)相應(yīng)數(shù)量個(gè)“0”。數(shù)字到符串、字符串到數(shù)字的轉(zhuǎn)換可以使用 Lucene 提供的工具類 NumberTool

19、s 完成。對于日期與字符串的雙向轉(zhuǎn)換,則可以使用 Lucene 提供的 DateTools 完成。DateTools:轉(zhuǎn)換日期的工具類,第二個(gè) Resolution 參數(shù)可以指定日期的精度。指定Resolution 中的常量值。NumberTools:轉(zhuǎn)換數(shù)字的工具類,把數(shù)字轉(zhuǎn)為 36 進(jìn)制的字符串。6.1. Highligher可以截取一段文本(生成摘要),并且讓關(guān)鍵字顯示(通過指定前綴與后綴實(shí)現(xiàn),因?yàn)槭窃诰W(wǎng)頁中顯示,指定“”,“”,就會在網(wǎng)頁中顯示為紅色)。6.2. 查詢查詢對象TermQuery RangeQueryWildcardQueryPhraseQuery短語查詢public v

20、oid add(Term term,ition)public void setSlop(s)例:add( new Term(“name”, “l(fā)ucene”, 1);add(new Term(“name”, “代表搜索的是“Lucene ?”, 3);”,?表示中間隔一個(gè)詞。setSlop(2);代表這兩個(gè)詞中間可以最多隔 2 個(gè)詞批注: 如果指定了多個(gè)詞,則是各個(gè)詞之間的隔的數(shù)量的的和Querypublic void add(Query query, Occur occur)Occur 用于表示查詢子句關(guān)系的類,包括:Occur.MUST,Occur.MUST_NOT,Occur.SHOUL

21、D。1, MUST 和MUST:取得連個(gè)查詢子句的交集。2, MUST 和MUST_NOT:包含 MUST 并且查詢結(jié)果中不包含 MUST_NOT 的檢索結(jié)果。3, SHOULD 與SHOULD,表示“或”關(guān)系,最終檢索結(jié)果為所有檢索子句的并集。使用時(shí)注意:1, MUST 和SHOULD:此時(shí) SHOULD 無意義,結(jié)果為 MUST 子句的檢索結(jié)果。2, MUST_NOT 和MUST_NOT:無意義,檢索無結(jié)果。3, MUST_NOT 和SHOULD: 此時(shí)SHOULD 相當(dāng)于MUST,結(jié)果同 MUST 和MUST NOT。4, 單獨(dú)使用 SHOULD:結(jié)果相當(dāng)于 MUST。5, 單獨(dú)使用MU

22、ST_NOT:無意義,檢索無結(jié)果。查詢語法要使用QueryParser 與MultiFieldQueryParser 進(jìn)行指定默認(rèn)的組合關(guān)系。“+”與“-”:表示后面的條件是“MUST”,還是“MUST_NOT” “AND”:“OR”:“NOT”:“+”、“-”與“AND”、“OR”同時(shí)使用時(shí):可以使用括號“(”和“)”,對邏輯進(jìn)行組合6.3. 排序相關(guān)度排序得分的boost 屬性:. setBoost(float boost)Field 的boost 屬性:Field. setBoost(float boost)查詢時(shí)指定: MultiFieldQueryParser(String fiel

23、ds,按指定字段排序yzeryzer, Map boosts)public Sort(SortField field) public Sort(SortField fields)6.4. 過濾器RangeFilter,可以對搜索出來的結(jié)果進(jìn)行過濾。練習(xí):Web 文件搜索功能 1:建立索引功能 2:進(jìn)行搜索,分頁顯示,關(guān)鍵字,點(diǎn)擊可以打開小窗口查看文件內(nèi)容7. Compass7.1. 介紹是對進(jìn)行的封裝。pass 對于 Lucene,就好像 Hibernate 對于 Jdbc。在使用時(shí)用到的類(除分詞器外),都是使用的 Compass 的。7.2. 使用1, 添加 jar 包2, 定義可搜索的對

24、象a)應(yīng)使用一個(gè)單獨(dú)的類,專門用于搜索的,只需定義在搜索結(jié)果頁面中需要顯示(用到)的屬性。b)c)d)在類上searchable, 說明這是可以被搜索的類在有唯一標(biāo)識作用的屬性上searchableId,這個(gè)必須要有。在屬性(getter)上searchProperty,并指定 Store 與 Index 策略,還可以指定 boost3, 初始化 Compasssetting name=compass.engine.highlighter.default.formatter.simple.pre value= /setting name=compass.engine.highlighter.default.formatter.simple.t value= /a)b)c)d)CompassConfiguration cfg = new CompassConfiguration();cfg.setConnection(./index/); / 設(shè)置索引目錄

溫馨提示

  • 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

提交評論