lucene的数据类型
文章目錄
- 總覽
- 1. lucene的數據類型
- VInt詳解
- ZInt 詳解
- 2. lucene的基本結構
- 1. doc number
- 2. 段(segment) 的信息
- 3. 文件信息
- 3. 文件詳細信息
- 1.segment_N
總覽
首先說明,這一篇文章有點過時了,可以參考這篇更加全面來看
??這里主要想要介紹一下lucene的存儲層面的東西,lucene的設計本來就很精巧,所以想了解需要花一些心思的。
1. lucene的數據類型
Byte:是最基本的類型,長8位(bit)。
Int32:由4個Byte組成。
Long64:由8個Byte組成。
VInt:可變字節的int,更小的數字比int32使用了更小的字節數
VLong: 可變字節的long類型
ZInt: 這個用來表示比較小的有符號數,也就是負數
ZLong: 同ZInt
VInt詳解
比如 127 如果使用int表示,是0x00 0x00 0x00 01111111但是使用vint 就是 01111111
128 使用int 表示 是 0x00 0x00 0x00 10000000但是使用vint 就是 10000000 00000001 第一個字節表示低7位,是0 ,但是因為后面還有一個字節,所以最高位是1,第二個字節表示的是第8-14位,所以是1,而且沒有更多的字節了,所以最高位為0
可以看到,VInt在表示小整數的時候很有優勢,但是在表示小的負整數的時候就沒有優勢了,反而會耗費比較大的字節數,因此又使用了zig-zag壓縮方式來壓縮負數
ZInt 詳解
??核心思想是用無符號數來表示有符號數字,正數和負數交錯,使用 zigzag 編碼,絕對值小的數字,無論正負都可以采用較少的 byte 來表示,充分利用了 Varint 這種技術。
一般的使用過程是,先使用zigzag編碼算法對數字進行編碼(不論是負數還是正數),然后得到的都是正數,這個時候再使用VInt進行壓縮。
具體的轉換相對麻煩一些,這里貼一個連接
2. lucene的基本結構
這里主要從兩個方面來介紹lucene的數據結構,一方面是從邏輯上看看lucene的數據結構都有哪些,另一方面,看看從物理文件上看這些數據都是如何被保存的。
從邏輯上來講,lucene實例就是一個索引,主要由段構成,每個索引可以有多個段組成,其物理存儲關注的也就是這幾個段是如何存儲的。
1. doc number
在內部,Lucene通過整型(integer)文檔(document number)編號引用文檔(index)。添加到索引(index)中的首個文檔(document)編號為0,后續添加的文檔(document)其編號依次增長1。
- 文檔(document)的編號可能會改變,因此在Lucene外部存儲文檔編號(document number)時應謹慎。
- 每段(segment)中存儲的編號僅在本段(segment)內唯一,在更大的上下文(context)中使用前必須進行轉換。標準是依據每段(segment)使用的數值范圍為其分配一個范圍的值。要將文檔編號(document number)從段(segment)內轉換為一個外部值,需要給(這個編號)添加段(segment)內基本文檔編號(document number)。要將外部值轉換為特定段(segment-specific)的值,此段(segment)需檢查外部值是否在數值范圍內,并(使外部值)減去段(segment)的基本文檔編號。例如,兩個五篇文檔(document)的段(segment)將要合并(merge),那么第一個段(segment)的基本值為0,第二個的基本值為5(之前的文檔里值的總數,第一段合并前文檔中總數為0,第二段合并前,第一段已合并完,文檔總數為5)。第二段(segment)的3號文檔(document)的外部值將為8(3+5)。
- 當文檔被刪除(delete),編號中會產生間隔。隨著索引(index)的通過合并(merge)的演變,這些(間隔)最終會被移除(remove)。被刪除的文檔在段(segment)合并(merge)時會被物理刪除(drop)。新合并(merge)的段(segment)編號中就沒有間隔了。
2. 段(segment) 的信息
3. 文件信息
??每一個段都包含了很多個文件來存儲不同的信息。存儲不同信息的文件的拓展名不一樣,但是對于同一個段來說,所有的歸屬該段的文件名都是一致的。
如果使用復合的文件格式的話,會把多個段的數據信息存在一個文件當中(一般都是多個小段,當然 除了段的元數據文件,lock文件,和del文件),這個復合文件是.cfs文件。
通常情況下,一個索引下的所有段(segment)存儲在單個目錄(dierctory)中,盡管這不是必須的。
文件名不會重復使用,這個使用了按代增長的方式,,比如segment_1, segment_2等,每一代是一個有序的長整型數字,進行base36編碼(5位一個新字節)的方式展現出來。
| Segments File | segments_N | Stores information about a commit point | |
| Lock File | write.lock | The Write lock prevents multiple IndexWriters from writing to the same file. | |
| Segment Info | .si | Stores metadata about a segment | |
| Compound File | .cfs, .cfe | An optional “virtual” file consisting of all the other index files for systems that frequently run out of file handles. | |
| Fields | .fnm | Stores information about the fields | |
| Field Index | .fdx | Contains pointers to field data | |
| Field Data | .fdt | The stored fields for documents | |
| Term Dictionary | .tim | The term dictionary, stores term info | |
| Term Index | .tip | The index into the Term Dictionary | |
| Frequencies | .doc | Contains the list of docs which contain each term along with frequency | |
| Positions | .pos | Stores position information about where a term occurs in the index | |
| Payloads | .pay | Stores additional per-position metadata information such as character offsets and user payloads | |
| Norms | .nvd, .nvm | Encodes length and boost factors for docs and fields | |
| Per-Document Values | .dvd, .dvm | Encodes additional scoring factors or other per-document information. | |
| Term Vector Index | .tvx | Stores offset into the document data file | |
| Term Vector Data | .tvd | Contains term vector data. | |
| Live Documents | .liv | Info about what documents are live | |
| Point values | .dii, .dim | Holds indexed points, if any |
3. 文件詳細信息
1.segment_N
??segment_N文件中記錄了當前索引有哪些活躍的段(segment)。在一個index的目錄下有可能有一個或者多個segment_N文件,但是只有N值最大的那個文件是有效文件(舊的segment_N存在一般是因為這些文件暫時還不能被刪掉,或者是使用了自定義的IndexDeletionPolicy 策略)。segment_N包含每個段的name以及這個段使用的編碼(codec)和對應的刪除文件。
內容格式:
segments_N: Header, LuceneVersion, Version, NameCounter, SegCount, MinSegmentLuceneVersion, <SegName, SegID, SegCodec, DelGen, DeletionCount, FieldInfosGen, DocValuesGen, UpdatesFiles>SegCount, CommitUserData, Footer
解釋:
Header: 一個uint32的魔數,當前文件編碼,一個字符串標識文件格式,一個version 數字(標識當前文件的version目前不太明確),一個16byte的id,一個字節標識后綴長度,對應多個字節標識后綴內容
LuceneVersion: 這次lucene commit (每次提交會產生一個segment_N),使用的lucene的version,使用了三個vint,標識主版本,小版本,bugfix版本(這個和lucene的version記錄方式密切相關)
Version: 這個記錄了當前index被add和deleting操作改變的次數
NameCounter: 用來生成新的segment file的文件名,也就是代
SegCount:包含的segment的數量
MinSegmentLuceneVersion:最老的segment使用的lucene 對應的 version
未完待續
總結
以上是生活随笔為你收集整理的lucene的数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elasticsearch index
- 下一篇: lucene7.5的数据结构