熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

定義Lucene 1.3 用到的索引文件格式

2022-06-13   來源: Javascript 

  Jakarta Lucene是用Java寫成的同時有很多團體正在默默的用其他的程序語言來改寫它如果這些新的版本想和Jakarta Lucene兼容就需要一個與具體語言無關的Lucene索引文件格式本文正是試圖提供一個完整的與語言無關的Jakarta Lucene 索引文件格式的規格定義
  
  隨著Lucene不斷發展本文也應該更新不同語言寫成的Lucene實現版本應當盡力遵守文件格式也必須產生本文的新版本
  
  本文同時提供兼容性批注描述文件格式上與前一版本不同的地方
  
  定義
  Lucene中最基礎的概念是索引(index)文檔(document.域(field)和項(term)
  
  索引包含了一個文檔的序列
  
  ·  文檔是一些域的序列
  
  ·  域是一些項的序列
  
  ·  項就是一個字串
  
  存在於不同域中的同一個字串被認為是不同的項因此項實際是用一對字串表示的第一個字串是域名第二個是域中的字串
  
  倒排索引
  為了使得基於項的搜索更有效率索引中項是靜態存儲的Lucene的索引屬於索引方式中的倒排索引因為對於一個項這種索引可以列出包含它的文檔這剛好是文檔與項自然聯系的倒置
  
  域的類型
  Lucene中域的文本可能以逐字的非倒排的方式存儲在索引中而倒排過的域稱為被索引過了域也可能同時被存儲和被索引
  
  域的文本可能被分解許多項目而被索引或者就被用作一個項目而被索引大多數的域是被分解過的但是有些時候某些標識符域被當做一個項目索引是很有用的
  
  段(Segment)
  Lucene索引可能由多個子索引組成這些子索引成為段每一段都是完整獨立的索引能被搜索索引是這樣作成的
  
    為新加入的文檔創建新段
  
    合並已經存在的段
  
  搜索時需要涉及到多個段和/或者多個索引每一個索引又可能由一些段組成
  
  文檔號(document.nbspNumber)
  內部的來說Lucene用一個整形(interger)的文檔號來指示文檔第一個被加入到索引中的文檔就是順序加入的文檔將得到一個由前一個號碼遞增而來的號碼
  
  注意文檔號是可能改變的所以在Lucene外部存儲這些號碼時必須小心特別的號碼的改變的情況如下
  
  ·  只有段內的號碼是相同的不同段之間不同因而在一個比段廣泛的上下文環境中使用這些號碼時就必須改變它們標准的技術是根據每一段號碼多少為每一段分配一個段號將段內文檔號轉換到段外時加上段號將某段外的文檔號轉換到段內時根據每段中可能的轉換後號碼范圍來判斷文檔屬於那一段並減調這一段的段號例如有兩個含個文檔的段合並那麼第一段的段號就是第二段段號第二段中的第三個文檔在段外的號碼就是
  
  ·  文檔刪除後連續的號碼就出現了間斷這可以通過合並索引來解決段合並時刪除的文檔相應也刪掉了新合並而成的段並沒有號碼間斷
  
  緒論
  索引段維護著以下的信息
  
  ·  域集合包含了索引中用到的所有的域
  
  ·  域值存儲表每一個文檔都含有一個屬性-值對的列表屬性即為域名這個列表用來存儲文檔的一些附加信息如標題url或者訪問數據庫的一個ID在搜索時存儲域的集合可以被返回這個表以文檔號標識
  
  ·  項字典這個字典含有所有文檔的所有域中使用過的的項同時含有使用過它的文檔的文檔號以及指向使用頻數信息和位置信息的指針
  
  ·  項頻數信息對於項字典中的每個項這些信息包含含有這個項的文檔的總數以及每個文檔中使用的次數
  
  ·  項位置信息對於項字典中的每個項都存有在每個文檔中出現的各個位置
  
  ·  Normalization factors For each field in each document. a value is stored that is multiplied into the score for hits on that field 標准化因子對於文檔中的每一個域存有一個值用來以後乘以這個這個域的命中數(hits)
  
  ·  被刪除的文檔信息這是一個可選文件用來表明那些文檔已經刪除了
  
  接下來的各部分部分詳細描述這些信息
  
  文件的命名(File Naming)
  同屬於一個段的文件擁有相同的文件名不同的擴展名擴展名由以下討論的各種文件格式確定
  
  一般來說一個索引存放一個目錄其所有段都存放在這個目錄裡盡管我們不要求您這樣做
  
  基本數據類型(Primitive Types)
  Byte
  
  最基本的數據類型就是字節(byte位)文件就是按字節順序訪問的其它的一些數據類型也定義為字節的序列文件的格式具有字節意義上的獨立性
  
  UInt
  
  位無符號整數由四個字節組成高位優先
  
  UInt > <Byte>
  
  Uint
  
  位無符號整數由八字節組成高位優先
  
  UInt > <Byte>
  
  VInt
  
  可變長的正整數類型每字節的最高位表明還剩多少字節每字節的低七位表明整數的值因此單字節的值從兩字節值從等等
  
  VInt 編碼示例
  value
   First byte
   Second byte
   Third byte
  
  
  
   
  
  
   
  
  
  
  
   
  
  
   
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   
  這種編碼提供了一種在高效率解碼時壓縮數據的方法
  
  Chars
  
  Lucene輸出UNICODE字符序列使用標准UTF編碼
  
  String
  
  Lucene輸出由VINT和字符串組成的字串VINT表示字串長字符串緊接其後
  
  String > VInt Chars
  
  索引包含的文件(PerIndex Files)
  這部分介紹每個索引包含的文件
  
  Segments文件
   索引中活動的段存儲在Segments文件中每個索引只能含有一個這樣的文件名為segments這個文件依次列出每個段的名字和每個段的大小
  
  Segments > SegCount <SegName SegSize>SegCount
  
  SegCount SegSize > UInt
  
  SegName > String
  
  SegName表示該segment的名字同時作為索引其他文件的前綴
  
  SegSize是段索引中含有的文檔數
  
  Lock文件
  有一些文件用來表示另一個進程在使用索引
  
  ·  如果存在commitlock文件表示有進程在寫segments文件和刪除無用的段索引文件或者表示有進程在讀segments文件和打開某些段的文件在一個進程在讀取segments文件段信息後還沒來得及打開所有該段的文件前這個Lock文件可以防止另一個進程刪除這些文件
  
  ·  如果存在indexlock文件表示有進程在向索引中加入文檔或者是從索引中刪除文檔這個文件防止很多文件同時修改一個索引
  
  Deleteable文件
  名為deletetable的文件包含了索引不再使用的文件的名字這些文件可能並沒有被實際的刪除這種情況只存在與Win平台下因為Win下文件仍打開時並不能刪除
  
  Deleteable > DelableCount <DelableName>DelableCount
  
  DelableCount > UInt
  
  DelableName > String
  
  段包含的文件(PerSegment Files)
  剩下的文件是每段中包含的文件因此由後綴來區分
  
  域(Field)
  
  域集合信息(Field Info)
  
  所有域名都存儲在這個文件的域集合信息中這個文件以後綴fnm結尾
  
  FieldInfos (fnm) > FieldsCount <FieldName FieldBits>FieldsCount
  
  FieldsCount > VInt
  
  FieldName > String
  
  FieldBits > Byte
  
  目前情況下FieldBits只有使用低位對於已索引的域值為對未索引的域值為
  
  文件中的域根據它們的次序編號因此域是文件中的第一個域是接下來的等等這個和文檔號的編號方式相同
  
  域值存儲表(Stored Fields)
  
  域值存儲表使用兩個文件表示
  
    域索引(fdx文件)
  
  如下對於每個文檔這個文件包含指向域值的指針
  
  FieldIndex (fdx) > <FieldvaluesPosition>SegSize
  
  FieldvaluesPosition > Uint
  
  FieldvaluesPosition指示的是某一文檔的某域的域值在域值文件中的位置因為域值文件含有定長的數據信息因而很容易隨機訪問在域值文件中文檔n的域值信息就存在n*
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25449.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.