Chapter2lucene框架基礎.ppt_第1頁
Chapter2lucene框架基礎.ppt_第2頁
Chapter2lucene框架基礎.ppt_第3頁
Chapter2lucene框架基礎.ppt_第4頁
Chapter2lucene框架基礎.ppt_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Chapter2 lucene框架基礎,陳珂銳 計算機與信息工程學院,目錄,1.Lucene簡介 2.預備知識-類圖 3.Lucene類圖 4.入門實例,1. Lucene簡介,1.1 什么是Lucene 1.2 全文檢索系統(tǒng)的結構 1.3 為什么使用Lucene 1.4 Lucene版本號 1.5 Lucene移植版本 1.6 Lucene倒排索引原理 1.7 基于Lucene的搜索程序 1.8 Nutch,1.1 什么是Lucene,Lucene是非常優(yōu)秀的成熟的開源的免費的純java語言的全文索引檢索工具包。 全文檢索是指計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當用戶查詢時,檢索程序就根據(jù)事先建立的索引進行查找,并將查找的結果反饋給用戶的檢索方式。 Lucene是一個高性能、可伸縮的信息搜索(IR)庫。 Information Retrieval (IR) library.它使你可以為你的應用程序添加索引和搜索能力。 Lucene的作者Doug Cutting是資深的全文索引/檢索專家,最開始發(fā)布在他本人的主頁上,2001年10月貢獻給APACHE,成為APACHE基金的一個子項目。 /lucene/ Lucene是一個IR庫而不是現(xiàn)成的產(chǎn)品, 當然也不是Lucene的初識者常常認為的web爬行器,1.2 全文檢索系統(tǒng)的結構,1.3 為什么使用Lucene,Lucene具有如下突出的優(yōu)點: (1)索引文件格式獨立于應用平臺。Lucene定義了一套以8位字節(jié)為基礎的索引文件格式,使得兼容系統(tǒng)或者不同平臺的應用能夠共享建立的索引文件。 (2)在傳統(tǒng)全文檢索引擎的倒排索引的基礎上,實現(xiàn)了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然后通過與原有索引的合并,達到優(yōu)化的目的。 (3)優(yōu)秀的面向對象的系統(tǒng)架構,使得對于Lucene擴展的學習難度降低,方便擴充新功能。 (4)設計了獨立于語言和文件格式的文本分析接口,索引器通過接受Token流完成索引文件的創(chuàng)立,用戶擴展新的語言和文件格式,只需要實現(xiàn)文本分析的接口。 (5)已經(jīng)默認實現(xiàn)了一套強大的查詢引擎,用戶無需編寫代碼,系統(tǒng)可獲得強大的查詢能力,Lucene的查詢中默認實現(xiàn)了布爾操作、模糊查詢(Fuzzy Search)、分組查詢等等。 開源,可擴展能力強,有各種語言版本,適合各種平臺,1.4 Lucene版本號(1),1.4 Lucene版本號(2),1.5 Lucene 移植版本,Lucene implementations in languages other than Java: CLucene - Lucene implementation in C+ dotLucene - Lucene implementation in .NET Lucene4c - Lucene implementation in C LuceneKit - Lucene implementation in Objective-C (Cocoa/GNUstep support) Lupy - Lucene implementation in Python (RETIRED) NLucene - another Lucene implementation in .NET (out of date) Zend Search - Lucene implementation in the Zend Framework for PHP 5 Plucene - Lucene implementation in Perl KinoSearch - a new Lucene implementation in Perl PyLucene - GCJ-compiled version of Java Lucene integrated with Python MUTIS - Lucene implementation in Delphi Ferret - Lucene implementation in Ruby,1.6 Lucene倒排索引原理,假設有兩篇文章1和2 文章1: Tom lives in Guangzhou,I live in Guangzhou too. 文章2: He once lived in Shanghai. 經(jīng)過分詞處理后 文章1的所有關鍵詞為:tom live guangzhou i live guangzhou 文章2的所有關鍵詞為:he live shanghai 加上“出現(xiàn)頻率”和“出現(xiàn)位置”信息后,我們的索引結構為:,Lucene只關注文本的索引和搜索!,1.7 基于Lucene的搜索程序,ActiveMath - a user adaptive, interactive and web-based learning environment for mathematics Aduna AutoFocus - a visual desktop search tool Aduna Metadata Server - RDF-based indexing server for metadata and full text Ahahi - a search engine (web,news,image,forum,crawler) Affiliate Ranker - an affiliate program search engine Bigsearch.ca - uses nutch, based on lucene open source software to deliver its search results. BibleDesktop - A Bible study program using lucene to search Bibles,/jakarta-lucene/PoweredBy,1.7 基于Lucene的搜索程序,Bixee - Search Engine for Jobs in India. BNCF Opac - Online Public Access Catalog, indexing data in unimarcslim format Australia Unclassified - Australias 100% FREE online classifieds service Celoxis - web based project management tool CodeCrawler - is a smart, web-based search engine specifically built for use by developers for searching source code. Coolposting - a search engine for discussion forums. Coolposting helps you find the real solutions, experiences and opinions people have posted in different discussion forums. Corinis CCM - a web content management and community system CvMail - web based tool for recruiters (to manage job-applications by mail) ,1.8 Nutch,Nutch 是一個剛剛誕生開放源代碼(open-source)的web搜索引擎。 Nutch是采用Lucene核心的一個web搜索引擎的實現(xiàn) Nutch使用Lucene進行索引,所以所有的Lucene工具和API都可以在Nutch生成的索引上工作。 它是一個真正的應用程序。也就是說,你可以直接下載下來拿過來用。它在Lucene的基礎上加了網(wǎng)絡爬蟲和一些和Web相關的東東。其目的就是想從一個簡單的站內(nèi)索引和搜索推廣到全球網(wǎng)絡的搜索上,像Google和Yahoo一樣。當然,和那些巨人競爭,你得動一些腦筋,想一些辦法。,2. 預備知識類圖,3. Lucene類圖,3. Lucene類圖,3.1 基礎封裝類 3.2 索引核心類 3.3 term 3.4 field 3.5 document 3.6 段(segment),3.1 基礎封裝類,1.org.apache.lucene.util定義了一些常量和優(yōu)化過的常用的數(shù)據(jù)結構和算法。 Arrays:數(shù)組的排序方法的靜態(tài)類,提供了優(yōu)化的基于快排序的排序方法sort BitVectorC/C+語言中位域的java實現(xiàn)品,但是加入了序列化能力 Constants常量靜態(tài)類,定義了一些常量 PriorityQueue一個優(yōu)先隊列的抽象類,用于后面實現(xiàn)各種具體的優(yōu)先隊列,提供常數(shù)時間內(nèi)的最小元素訪問能力,內(nèi)部實現(xiàn)機制是哈析表和堆排序算法 2. org.apache.lucene.document文檔(document)和域(field)概念的一個類定義,3.2 索引核心類,1. org.apache.lucene.store包 。存儲抽象是唯一能夠直接對索引文件存取的包,因此其主要目的是抽象出和平臺文件系統(tǒng)無關的存儲抽象,提供諸如目錄服務(增、刪文件)、輸入流和輸出流 2. org.apache.lucene.index包,3.2 索引核心類-store,整個org.apache.lucene.store中主要的繼承體系共有三個抽象類定義: Directory InputStream OutputStrem,3.2 索引核心類-store,構成了一個完整的基于抽象文件系統(tǒng)的存取體系結構,在此基礎上,實作出了兩個實現(xiàn)品:(FSDirectory,F(xiàn)SInputStream,F(xiàn)SOutputStream)和(RAMDirectory,RAMInputStream和RAMOutputStream)。 前者是以實際的文件系統(tǒng)做為基礎實現(xiàn)的,后者則是建立在內(nèi)存中的虛擬文件系統(tǒng)。前者主要用來永久的保存索引文件,后者的作用則在于索引操作時是在內(nèi)存中建立小的索引,然后一次性的輸出合并到文件中去,這一點我們在后面的索引邏輯部分能夠看到。,3.2 索引核心類-store,此外,還定以了org.apache.lucene.store.lock和org.apache.lucene.store.with兩個輔助內(nèi)部實現(xiàn)的類用在實現(xiàn)Directory方法的makeLock的時候,以在鎖定索引讀寫之前來讓客戶程序做一些準備工作 。 (FSDirectory,F(xiàn)SInputStream,F(xiàn)SOutputStream)的內(nèi)部實現(xiàn)依托于java語言中的io類庫,只是簡單的做了一個外部邏輯的包裝,3.2 索引核心類-store,(RAMDirectory,RAMInputStream和RAMOutputStream)的內(nèi)部實現(xiàn)就比較直接了,直接采用了虛擬的文件RAMFile類 。RAMFile中采用數(shù)組來表示文件的存儲空間 Lucene中存儲抽象這部分設計時采用了工廠模式(Factory parttern),3.2 索引核心類-store,3.2 索引核心類-store,3.2 索引核心類-store,3.2 索引核心類-index,是一個承上啟下的索引核心部分。無論是對外接口中的查詢,還是分析各種文本以進一步生成索引,都需要直接調(diào)用這部分來獲得對索引文件的訪問能力 。 上邊的基礎類已經(jīng)設計了DOCUMENT,FIELD,因此實際上Lucene在這部分需要完善的概念結構還有segment和term。,3.3 term,項(Term)所表示的是一個字符串,它擁有域、頻數(shù)和位置信息等等屬性。因此,Lucene中設計了兩個類來表示這個概念: Term TermInfo,3.3 term,上圖中,有意的突出了類Term和TermInfo中的數(shù)據(jù)成員,因為它反映了對于項(Term)這個概念的具體表示。同時上圖中也同時列出了用于永久化項(Term)的代理類TermInfosWriter和TermInfosReader,它們完成永久化的功能,需要注意的是,TermInfosReader內(nèi)部使用了數(shù)組indexTerms和indexInfos來存儲一系列項;而TermInfosWriter則是一個類似于鏈表的結構,通過一個other指向下一個TermInfosWriter,每一個TermInfosWriter只負責本身那個lastTerm和lastTi的永久化工作。這是一個設計上的技巧,通過批量讀?。ɑ蛘叻Q為緩沖的方式)來獲得讀入時候的效率優(yōu)化;而通過一個鏈表式的、各負其責的方式,來獲得寫出時候的設計簡化。,3.3 term,項(term)這部分的設計中,還有一些重要的接口和類,我們先介紹如下,同樣我們也先展示UML圖,3.3 term,TermEnum、TermDocs與TermPositions,第一個是抽象類,后兩個都是接口。TermEnum的設計主要用在后面Segment和Document等等的實現(xiàn)中,以提供枚舉其中每一個項(Term)的能力。TermDocs是一個接口,用來繼承以提供返回值對的能力,通過這個接口就可以獲得某個項(Term)在某個文檔中出現(xiàn)的頻數(shù)。TermPositions則是在TermDocs上的擴展,將項(Term)在文檔中的位置信息也表示出來。TermDocs(TermPositions)接口的使用方式類似于java中的Enumration接口,即通過next方法跳轉,通過doc,freq等方法獲得當前的屬性值。,3.4 field,由于Field的基本概念在org.apache.lucene.document中已經(jīng)做了定義,因此在這部分主要是針對項文件(.fnm文件、.fdx文件、.fdt文件)所需要的信息再來設計一些類。,域表和存取邏輯的UML圖:,3.4 field,FieldInfos即為域表的概念表示,內(nèi)部采用了冗余的方式以獲取在通過域的編號訪問或者通過域的名字來訪問時候的高效率。FieldsReader與FieldsWriter則分別是寫出和讀入的代理類,3.5 document,Document的設計基本上沿用了鏈表的處理方法。左邊的Document類作為一個數(shù)據(jù)外包類,用來提供對于內(nèi)部結構DocumentFieldList的增加刪除訪問操作等等。DocumentFieldList才是實際上的數(shù)據(jù)存儲單位,它用了鏈表的處理方法,直接指向一個當前的Field對象和下一個DocumentFieldList對象,這個與前面的類似。為了能夠逐個訪問鏈表中的節(jié)點,還設計了DocumentFieldEnumeration枚舉類。,3.5 document,3.5 document,3.6 段(segment),段(Segment)這一部分設計的比較特殊,在實現(xiàn)簡單的對象結構之上,還特意的設計了用于段之間合并的類,3.6 段(segment),Lucene定義了一個類SegmentInfo用來表示每一個段(Segment)的信息,包括名字(name)、含有的文檔的數(shù)目(docCount)和段所位于的目錄的位置(dir)。根據(jù)索引文件中的段的意義,有了這三點,就能唯一確定一個段了。SegmentInfos這個類則是用來表示一個段的鏈表(從標準的java.util.Vector繼承而來),實際上,也就是索引(index)的意思了。需要注意的是,這里并沒有在SegmentInfo中安插一個文檔(documen

溫馨提示

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

評論

0/150

提交評論