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文件
有一些文件用來表示另一個進程在使用索引
· 如果存在
commit
lock
文件
表示有進程在寫
segments
文件和刪除無用的段索引文件
或者表示有進程在讀
segments
文件和打開某些段的文件
在一個進程在讀取
segments
文件段信息後
還沒來得及打開所有該段的文件前
這個Lock文件可以防止另一個進程刪除這些文件
· 如果存在
index
lock
文件
表示有進程在向索引中加入文檔
或者是從索引中刪除文檔
這個文件防止很多文件同時修改一個索引
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