乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Lucence的結(jié)構(gòu) - neuron - 計(jì)世博客

       軟件團(tuán)隊(duì)頭目 2006-12-21

      本文主要討論Lucene的系統(tǒng)結(jié)構(gòu),希望對(duì)其結(jié)構(gòu)的初步分析,更深入的了解Lucene的運(yùn)作機(jī)制,從而實(shí)現(xiàn)對(duì)Lucene的功能擴(kuò)展。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->1. <!--[endif]-->Lucene的包結(jié)構(gòu)

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !vml]--><!--[endif]-->

      如上圖所示,Lucene源碼中共包括7個(gè)子包,每個(gè)包完成特定的功能:

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      Lucene包結(jié)構(gòu)功能表

      包名

      功能

      org.apache.lucene.analysis

      語(yǔ)言分析器,主要用于的切詞,支持中文主要是擴(kuò)展此類

      org.apache.lucene.document

      索引存儲(chǔ)時(shí)的文檔結(jié)構(gòu)管理,類似于關(guān)系型數(shù)據(jù)庫(kù)的表結(jié)構(gòu)

      org.apache.lucene.index

      索引管理,包括索引建立、刪除等

      org.apache.lucene.queryParser

      查詢分析器,實(shí)現(xiàn)查詢關(guān)鍵詞間的運(yùn)算,如與、或、非等

      org.apache.lucene.search

      檢索管理,根據(jù)查詢條件,檢索得到結(jié)果

      org.apache.lucene.store

      數(shù)據(jù)存儲(chǔ)管理,主要包括一些底層的I/O操作

      org.apache.lucene.util

      一些公用類

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->2. <!--[endif]-->Lucene的主要邏輯圖

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      Lucene功能強(qiáng)大,但從根本上說,主要包括兩塊:一是文本內(nèi)容經(jīng)切詞后索引入庫(kù);二是根據(jù)查詢條件返回結(jié)果。

      以下是上述兩大功能的邏輯圖:

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      STORAGE

      (存儲(chǔ)器)

      ACCESS INDEX

      (訪問索引)

      SERACHER

      (查詢器)

      ANALYZER

      (語(yǔ)言分析器)

      QUERY PARSER

      (查詢分析器)

      DOCUMENT

      (文檔結(jié)構(gòu))

      SEARCHER

      (查詢)

      INDEXER

      (入庫(kù))

       

      FS

       

      BDD

       

      RAM

      Lucene功能邏輯圖

      <!--[if !vml]-->
      <!--[endif]--><!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->


      查詢邏輯

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      按先后順序,查詢邏輯可分為如下幾步:

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->1.  <!--[endif]-->查詢者輸入查詢條件
      條件之間可以通過特定運(yùn)算符進(jìn)行運(yùn)算,比如查詢希望查詢到與“中國(guó)”和“北京”相關(guān)的記錄,但不希望結(jié)果中包括“海淀區(qū)中關(guān)村”,于是輸入條件為“中國(guó)+北京-海淀區(qū)中關(guān)村”;

      <!--[if !supportLists]-->2.  <!--[endif]-->查詢條件被傳達(dá)到查詢分析器中,分析器將將對(duì)“中國(guó)+北京-海淀區(qū)中關(guān)村”進(jìn)行分析,首先分析器解析字符串的連接符,即這里的加號(hào)和減號(hào),然后對(duì)每個(gè)詞進(jìn)行切詞,一般最小的詞元是兩個(gè)漢字,則中國(guó)和北京兩個(gè)詞不必再切分,但對(duì)海淀區(qū)中關(guān)村需要切分,假設(shè)根據(jù)切詞算法,把該詞切分為“海淀區(qū)”和“中關(guān)村”兩部分,則最后得到的查詢條件可以表示為:“中國(guó)” AND “北京” AND NOT(“海淀區(qū)” AND “中關(guān)村”)。

      <!--[if !supportLists]-->3.  <!--[endif]-->查詢器根據(jù)這個(gè)條件遍歷索引樹,得到查詢結(jié)果,并返回結(jié)果集,返回的結(jié)果集類似于JDBC中的ResultSet

      <!--[if !supportLists]-->4.  <!--[endif]-->將返回的結(jié)果集顯示在查詢結(jié)果頁(yè)面,當(dāng)點(diǎn)擊某一條內(nèi)容時(shí),可以鏈接到原始網(wǎng)頁(yè),也可以打開全文檢索庫(kù)中存儲(chǔ)的網(wǎng)頁(yè)內(nèi)容。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      這就是查詢的邏輯過程,需要說明的是,Lucene默認(rèn)只支持英文,為了便于說明問題,以上查詢過程采用中文舉例,事實(shí)上,當(dāng)Lucene被擴(kuò)充支持中文后就是這么一個(gè)查詢過程。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      入庫(kù)邏輯

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      入庫(kù)將把內(nèi)容加載到全文檢索庫(kù)中,按順序,入庫(kù)邏輯包括如下過程:

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->1.  <!--[endif]-->入庫(kù)者定義到庫(kù)中文檔的結(jié)構(gòu),比如需要把網(wǎng)站內(nèi)容加載到全文檢索庫(kù),讓用戶通過“站內(nèi)檢索”搜索到相關(guān)的網(wǎng)頁(yè)內(nèi)容。入庫(kù)文檔結(jié)構(gòu)與關(guān)系型數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)類似,每個(gè)入庫(kù)的文檔由多個(gè)字段構(gòu)成,假設(shè)這里需要入庫(kù)的網(wǎng)站內(nèi)容包括如下字段:文章標(biāo)題、作者、發(fā)布時(shí)間、原文鏈接、正文內(nèi)容(一般作為網(wǎng)頁(yè)快照)。

      <!--[if !supportLists]-->2.  <!--[endif]-->包含N個(gè)字段的文檔(DOCUMENT)在真正入庫(kù)前需要經(jīng)過切詞(或分詞)索引,切詞的規(guī)則由語(yǔ)言分析器(ANALYZER)完成。

      <!--[if !supportLists]-->3.  <!--[endif]-->切分后的“單詞”被注冊(cè)到索引樹上,供查詢時(shí)用,另外也需要也其它不需要索引的內(nèi)容入庫(kù),所有這些是文件操作均由STORAGE完成。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      以上就是記錄加載流程,索引樹是一種比較復(fù)雜的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),將在后續(xù)章節(jié)陸續(xù)介紹,這里就不贅述了,需要說明的一點(diǎn)是,Lucene的索引樹結(jié)構(gòu)非常優(yōu)秀,是Lucene的一大特色。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      接下來將對(duì)Lucene的各個(gè)子包的結(jié)構(gòu)進(jìn)行討論。

       

      <!--[if !supportLists]-->3. <!--[endif]-->語(yǔ)言分析包org.apache.lucene.analysis

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !vml]--><!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      Analyzer是一個(gè)抽象類,司職對(duì)文本內(nèi)容的切分詞規(guī)則。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      切分后返回一個(gè)TokenStream,TokenStream中有一個(gè)非常重要方法next(),即取到下一個(gè)詞。簡(jiǎn)單點(diǎn)說,通過切詞規(guī)則,把一篇文章從頭到尾分成一個(gè)個(gè)的詞,這就是org.apache.lucene.analysis的工作。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      對(duì)英文而言,其分詞規(guī)則很簡(jiǎn)單,因?yàn)槊總€(gè)單詞間都有一個(gè)空格,按空格取單詞即可,當(dāng)然為了提高英文檢索的準(zhǔn)確度,也可以把一些短語(yǔ)作為一個(gè)整體,其間不切分,這就需要一個(gè)詞庫(kù),對(duì)德文、俄文也是類似,稍有不同。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      對(duì)中文而言,文字之間都是相連的,沒有空格,但我們同樣可以把字切分,即把每個(gè)漢字作為一個(gè)詞切分,這就是所謂的“切字”,但切字方式方式的索引沒有意義,準(zhǔn)確率太低,要想提高準(zhǔn)確度一般都是切詞,這就需要一個(gè)詞庫(kù),詞庫(kù)越大準(zhǔn)確度將越高,但入庫(kù)效率越低。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      若要支持中文切詞,則需要擴(kuò)展Analyzer類,根據(jù)詞庫(kù)中的詞把文章切分。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      簡(jiǎn)單點(diǎn)說,org.apache.lucene.analysis就是完成將文章切分詞的任務(wù)。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->4. <!--[endif]-->文檔結(jié)構(gòu)包org.apache.lucene.document

      <!--[if !vml]--><!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      document包相對(duì)而言比較簡(jiǎn)單,該包下面就3個(gè)類,Document相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的記錄對(duì)象,主要負(fù)責(zé)字段的管理,字段分兩種,一是Field,即文本型字段,另一個(gè)是日期型字段DateField。這個(gè)包中關(guān)鍵需要理解的是Field中字段存儲(chǔ)方式的不同,這在上一篇中已列表提到,下面我們可以參見一下其詳細(xì)的類圖:

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !vml]--><!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->5. <!--[endif]-->索引管理包org.apache.lucene.index

      <!--[if !vml]--><!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !vml]--><!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      索引包是整個(gè)系統(tǒng)核心,全文檢索的的根本就為每個(gè)切出來的詞建索引,查詢時(shí)就只需要遍歷索引,而不需要去正文中遍歷,從而極大的提高檢索效率,索引建設(shè)的質(zhì)量關(guān)鍵整個(gè)系統(tǒng)的質(zhì)量。Lucene的索引樹是非常優(yōu)質(zhì)高效的,具體的索引樹細(xì)節(jié),將在后續(xù)章節(jié)中重要探討。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      在這個(gè)包中,主要學(xué)習(xí)IndexWriterIndexReader這個(gè)類。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      通過上一篇的初步應(yīng)用可知,全文檢索庫(kù)的初始化和記錄加載均需要通過該類來完成。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      初始化全文庫(kù)的語(yǔ)句為:

      IndexWriter indexWriter = new IndexWriter(“全文庫(kù)的目錄位置”,new StandardAnalyzer(),true);

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      記錄加載的語(yǔ)句為:indexWriter.addDocument(doc);

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      IndexWriter主要用于寫庫(kù),當(dāng)需要讀取庫(kù)內(nèi)容時(shí),就需要用到IndexReader這個(gè)類了。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->6. <!--[endif]-->查詢分析包org.apache.lucene.queryParser和檢索包org.apache.lucene.search
      <!--[if !supportLineBreakNewLine]-->
      <!--[endif]-->

      <!--[if !vml]--><!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      通過查詢分析器(queryParser)解析后,將返回一個(gè)查詢對(duì)象(query),根據(jù)查詢對(duì)象就可進(jìn)行檢索了。上圖描述了query對(duì)象的生成,下圖描述了查詢結(jié)果集(Hits)的生成。

      <!--[if !vml]--><!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->7. <!--[endif]-->存儲(chǔ)包org.apache.lucene.store

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !vml]--><!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      一些底層的文件I/O操作。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->8. <!--[endif]-->工具包org.apache.lucene.util

      <!--[if !vml]--><!--[endif]-->

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      該包中包括4個(gè)工具類。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->9. <!--[endif]-->總結(jié)

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      通過對(duì)Lucene源碼包的分析,我們可以初步認(rèn)識(shí)到Lucene的核心類包主要有3個(gè):

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      <!--[if !supportLists]-->l         <!--[endif]-->org.apache.lucene.analysis

      <!--[if !supportLists]-->l         <!--[endif]-->org.apache.lucene.index

      <!--[if !supportLists]-->l         <!--[endif]-->org.apache.lucene.search

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      其中org.apache.lucene.analysis 主要用于切分詞,切分詞的工作由Analyzer的擴(kuò)展類來實(shí)現(xiàn),Lucene自帶了StandardAnalyzer類,我們可以參照該寫出自己的切詞分析器類,如中文分析器等。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      org.apache.lucene.index主要提供庫(kù)的讀寫接口,通過該包可以創(chuàng)建庫(kù)、添加刪除記錄及讀取記錄等。

      <!--[if !supportEmptyParas]--> <!--[endif]-->

      org.apache.lucene.search主要提供了檢索接口,通過該包,我們可以輸入條件,得到查詢結(jié)果集,與org.apache.lucene.queryParser包配合還可以自定義的查詢規(guī)則,像google一樣支持查詢條件間的與、或、非、屬于等復(fù)合查詢。


      本文引用通告地址(TrackBack Ping URL)為:

      http://blog./trackback.jsp?postID=8091

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多