日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lucene的数据类型

發布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lucene的数据类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 總覽
    • 1. lucene的數據類型
      • VInt詳解
      • ZInt 詳解
    • 2. lucene的基本結構
      • 1. doc number
      • 2. 段(segment) 的信息
      • 3. 文件信息
    • 3. 文件詳細信息
      • 1.segment_N

總覽

首先說明,這一篇文章有點過時了,可以參考這篇更加全面來看

??這里主要想要介紹一下lucene的存儲層面的東西,lucene的設計本來就很精巧,所以想了解需要花一些心思的。

  • lucene的數據類型
  • lucene包含了哪些信息
  • 擁有哪些文件
  • 1. lucene的數據類型

    Byte:是最基本的類型,長8位(bit)。
    Int32:由4個Byte組成。
    Long64:由8個Byte組成。
    VInt:可變字節的int,更小的數字比int32使用了更小的字節數
    VLong: 可變字節的long類型
    ZInt: 這個用來表示比較小的有符號數,也就是負數
    ZLong: 同ZInt

    VInt詳解

  • vint可能包含1-5 byte,對于每個byte的8位,其中后7位表示數值,最高1位表示是否還有另一個Byte,0表示沒有,1表示有。這樣的話小的int數字使用的字節數就更小。
  • 前面的Byte表示數值的低位,越后面的Byte表示數值的高位。
    比如 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) 的信息

  • Segment info:包含了一個segment的元信息,比如documents的數量,是否使用了復合文件等信息
  • Field names:包含了索引中所有的filed的信息
  • Stored Field values: 存儲每個doc的filed信息,是一個Map<k,v>的結構,k是域名,v是域的值,按照doc number進行分組
  • Term dictionary: term詞典,包含了所有文檔的全部的分詞后的詞(也有可能是keyword)。同時還包含了該term所在文檔數量,以及指向詞頻信息和位置信息的指針。
  • Term Frequency data: 詞頻信息,包含該詞匯的文檔的數量df,以及 在每篇文檔中出現的頻次tf
  • Term Proximity data: 詞位置信息,詞存儲在每篇文檔中出現的位置。
  • Normalization factors: 標準化因子,對文檔中的每一個域存儲一個值(不是每個term),這個值在計算打分的時候會乘以計算出來的分數
  • Term Vectors: 詞向量,對于文檔中的每個域(field),可以存儲詞向量,有時稱作文檔向量(document vector))。詞向量(term vector)由詞(term)的文本和詞頻(term frequency)組成
  • Per-document values:類似stored values ,也是用doc number 來進行分組,但其通常加載到主內存中以便快速訪問。經常用來存儲一些搜索的總結性結果,單個文檔值對于打分元素(scoring factors)這類過程非常有用。
  • Live documents:一個輔助行的用來標識哪些文檔是活躍狀態的文件。
  • Point values:一個可選的文件,用來記錄多維度的數據類型,同時也支持通過大數字的范圍過濾,比如bigInteger ,地理位置信息等
  • 3. 文件信息

    ??每一個段都包含了很多個文件來存儲不同的信息。存儲不同信息的文件的拓展名不一樣,但是對于同一個段來說,所有的歸屬該段的文件名都是一致的。
    如果使用復合的文件格式的話,會把多個段的數據信息存在一個文件當中(一般都是多個小段,當然 除了段的元數據文件,lock文件,和del文件),這個復合文件是.cfs文件。
    通常情況下,一個索引下的所有段(segment)存儲在單個目錄(dierctory)中,盡管這不是必須的。
    文件名不會重復使用,這個使用了按代增長的方式,,比如segment_1, segment_2等,每一代是一個有序的長整型數字,進行base36編碼(5位一個新字節)的方式展現出來。

    NameExtensionBriefDescription
    Segments Filesegments_NStores information about a commit point
    Lock Filewrite.lockThe Write lock prevents multiple IndexWriters from writing to the same file.
    Segment Info.siStores metadata about a segment
    Compound File.cfs, .cfeAn optional “virtual” file consisting of all the other index files for systems that frequently run out of file handles.
    Fields.fnmStores information about the fields
    Field Index.fdxContains pointers to field data
    Field Data.fdtThe stored fields for documents
    Term Dictionary.timThe term dictionary, stores term info
    Term Index.tipThe index into the Term Dictionary
    Frequencies.docContains the list of docs which contain each term along with frequency
    Positions.posStores position information about where a term occurs in the index
    Payloads.payStores additional per-position metadata information such as character offsets and user payloads
    Norms.nvd, .nvmEncodes length and boost factors for docs and fields
    Per-Document Values.dvd, .dvmEncodes additional scoring factors or other per-document information.
    Term Vector Index.tvxStores offset into the document data file
    Term Vector Data.tvdContains term vector data.
    Live Documents.livInfo about what documents are live
    Point values.dii, .dimHolds 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的数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。