全部產品
Search
文件中心

OpenSearch:索引表載入策略

更新時間:Jul 13, 2024

索引表載入策略配置

索引表的載入策略配置由多個索引檔案的載入策略組成,每個策略描述了一組索引檔案的具體載入方式。索引表在載入時,針對每個索引檔案,從上到下依次匹配策略規則,優先使用第一個匹配的策略載入索引檔案。

配置樣本

{
    "load_config":[
        {
            "file_patterns":[
                "_ATTRIBUTE_",
                "/index/title/.*",
                "/index/body/dictionary"
            ],
            "load_strategy":"mmap",
            "lifecycle":"hot",
            "load_strategy_param":{
                "lock":true,
                "partial_lock":true,
                "advise_random":false,
                "slice":4194304,
                "interval":2
            },
            "remote" : false,
            "deploy" : true,
            "warmup_strategy":"sequential"
        },
        {
            "file_patterns":[
                "_SUMMARY_"
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false,
                "direct_io":true,
                "cache_size":4096
            },
            "remote" : true,
            "deploy" : false
        },
        {
            "warmup_strategy":"none",
            "file_patterns":[
                ".*"
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":false
            }
        }
    ]
}

參數詳解

  • file_patterns:索引檔案匹配模式,使用Regex。索引表的目錄結構請參考索引檔案目錄結構,匹配模式是相對於segment目錄的檔案名稱的正則表示,比如要對倒排索引title設定獨立的載入策略,title索引的匹配模式正則表示為"/index/title/.*"(索引名為title,所以在index目錄中存在title索引目錄,對其下的所有檔案都需要匹配使用.*表示)。系統提供了一些內建的宏定義來簡化索引檔案匹配的設定:

    • _ATTRIBUTE_:等價於"/attribute/.*",表示所有的正排索引。

    • _INDEX_:等價於"/index/.*",表示所有的倒排索引。

    • _SUMMARY_:等價於"/summary/",表示所有的摘要索引。

  • load_strategy:載入策略,主要有mmap、cache兩種模式。

  • load_strategy_param:載入策略參數。

    • mmap載入策略參數

      • lock:mmap是否採用lock模式,預設為false。lock模式會將索引載入到記憶體不會換出,查詢效能較好,但是記憶體開銷較大。

      • partial_lock:是否對倒排索引採用部分lock,預設為false。部分lock會將倒排的一級詞典lock進記憶體,二級詞典不lock,以節省記憶體。

      • advise_random:mmap時會減少對磁碟的預讀行為,預設為false。對於索引過大,並不能全部load進記憶體的情境,查詢時磁碟IO往往會成為效能瓶頸,配置 true 該項後能顯著減少對磁碟的讀取量,提升查詢效能。

      • slice和interval:控制預熱載入索引的速度,每讀取 slice 大小就sleep interval 大小的時間,slice單位:B,interval 單位:ms。slice 和 interval 必須同時配置。slice預設 4MB,interval 預設 0(不限速)。

    • cache載入策略參數

      • direct_io: 是否使用DirectIO方式讀取檔案,預設 false。DirectIO模式讀取ssd盤中的資料,效能更好。

      • global_cache: 是否使用全域的BlockCache,預設 false。全域的BlockCache的大小是通過環境變數進行設定,目前還未開放,建議設定為false。

      • cache_size: global_cache為false時有效,配置BlockCache大小,單位:MB,預設 1MB。

      • block_size: 配置 Block 大小,單位:B,預設 4096B。

  • remote:與file_patterns匹配的索引檔案是否從遠端分布式儲存系統中讀取,true/false。只有need_read_remote_index設定為true時,remote才會起作用,need_read_remote_index設定為false時,remote會強制設定為false。

  • deploy:與file_patterns匹配的索引檔案是否需要分發到本地,true/false。只有need_deploy_index設定為true時,deploy才會起作用,need_deploy_index設定為false時,deploy會強制設定為false。

  • warmup_strategy:預熱策略,目前僅對 mmap 載入策略有效,預設為none(不預熱)。如果需要預熱請設定為sequential,表示順序讀取預熱。

使用樣本

mmap策略樣本

{
    "load_config":[
        {
            "file_patterns":[
                "/attribute/price/.*",  #屬性欄位price
                "/index/title/.*", #倒排索引title
                "/index/body/dictionary", #倒排索引body的詞典
                "/index/vector/aitheta.*" #向量索引vector
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":true,  #mmap lock模式
                "partial_lock":true, #部分lock,倒排索引詞典只lock一級詞典
                "slice":4194304, #預熱時,一次讀取4M,每次間隔2ms
                "interval":2
            },
            "remote" : false, #不訪問遠端
            "deploy" : true, #索引下發到本地
            "warmup_strategy":"sequential" #順序預熱
        },
        {
            "file_patterns":[
                "/attribute/tags", #屬性欄位tag
                "/index/倒排索引description/.*"  #倒排索引description
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":false,
            },
            "remote" : false,
            "deploy" : true,
            "warmup_strategy":"none"
        }
    ]
}

cache策略樣本

{
    "load_config":[
        {
            "file_patterns":[
                "_ATTRIBUTE_" #所有屬性欄位
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false, #不使用全域cache
                "direct_io":true, #DirectIO方式讀取檔案
                "cache_size":20480 #cache大小為20G
            },
            "remote" : false, #不訪問遠端
            "deploy" : true #索引下發到本地
        },
        {
            "file_patterns":[
                "/summary/data"  #摘要索引的data檔案
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false,
                "direct_io":true,
                "cache_size":4096
            },
            "remote" : false,
            "deploy" : true
        },
        {
            "warmup_strategy":"none",
            "file_patterns":[
                ".*"
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":false
            }
        }
    ]
}

儲存計算分離

#儲存計算分離需要設定need_read_remote_index為true
{
    "load_config":[
        {
            "file_patterns":[
                "/index/title/.*" #倒排索引title
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":true,  #mmap lock模式
                "partial_lock":true, #部分lock,倒排索引詞典只lock一級詞典
                "slice":4194304, #預熱時,一次讀取4M,每次間隔2ms
                "interval":2
            },
            "remote" : false, #不訪問遠端
            "deploy" : true, #索引下發到本地
            "warmup_strategy":"sequential" #順序預熱
        },
        {
            "file_patterns":[
                "_ATTRIBUTE_" #所有屬性欄位
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false, #不使用全域cache
                "direct_io":true, #DirectIO方式讀取檔案
                "cache_size":20480 #cache大小為20G
            },
            "remote" : true, #訪問遠端儲存
            "deploy" : false #索引不用下發到本地
        },
        {
            "file_patterns":[
                "/summary/data"  #摘要索引的data檔案
            ],
            "load_strategy":"cache",
            "load_strategy_param":{
                "global_cache":false,
                "direct_io":true,
                "cache_size":4096
            },
            "remote" : true, #訪問遠端儲存
            "deploy" : false #索引不用下發到本地
        },
        {
            "warmup_strategy":"none",
            "file_patterns":[
                ".*"
            ],
            "load_strategy":"mmap",
            "load_strategy_param":{
                "lock":false
            }
        }
    ]
}

索引檔案目錄結構

  |-- generation_0
      |-- partition_0_65535
          |-- index_format_version
          |-- index_partition_meta
          |-- schema.json
          |-- segment_0
              |-- attribute
                  `--attribute_name
                     `--data   
              |-- deletionmap
              |-- deploy_index
              |-- index
                 `--index_name
                    |-- bitmap_dictionary
                    |-- bitmap_posting
                    |-- dictionary
                    `-- posting
                  `--vector_index_name
                    |-- aitheta.index
                  	|-- aitheta.index.addr
              |-- summary
                	|-- data
                	|-- offset
              `-- segment_info
          |-- adaptive_bitmap__meta
              |--deploy_index
              |--dictionary_name
          |-- truncate_meta
              |-- deploy_index
              `-- truncate_meta_file 
          `-- version.0

名稱

說明

generation

generation_x是引擎區分不同版本全量索引的標識。

partition

partition是searcher載入索引的基本單位。如果一個partition中資料過多,會導致searcher效能降低。線上資料一般通過劃分多個partition的方式來保證每個searcher的檢索效率。

segment

segment是索引組成的基本單位。segment中包含了文檔的倒排和正排結構。index builder每次dump都會產生一個segment。多個segment可以通過merge策略進行合并。一個partition中可用的segment在version檔案中指明。

index

倒排索引的基本單位。

attribute

正排索引的基本單位。

deletionmap

刪除的doc記錄。

index_format_version

索引的版本資訊。用於檢查索引檔案是否符合binary要求。

index_partition_meta

儲存了全域排序的資訊。包括排序欄位和升降序。

schema.json

索引設定檔。主要記錄fields,index, attribute 和summary等資訊。引擎通過該檔案來載入索引。

version.0

version檔案。主要記錄當前partition中引擎需要載入的segment和最新doc的時間戳記。在即時build中,引擎會根據增量version的時間戳記過濾舊的原始文檔。

segment_info

segment資訊摘要。記錄了當前segment中文檔數目,當前segment是否merge過,locator資訊和最新doc時間戳記資訊。

dictionary

倒排索引的詞典

posting

倒排索引的倒排鏈檔案

bitmap_dictionary

如果開啟了bitmap高頻詞功能,該檔案表示bitmap高頻詞詞典。

bitmap_posting

如果開啟了bitmap高頻詞功能,該檔案表示bitmap高頻詞對應的倒排鏈。

aitheta.index

向量索引檔案

aitheta.index.addr

向量索引meta資訊