欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Lucene索引文件格式(中文版,有chris翻譯)

此篇文章也為轉載,不過(guò)所翻譯的Lucene的文件格式為1.3版的.

原文來(lái)自:http://www.matrix.org.cn/resource/article/22.html

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

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

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

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






定義

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

索引包含了一個(gè)文檔的序列。

· 文檔是一些域的序列。

· 域是一些項的序列。

· 項就是一個(gè)字串。

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

倒排索引

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






域的類(lèi)型

Lucene中,域的文本可能以逐字的非倒排的方式存儲在索引中。而倒排過(guò)的域稱(chēng)為被索引過(guò)了。域也可能同時(shí)被存儲和被索引。

域的文本可能被分解許多項目而被索引,或者就被用作一個(gè)項目而被索引。大多數的域是被分解過(guò)的,但是有些時(shí)候某些標識符域被當做一個(gè)項目索引是很有用的。






段(Segment)

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

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

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

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






文檔號(Document Number)

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

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

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

· 文檔刪除后,連續的號碼就出現了間斷。這可以通過(guò)合并索引來(lái)解決,段合并時(shí)刪除的文檔相應也刪掉了,新合并而成的段并沒(méi)有號碼間斷。










緒論

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

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

· 域值存儲表。每一個(gè)文檔都含有一個(gè)“屬性-值”對的列表,屬性即為域名。這個(gè)列表用來(lái)存儲文檔的一些附加信息,如標題,url或者訪(fǎng)問(wèn)數據庫的一個(gè)ID。在搜索時(shí)存儲域的集合可以被返回。這個(gè)表以文檔號標識。

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

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

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

· Normalization factors. For each field in each document, a value is stored that is multiplied into the score for hits on that field. 標準化因子。對于文檔中的每一個(gè)域,存有一個(gè)值,用來(lái)以后乘以這個(gè)這個(gè)域的命中數(hits)。

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

接下來(lái)的各部分部分詳細描述這些信息。






文件的命名(File Naming)

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

一般來(lái)說(shuō),一個(gè)索引存放一個(gè)目錄,其所有段都存放在這個(gè)目錄里,盡管我們不要求您這樣做。






基本數據類(lèi)型(Primitive Types)

Byte

最基本的數據類(lèi)型就是字節(byte,8位)。文件就是按字節順序訪(fǎng)問(wèn)的。其它的一些數據類(lèi)型也定義為字節的序列,文件的格式具有字節意義上的獨立性。






UInt32

32位無(wú)符號整數,由四個(gè)字節組成,高位優(yōu)先。

UInt32 --> <Byte>4






Uint64

64位無(wú)符號整數,由八字節組成,高位優(yōu)先。

UInt64 --> <Byte>8






VInt

可變長(cháng)的正整數類(lèi)型,每字節的最高位表明還剩多少字節。每字節的低七位表明整數的值。因此單字節的值從0到127,兩字節值從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í)壓縮數據的方法。






Chars

Lucene輸出UNICODE字符序列,使用標準UTF-8編碼。






String

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

String --> VInt, Chars










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

這部分介紹每個(gè)索引包含的文件。

Segments文件

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

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

SegCount, SegSize --> UInt32

SegName --> String

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

SegSize是段索引中含有的文檔數。






Lock文件

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

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

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






Deleteable文件

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

Deleteable --> DelableCount, <DelableName>DelableCount

DelableCount --> UInt32

DelableName --> String










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

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

域(Field)


域集合信息(Field Info)

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

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

FieldsCount --> VInt

FieldName --> String

FieldBits --> Byte

目前情況下,FieldBits只有使用低位,對于已索引的域值為1,對未索引的域值為0。

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


域值存儲表(Stored Fields)

域值存儲表使用兩個(gè)文件表示:

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

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

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

FieldValuesPosition --> Uint64

FieldValuesPosition指示的是某一文檔的某域的域值在域值文件中的位置。因為域值文件含有定長(cháng)的數據信息,因而很容易隨機訪(fǎng)問(wèn)。在域值文件中,文檔n的域值信息就存在n*8位置處(The position of document n‘s field data is the Uint64 at n*8 in this file.)。

2. 域值(.fdt文件)。

如下,每個(gè)文檔的域值信息包含:

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

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

FieldCount --> VInt

FieldNum --> VInt

Bits --> Byte

Value --> String

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






項字典(Term Dictionary)

項字典用以下兩個(gè)文件表示:

1. 項信息(.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

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

項的字前綴往往是共同的,與字的后綴組成字。PrefixLength變量就是表示與前一項相同的前綴的字數。因此,如果前一個(gè)項的字是"bone",后一個(gè)是"boy"的話(huà),PrefixLength值為2,Suffix值為"y"。

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

DocFreg表示的是含有該項的文檔的數量。

FreqDelta指明了項所屬TermFreq變量在.frq文件中的位置。詳細的說(shuō),就是指相對于前一個(gè)項的數據的位置偏移量(或者是0,表示文件中第一個(gè)項)。

ProxDelta指明了項所屬的TermPosition變量在.prx文件中的位置。詳細的說(shuō),就是指相對于前一個(gè)項的數據的位置偏移量(或者是0,表示文件中第一個(gè)項)。

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

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

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

TermInfoIndex (.tii)--> IndexTermCount, TermIndices

IndexTermCount --> UInt32

TermIndices --> <TermInfo, IndexDelta>IndexTermCount

IndexDelta --> VInt

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






項頻數(Frequencies)

.frq文件包含每一項的文檔的列表,還有該項在對應文檔中出現的頻數。

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

TermFreqs --> <TermFreq>DocFreq

TermFreq --> DocDelta, Freq?

DocDelta,Freq --> VInt

TermFreqs序列按照項來(lái)排序(依據于.tis文件中的項,即項是隱含存在的)。

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

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

例如,假設某一項在文檔7中出現一次,在文檔11中出現了3次,在TermFreqs中就存在如下的VInts序列:

15, 22, 3






項位置(Position)

.prx文件包含了某文檔中某項出現的位置信息的列表。

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

TermPositions --> <Positions>DocFreq

Positions --> <PositionDelta>Freq

PositionDelta --> VInt

TermPositions按照項來(lái)排序(依據于.tis文件中的項,即項是隱含存在的)。

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

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

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

4, 5, 4






標準化因子(Normalization Factor)

.nrm文件包含了每個(gè)文檔的標準化因子,標準化因子用來(lái)以后乘以這個(gè)這個(gè)域的命中數。

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

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

按如下規則可將這些字節轉換為IEEE標準單精度浮點(diǎn)數:

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

2. 否則,設置新浮點(diǎn)數的標志位為0;

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

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

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






被刪除的文檔(Deleted Document)

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

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

ByteSize,BitCount --> Uint32

Bits --> <Byte>ByteCount

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

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

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










局限性(Limitations)

在以上的文件格式中,好幾處都有限制項和文檔的最大個(gè)數為32位數的極限,即接近于40億。今天看來(lái),這不會(huì )造成問(wèn)題,但是,長(cháng)遠的看,可能造成問(wèn)題。因此,這些極限應該或者換為UInt64類(lèi)型的值,或者更好的,換為VInt類(lèi)型的值(VInt值沒(méi)有上限)。

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

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

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

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

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
lucene搜索引擎技術(shù)的分析與整理
Dissect Lucene - Lucene中的文檔
lucene 全文檢索簡(jiǎn)介
SlimTrie:戰勝Btree單機百億文件的極致索引-實(shí)現篇
Lucene 3.0的簡(jiǎn)單解析及變化
從lucene的文件結構看它的性能
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久