posts - 73,  comments - 55,  trackbacks - 0

          參考車東的《在應(yīng)用中加入全文檢索功能 ——基于Java的全文索引引擎Lucene簡介》

          方法 切詞 索引 存儲 用途
          Field.Text(String name, String value) Yes Yes Yes 切分詞索引并存儲,比如:標(biāo)題,內(nèi)容字段
          Field.Text(String name, Reader value) Yes Yes No 切分詞索引不存儲,比如:META信息,
          不用于返回顯示,但需要進(jìn)行檢索內(nèi)容
          Field.Keyword(String name, String value) No Yes Yes 不切分索引并存儲,比如:日期字段
          Field.UnIndexed(String name, String value) No No Yes 不索引,只存儲,比如:文件路徑
          Field.UnStored(String name, String value) Yes Yes No 只全文索引,不存儲

          好好看看這篇文章,很不錯。

          ----------------------------------------------------------------------------------------
          (李宇翻譯,來自Lucene的幫助文檔)

          緒論

          Lucene提供了方便您創(chuàng)建自建查詢的API,也通過QueryParser提供了強(qiáng)大的查詢語言。

          本文講述Lucene的查詢語句解析器支持的語法,Lucene的查詢語句解析器是使用JavaCC工具生成的詞法解析器,它將查詢字串解析為Lucene Query對象。

          ?

          ?


          項(xiàng)(Term)

          一條搜索語句被拆分為一些項(xiàng)(term)和操作符(operator)。項(xiàng)有兩種類型:單獨(dú)項(xiàng)和短語。

          單獨(dú)項(xiàng)就是一個單獨(dú)的單詞,例如"test" , "hello"。

          短語是一組被雙引號包圍的單詞,例如"hello dolly"。

          多個項(xiàng)可以用布爾操作符連接起來形成復(fù)雜的查詢語句(接下來您就會看到)。

          注意:Analyzer建立索引時使用的解析器和解析單獨(dú)項(xiàng)和短語時的解析器相同,因此選擇一個不會受查詢語句干擾的Analyzer非常重要。

          ?

          ?


          域(Field)

          Lucene支持域。您可以指定在某一個域中搜索,或者就使用默認(rèn)域。域名及默認(rèn)域是具體索引器實(shí)現(xiàn)決定的。

          您可以這樣搜索域:域名+":"+搜索的項(xiàng)名。

          舉個例子,假設(shè)某一個Lucene索引包含兩個域,title和text,text是默認(rèn)域。如果您想查找標(biāo)題為"The Right Way"且含有"don't go this way"的文章,您可以輸入:

          title:"The Right Way" AND text:go

          或者

          title:"Do it right" AND right

          因?yàn)閠ext是默認(rèn)域,所以這個域名可以不行。

          注意:域名只對緊接于其后的項(xiàng)生效,所以

          title:Do it right

          只有"Do"屬于title域。"it"和"right"仍將在默認(rèn)域中搜索(這里是text域)。

          ?

          ?


          項(xiàng)修飾符(Term Modifiers)

          Lucene支持項(xiàng)修飾符以支持更寬范圍的搜索選項(xiàng)。

          用通配符搜索

          Lucene支持單個與多個字符的通配搜索。

          使用符號"?"表示單個任意字符的通配。

          使用符號"*"表示多個任意字符的通配。

          單個任意字符匹配的是所有可能單個字符。例如,搜索"text或者"test",可以這樣:

          te?t

          多個任意字符匹配的是0個及更多個可能字符。例如,搜索test, tests 或者 tester,可以這樣:

          test*

          您也可以在字符竄中間使用多個任意字符通配符。

          te*t

          注意:您不能在搜索的項(xiàng)開始使用*或者?符號。

          ?

          ?


          模糊查詢

          Lucene支持基于Levenshtein Distance與Edit Distance算法的模糊搜索。要使用模糊搜索只需要在單獨(dú)項(xiàng)的最后加上符號"~"。例如搜索拼寫類似于"roam"的項(xiàng)這樣寫:

          roam~

          這次搜索將找到形如foam和roams的單詞。

          注意:使用模糊查詢將自動得到增量因子(boost factor)為0.2的搜索結(jié)果.

          ?

          ?


          鄰近搜索(Proximity Searches)

          Lucene還支持查找相隔一定距離的單詞。鄰近搜索是在短語最后加上符號"~"。例如在文檔中搜索相隔10個單詞的"apache"和"jakarta",這樣寫:

          "jakarta apache"~10

          ?

          ?


          Boosting a Term

          Lucene provides the relevance level of matching documents based on the terms found. To boost a term use the caret, "^", symbol with a boost factor (a number) at the end of the term you are searching. The higher the boost factor, the more relevant the term will be.

          Lucene可以設(shè)置在搜索時匹配項(xiàng)的相似度。在項(xiàng)的最后加上符號"^"緊接一個數(shù)字(增量值),表示搜索時的相似度。增量值越高,搜索到的項(xiàng)相關(guān)度越好。

          Boosting allows you to control the relevance of a document by boosting its term. For example, if you are searching for jakarta apache and you want the term "jakarta" to be more relevant boost it using the ^ symbol along with the boost factor next to the term. You would type:

          通過增量一個項(xiàng)可以控制搜索文檔時的相關(guān)度。例如如果您要搜索jakarta apache,同時您想讓"jakarta"的相關(guān)度更加好,那么在其后加上"^"符號和增量值,也就是您輸入:

          ?

          jakarta^4 apache

          This will make documents with the term jakarta appear more relevant. You can also boost Phrase Terms as in the example:

          這將使得生成的doucment盡可能與jakarta相關(guān)度高。您也可以增量短語,象以下這個例子一樣:

          "jakarta apache"^4 "jakarta lucene"

          By default, the boost factor is 1. Although, the boost factor must be positive, it can be less than 1 (i.e. .2)

          默認(rèn)情況下,增量值是1。增量值也可以小于1(例如0.2),但必須是有效的。

          ?

          ?

          ?

          ?


          布爾操作符

          布爾操作符可將項(xiàng)通過邏輯操作連接起來。Lucene支持AND, "+", OR, NOT 和 "-"這些操作符。(注意:布爾操作符必須全部大寫)

          OR

          OR操作符是默認(rèn)的連接操作符。這意味著如果兩個項(xiàng)之間沒有布爾操作符,就是使用OR操作符。OR操作符連接兩個項(xiàng),意味著查找含有任意項(xiàng)的文檔。這與集合并運(yùn)算相同。符號||可以代替符號OR。

          搜索含有"jakarta apache" 或者 "jakarta"的文檔,可以使用這樣的查詢:

          "jakarta apache" jakarta

          或者

          "jakarta apache" OR jakarta

          ?

          ?


          AND

          AND操作符匹配的是兩項(xiàng)同時出現(xiàn)的文檔。這個與集合交操作相等。符號&&可以代替符號AND。

          搜索同時含有"jakarta apache" 與 "jakarta lucene"的文檔,使用查詢:

          "jakarta apache" AND "jakarta lucene"

          ?

          ?


          +

          "+"操作符或者稱為存在操作符,要求符號"+"后的項(xiàng)必須在文檔相應(yīng)的域中存在。

          搜索必須含有"jakarta",可能含有"lucene"的文檔,使用查詢:

          +jakarta apache

          ?

          ?


          NOT

          NOT操作符排除那些含有NOT符號后面項(xiàng)的文檔。這和集合的差運(yùn)算相同。符號!可以代替符號NOT。

          搜索含有"jakarta apache",但是不含有"jakarta lucene"的文檔,使用查詢:

          "jakarta apache" NOT "jakarta lucene"

          注意:NOT操作符不能單獨(dú)與項(xiàng)使用構(gòu)成查詢。例如,以下的查詢查不到任何結(jié)果:

          NOT "jakarta apache"

          ?

          ?


          -

          "-"操作符或者禁止操作符排除含有"-"后面的相似項(xiàng)的文檔。

          搜索含有"jakarta apache",但不是"jakarta lucene",使用查詢:

          "jakarta apache" -"jakarta lucene"

          ?

          ?

          ?

          ?


          分組(Grouping)

          Lucene支持使用圓括號來組合字句形成子查詢。這對于想控制查詢布爾邏輯的人十分有用。

          搜索含有"jakarta"或者"apache",同時含有"website"的文檔,使用查詢:

          (jakarta OR apache) AND website

          這樣就消除了歧義,保證website必須存在,jakarta和apache中之一也存在。

          ?

          ?


          轉(zhuǎn)義特殊字符(Escaping Special Characters)

          Lucene支持轉(zhuǎn)義特殊字符,因?yàn)樘厥庾址遣樵冋Z法用到的。現(xiàn)在,特殊字符包括

          + - && || ! ( ) { } [ ] ^ " ~ * ? : \

          轉(zhuǎn)義特殊字符只需在字符前加上符號\,例如搜索(1+1):2,使用查詢

          \(1\+1\)\:2


          ---------------------------------------
          索引文件格式

          本文定義了Lucene(版本1.3)用到的索引文件的格式。

          Jakarta Lucene是用Java寫成的,同時有很多團(tuán)體正在默默的用其他的程序語言來改寫它。如果這些新的版本想和Jakarta Lucene兼容,就需要一個與具體語言無關(guān)的Lucene索引文件格式。本文正是試圖提供一個完整的與語言無關(guān)的Jakarta Lucene 1.3索引文件格式的規(guī)格定義。

          隨著Lucene不斷發(fā)展,本文也應(yīng)該更新。不同語言寫成的Lucene實(shí)現(xiàn)版本應(yīng)當(dāng)盡力遵守文件格式,也必須產(chǎn)生本文的新版本。

          本文同時提供兼容性批注,描述文件格式上與前一版本不同的地方。

          ?

          ?


          定義

          Lucene中最基礎(chǔ)的概念是索引(index),文檔(document),域(field)和項(xiàng)(term)。

          索引包含了一個文檔的序列。

          · 文檔是一些域的序列。

          · 域是一些項(xiàng)的序列。

          · 項(xiàng)就是一個字串。

          存在于不同域中的同一個字串被認(rèn)為是不同的項(xiàng)。因此項(xiàng)實(shí)際是用一對字串表示的,第一個字串是域名,第二個是域中的字串。

          倒排索引

          為了使得基于項(xiàng)的搜索更有效率,索引中項(xiàng)是靜態(tài)存儲的。Lucene的索引屬于索引方式中的倒排索引,因?yàn)閷τ谝粋€項(xiàng)這種索引可以列出包含它的文檔。這剛好是文檔與項(xiàng)自然聯(lián)系的倒置。

          ?

          ?


          域的類型

          Lucene中,域的文本可能以逐字的非倒排的方式存儲在索引中。而倒排過的域稱為被索引過了。域也可能同時被存儲和被索引。

          域的文本可能被分解許多項(xiàng)目而被索引,或者就被用作一個項(xiàng)目而被索引。大多數(shù)的域是被分解過的,但是有些時候某些標(biāo)識符域被當(dāng)做一個項(xiàng)目索引是很有用的。

          ?

          ?


          段(Segment)

          Lucene索引可能由多個子索引組成,這些子索引成為段。每一段都是完整獨(dú)立的索引,能被搜索。索引是這樣作成的:

          1. 為新加入的文檔創(chuàng)建新段。

          2. 合并已經(jīng)存在的段。

          搜索時需要涉及到多個段和/或者多個索引,每一個索引又可能由一些段組成。

          ?

          ?


          文檔號(Document Number)

          內(nèi)部的來說,Lucene用一個整形(interger)的文檔號來指示文檔。第一個被加入到索引中的文檔就是0號,順序加入的文檔將得到一個由前一個號碼遞增而來的號碼。

          注意文檔號是可能改變的,所以在Lucene外部存儲這些號碼時必須小心。特別的,號碼的改變的情況如下:

          · 只有段內(nèi)的號碼是相同的,不同段之間不同,因而在一個比段廣泛的上下文環(huán)境中使用這些號碼時,就必須改變它們。標(biāo)準(zhǔn)的技術(shù)是根據(jù)每一段號碼多少為每一段分 配一個段號。將段內(nèi)文檔號轉(zhuǎn)換到段外時,加上段號。將某段外的文檔號轉(zhuǎn)換到段內(nèi)時,根據(jù)每段中可能的轉(zhuǎn)換后號碼范圍來判斷文檔屬于那一段,并減調(diào)這一段的 段號。例如有兩個含5個文檔的段合并,那么第一段的段號就是0,第二段段號5。第二段中的第三個文檔,在段外的號碼就是8。

          · 文檔刪除后,連續(xù)的號碼就出現(xiàn)了間斷。這可以通過合并索引來解決,段合并時刪除的文檔相應(yīng)也刪掉了,新合并而成的段并沒有號碼間斷。

          ?

          ?

          ?

          ?


          緒論

          索引段維護(hù)著以下的信息:

          · 域集合。包含了索引中用到的所有的域。

          · 域值存儲表。每一個文檔都含有一個“屬性-值”對的列表,屬性即為域名。這個列表用來存儲文檔的一些附加信息,如標(biāo)題,url或者訪問數(shù)據(jù)庫的一個ID。在搜索時存儲域的集合可以被返回。這個表以文檔號標(biāo)識。

          · 項(xiàng)字典。這個字典含有所有文檔的所有域中使用過的的項(xiàng),同時含有使用過它的文檔的文檔號,以及指向使用頻數(shù)信息和位置信息的指針。

          · 項(xiàng)頻數(shù)信息。對于項(xiàng)字典中的每個項(xiàng),這些信息包含含有這個項(xiàng)的文檔的總數(shù),以及每個文檔中使用的次數(shù)。

          · 項(xiàng)位置信息。對于項(xiàng)字典中的每個項(xiàng),都存有在每個文檔中出現(xiàn)的各個位置。

          · Normalization factors. For each field in each document, a value is stored that is multiplied into the score for hits on that field. 標(biāo)準(zhǔn)化因子。對于文檔中的每一個域,存有一個值,用來以后乘以這個這個域的命中數(shù)(hits)。

          · 被刪除的文檔信息。這是一個可選文件,用來表明那些文檔已經(jīng)刪除了。

          接下來的各部分部分詳細(xì)描述這些信息。

          ?

          ?


          文件的命名(File Naming)

          同屬于一個段的文件擁有相同的文件名,不同的擴(kuò)展名。擴(kuò)展名由以下討論的各種文件格式確定。

          一般來說,一個索引存放一個目錄,其所有段都存放在這個目錄里,盡管我們不要求您這樣做。

          ?

          ?


          基本數(shù)據(jù)類型(Primitive Types)

          Byte

          最基本的數(shù)據(jù)類型就是字節(jié)(byte,8位)。文件就是按字節(jié)順序訪問的。其它的一些數(shù)據(jù)類型也定義為字節(jié)的序列,文件的格式具有字節(jié)意義上的獨(dú)立性。

          ?

          ?


          UInt32

          32位無符號整數(shù),由四個字節(jié)組成,高位優(yōu)先。

          UInt32 --> <Byte>4

          ?

          ?


          Uint64

          64位無符號整數(shù),由八字節(jié)組成,高位優(yōu)先。

          UInt64 --> <Byte>8

          ?

          ?


          VInt

          可變長的正整數(shù)類型,每字節(jié)的最高位表明還剩多少字節(jié)。每字節(jié)的低七位表明整數(shù)的值。因此單字節(jié)的值從0到127,兩字節(jié)值從128到16,383,等等。

          VInt 編碼示例

          Value
          First byte
          Second byte
          Third byte

          0
          00000000

          ?

          1
          00000001

          ?

          2
          00000010

          ?

          ...

          ?


          127
          01111111

          ?

          128
          10000000
          00000001


          129
          10000001
          00000001


          130
          10000010
          00000001


          ...

          ?


          16,383
          11111111
          01111111


          16,384
          10000000
          10000000
          00000001

          16,385
          10000001
          10000000
          00000001

          ...

          ?

          ?

          這種編碼提供了一種在高效率解碼時壓縮數(shù)據(jù)的方法。

          ?

          ?


          Chars

          Lucene輸出UNICODE字符序列,使用標(biāo)準(zhǔn)UTF-8編碼。

          ?

          ?


          String

          Lucene輸出由VINT和字符串組成的字串,VINT表示字串長,字符串緊接其后。

          String --> VInt, Chars

          ?

          ?

          ?

          ?


          索引包含的文件(Per-Index Files)

          這部分介紹每個索引包含的文件。

          Segments文件

          索引中活動的段存儲在Segments文件中。每個索引只能含有一個這樣的文件,名為"segments".這個文件依次列出每個段的名字和每個段的大小。

          Segments --> SegCount, <SegName, SegSize>SegCount

          SegCount, SegSize --> UInt32

          SegName --> String

          SegName表示該segment的名字,同時作為索引其他文件的前綴。

          SegSize是段索引中含有的文檔數(shù)。

          ?

          ?


          Lock文件

          有一些文件用來表示另一個進(jìn)程在使用索引。

          · 如果存在"commit.lock"文件,表示有進(jìn)程在寫"segments"文件和刪除無用的段索引文件,或者表示有進(jìn)程在讀"segments"文件 和打開某些段的文件。在一個進(jìn)程在讀取"segments"文件段信息后,還沒來得及打開所有該段的文件前,這個Lock文件可以防止另一個進(jìn)程刪除這些 文件。

          · 如果存在"index.lock"文件,表示有進(jìn)程在向索引中加入文檔,或者是從索引中刪除文檔。這個文件防止很多文件同時修改一個索引。

          ?

          ?


          Deleteable文件

          名為"deletetable"的文件包含了索引不再使用的文件的名字,這些文件可能并沒有被實(shí)際的刪除。這種情況只存在與Win32平臺下,因?yàn)閃in32下文件仍打開時并不能刪除。

          Deleteable --> DelableCount, <DelableName>DelableCount

          DelableCount --> UInt32

          DelableName --> String

          ?

          ?

          ?

          ?


          段包含的文件(Per-Segment Files)

          剩下的文件是每段中包含的文件,因此由后綴來區(qū)分。

          域(Field)


          域集合信息(Field Info)

          所有域名都存儲在這個文件的域集合信息中,這個文件以后綴.fnm結(jié)尾。

          FieldInfos (.fnm) --> FieldsCount, <FieldName, FieldBits>FieldsCount

          FieldsCount --> VInt

          FieldName --> String

          FieldBits --> Byte

          目前情況下,F(xiàn)ieldBits只有使用低位,對于已索引的域值為1,對未索引的域值為0。

          文件中的域根據(jù)它們的次序編號。因此域0是文件中的第一個域,域1是接下來的,等等。這個和文檔號的編號方式相同。


          域值存儲表(Stored Fields)

          域值存儲表使用兩個文件表示:

          1. 域索引(.fdx文件)。

          如下,對于每個文檔這個文件包含指向域值的指針:

          FieldIndex (.fdx) --> <FieldValuesPosition>SegSize

          FieldValuesPosition --> Uint64

          FieldValuesPosition 指示的是某一文檔的某域的域值在域值文件中的位置。因?yàn)橛蛑滴募卸ㄩL的數(shù)據(jù)信息,因而很容易隨機(jī)訪問。在域值文件中,文檔n的域值信息就存在n*8位 置處(The position of document n's field data is the Uint64 at n*8 in this file.)。

          2. 域值(.fdt文件)。

          如下,每個文檔的域值信息包含:

          FieldData (.fdt) --> <DocFieldData>SegSize

          DocFieldData --> FieldCount, <FieldNum, Bits, Value>FieldCount

          FieldCount --> VInt

          FieldNum --> VInt

          Bits --> Byte

          Value --> String

          目前情況下,Bits只有低位被使用,值為1表示域名被分解過,值為0表示未分解過。

          ?

          ?


          項(xiàng)字典(Term Dictionary)

          項(xiàng)字典用以下兩個文件表示:

          1. 項(xiàng)信息(.tis文件)。

          TermInfoFile (.tis)--> TermCount, TermInfos

          TermCount --> UInt32

          TermInfos --> <TermInfo>TermCount

          TermInfo --> <Term, DocFreq, FreqDelta, ProxDelta>

          Term --> <PrefixLength, Suffix, FieldNum>

          Suffix --> String

          PrefixLength, DocFreq, FreqDelta, ProxDelta
          --> VInt

          項(xiàng)信息按項(xiàng)排序。項(xiàng)信息排序時先按項(xiàng)所屬的域的文字順序排序,然后按照項(xiàng)的字串的文字順序排序。

          項(xiàng)的字前綴往往是共同的,與字的后綴組成字。PrefixLength變量就是表示與前一項(xiàng)相同的前綴的字?jǐn)?shù)。因此,如果前一個項(xiàng)的字是"bone",后一個是"boy"的話,PrefixLength值為2,Suffix值為"y"。

          FieldNum指明了項(xiàng)屬于的域號,而域名存儲在.fdt文件中。

          DocFreg表示的是含有該項(xiàng)的文檔的數(shù)量。

          FreqDelta指明了項(xiàng)所屬TermFreq變量在.frq文件中的位置。詳細(xì)的說,就是指相對于前一個項(xiàng)的數(shù)據(jù)的位置偏移量(或者是0,表示文件中第一個項(xiàng))。

          ProxDelta指明了項(xiàng)所屬的TermPosition變量在.prx文件中的位置。詳細(xì)的說,就是指相對于前一個項(xiàng)的數(shù)據(jù)的位置偏移量(或者是0,表示文件中第一個項(xiàng))。

          2. 項(xiàng)信息索引(.tii文件)。

          每個項(xiàng)信息索引文件包含.tis文件中的128個條目,依照條目在.tis文件中的順序。這樣設(shè)計是為了一次將索引信息讀入內(nèi)存能,然后使用它來隨機(jī)的訪問.tis文件。

          這個文件的結(jié)構(gòu)和.tis文件非常類似,只在每個條目記錄上增加了一個變量IndexDelta。

          TermInfoIndex (.tii)--> IndexTermCount, TermIndices

          IndexTermCount --> UInt32

          TermIndices --> <TermInfo, IndexDelta>IndexTermCount

          IndexDelta --> VInt

          IndexDelta表示該項(xiàng)的TermInfo變量值在.tis文件中的位置。詳細(xì)的講,就是指相對于前一個條目的偏移量(或者是0,對于文件中第一個項(xiàng))。

          ?

          ?


          項(xiàng)頻數(shù)(Frequencies)

          .frq文件包含每一項(xiàng)的文檔的列表,還有該項(xiàng)在對應(yīng)文檔中出現(xiàn)的頻數(shù)。

          FreqFile (.frq) --> <TermFreqs>TermCount

          TermFreqs --> <TermFreq>DocFreq

          TermFreq --> DocDelta, Freq?

          DocDelta,Freq --> VInt

          TermFreqs序列按照項(xiàng)來排序(依據(jù)于.tis文件中的項(xiàng),即項(xiàng)是隱含存在的)。

          TermFreq元組按照文檔號升序排列。

          DocDelta 決定了文檔號和頻數(shù)。詳細(xì)的說,DocDelta/2表示相對于前一文檔號的偏移量(或者是0,表示這是TermFreqs里面的第一項(xiàng))。當(dāng) DocDelta是奇數(shù)時表示在該文檔中頻數(shù)為1,當(dāng)DocDelta是偶數(shù)時,另一個VInt(Freq)就表示在該文檔中出現(xiàn)的頻數(shù)。

          例如,假設(shè)某一項(xiàng)在文檔7中出現(xiàn)一次,在文檔11中出現(xiàn)了3次,在TermFreqs中就存在如下的VInts序列:

          15, 22, 3

          ?

          ?


          項(xiàng)位置(Position)

          .prx文件包含了某文檔中某項(xiàng)出現(xiàn)的位置信息的列表。

          ProxFile (.prx) --> <TermPositions>TermCount

          TermPositions --> <Positions>DocFreq

          Positions --> <PositionDelta>Freq

          PositionDelta --> VInt

          TermPositions按照項(xiàng)來排序(依據(jù)于.tis文件中的項(xiàng),即項(xiàng)是隱含存在的)。

          Positions元組按照文檔號升序排列。

          PositionDelta是相對于前一個出現(xiàn)位置的偏移位置(或者為0,表示這是第一次在這個文檔中出現(xiàn))。

          例如,假設(shè)某一項(xiàng)在某文檔第4項(xiàng)出現(xiàn),在另一個文檔中第5項(xiàng)和第9項(xiàng)出現(xiàn),將存在如下的VInt序列:

          4, 5, 4

          ?

          ?


          標(biāo)準(zhǔn)化因子(Normalization Factor)

          .nrm文件包含了每個文檔的標(biāo)準(zhǔn)化因子,標(biāo)準(zhǔn)化因子用來以后乘以這個這個域的命中數(shù)。

          Norms (.nrm) --> <Byte>SegSize

          每個字節(jié)記錄一個浮點(diǎn)數(shù)。位0-2包含了3位的尾數(shù)部分,位3-8包含了5位的指數(shù)部分。

          按如下規(guī)則可將這些字節(jié)轉(zhuǎn)換為IEEE標(biāo)準(zhǔn)單精度浮點(diǎn)數(shù):

          1. 如果該字節(jié)是0,就是浮點(diǎn)0;

          2. 否則,設(shè)置新浮點(diǎn)數(shù)的標(biāo)志位為0;

          3. 將字節(jié)中的指數(shù)加上48后作為新的浮點(diǎn)數(shù)的指數(shù);

          4. 將字節(jié)中的尾數(shù)映射到新浮點(diǎn)數(shù)尾數(shù)的高3位;并且

          5. 設(shè)置新浮點(diǎn)數(shù)尾數(shù)的低21位為0。

          ?

          ?


          被刪除的文檔(Deleted Document)

          .del文件是可選的,只有在某段中存在刪除操作后才存在:

          Deletions (.del) --> ByteCount,BitCount,Bits

          ByteSize,BitCount --> Uint32

          Bits --> <Byte>ByteCount

          ByteCount表示的是Bits列表中Byte的數(shù)量。典型的,它等于(SegSize/8)+1。

          BitCount表示Bits列表中多少個已經(jīng)被設(shè)置過了。

          Bits列表包含了一些位(bit),順序表示一個文檔。當(dāng)對應(yīng)于文檔號的位被設(shè)置了,就標(biāo)志著這個文檔已經(jīng)被刪除了。位的順序是從低到高。因此,如果Bits包含兩個字節(jié),0x00和0x02,那么表示文檔9已經(jīng)刪除了。

          ?

          ?

          ?

          ?


          局限性(Limitations)

          在以上的文件格式中,好幾處都有限制項(xiàng)和文檔的最大個數(shù)為32位數(shù)的極限,即接近于40億。今天看來,這不會造成問題,但是,長遠(yuǎn)的看,可能造成問題。因此,這些極限應(yīng)該或者換為UInt64類型的值,或者更好的,換為VInt類型的值(VInt值沒有上限)。

          有兩處地方的代碼要求必須是定長的值,他們是:

          1. FieldValuesPosition變量(存儲于域索引文件中,.fdx文件)。它已經(jīng)是一個UInt64型,所以不會有問題。

          2. TermCount變量(存儲于項(xiàng)信息文件中,.tis文件)。這是最后輸出到文件中的,但是最先被讀取,因此是存儲于文件的最前端 。索引代碼先在這里寫入一個0值,然后在其他文件輸出完畢后覆蓋這個值。所以無論它存儲在什么地方,它都必須是一個定長的值,它應(yīng)該被變成UInt64 型。

          除此之外,所有的UInt值都可以換成VInt型以去掉限制。

          posted on 2006-06-21 20:22 保爾任 閱讀(1393) 評論(1)  編輯  收藏 所屬分類: open source

          FeedBack:
          # re: 基于Java的全文索引引擎Lucene(未讀)
          2014-05-22 16:23 | huangpingping
          點(diǎn)贊!!!!!
          要是能將其搜索過程以及對應(yīng)整個讀索引的過程用一張圖畫出來 應(yīng)該能使我們更清晰點(diǎn),嘿嘿嘿,謝謝樓組  回復(fù)  更多評論
            

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 利川市| 扬中市| 珠海市| 安义县| 延津县| 安新县| 龙口市| 通许县| 卫辉市| 永兴县| 永平县| 桃园县| 清河县| 三都| 邯郸县| 曲阜市| 顺昌县| 济南市| 伊春市| 台东县| 邯郸县| 丰原市| 乐清市| 大埔区| 天门市| 静海县| 河东区| 佛山市| 武邑县| 宁明县| 吉安县| 高陵县| 松江区| 深圳市| 临西县| 永济市| 衡南县| 尉犁县| 大兴区| 张北县| 天津市|