索引表配置介紹
索引表配置是向量檢索版中最重要的一個配置,它描述了原始文檔的資料格式,並基於這些資料如何構建索引。這些索引包括倒排索引、正排索引、摘要索引。
索引表配置
配置概覽
{
"table_name":"sample",
"fields":[
],
"indexs":[
],
"attributes":[
],
"summarys":{
},
"dictionaries":[
],
"adaptive_dictionaries":[
],
"enable_ttl":true,
"ttl_field_name":"ttl_filed",
"default_ttl":86400
}
table_name:索引表名稱,用於標識一個索引表,最終系統會生產一個$table_name_schema.json的索引表設定檔。
fields:欄位資訊,描述了用於構建索引的欄位。
indexs:倒排索引配置。
attributes:正排索引配置。
summarys:摘要索引配置。
dictionaries:用於配置建立 bitmap 索引所需要的字典,如果不建立 bitmap 索引則不用配置該項。對高頻詞建立高頻詞典或者自適應詞典能有效減少索引空間,提高檢索效能。
adaptive_dictionaries:建立自適應 bitmap 索引。根據配置的規則,產生高頻詞和對應的 bitmap 索引,如果不需要可以不配合該項。
file_compress:聲明各種檔案壓縮方式的參數和別名,可供正排,倒排,summary使用檔案層級的壓縮。
enable_ttl:是否使用 TTL(time to live) 功能,到期資料會被自動清理。預設為 false。
ttl_field_name:指定表中欄位作為ttl的欄位,原始文檔該欄位沒有填值則置為預設值。如果使用者沒有配置,是使用內建欄位ops_doc_time_to_live_in_seconds,如果使用者配置,需要欄位為uint32單實值型別。
default_ttl:TTL 的預設值。如果只配置 enable_ttl ,沒有配置default_ttl ,使用預設值 std::numeric_limits<int64_t>::max() >> 20。如果只配置default_ttl 時,enable_ttl 會自動化佈建為 true。
fields配置
"fileds":[
{
"field_name":"title",
"field_type":"TEXT",
"analyzer":"chn_standard"
},
{
"field_name":"dup_title",
"field_type":"TEXT",
"analyzer":"fuzzy"
"user_defined_param" : {
"copy_from" : "title"
}
},
{
"field_name":"category",
"field_type":"INTEGER",
"multi_value":true,
"compress_type":"uniq|equal"
},
{
"field_name":"mlr_features",
"field_type":"INTEGER",
"multi_value":true,
"updatable_multi_value":true
},
{
"field_name":"feature",
"field_type":"float",
"multi_value":true,
"fixed_multi_value_count":32,
"compress_type":"uniq|fp16",
"updatable_multi_value":true
},
{
"field_name":"user_id",
"field_type":"INTEGER"
},
{
"field_name":"price",
"field_type":"INTEGER",
"enable_null":true,
"default_null_string":"default_null"
},
{
"field_name":"product_id",
"field_type":"LONG"
},
{
"field_name":"product_type",
"field_type":"UINT8",
"compress_type":"equal"
},
{
"field_name":"bitwords",
"field_type":"STRING",
"multi_value":true
},
{
"field_name":"date",
"field_type":"DATE"
},
{
"field_name":"time",
"field_type":"TIME"
},
{
"field_name":"timestamp",
"field_type":"TIMESTAMP",
"default_time_zone":"+0800"
}
]
field_name : 欄位名稱。
field_type : 欄位基本類型,詳情請參考召回引擎版內建欄位類型。
analyzer : 類型為TEXT的欄位所用的分詞器。TEXT類型的field必須配置analyzer,其他類型不允許配置analyzer,召回引擎版支援的內建分析器請參考分析器說明。如果一個欄位想使用不同的分析器,必須擴充出來一個新的欄位,可以通過在schema中新增一個欄位,並配置user_defined_param選項來實現,詳細請參考上面的dup_title欄位配置。
multi_value : 表明該field為多值(如果用於建立attirubte則建立多值attribute),預設值為false。
updatable_multi_value : 表示該多實值型別欄位(或單值STRING類型欄位)可以更新。預設值為false。支援欄位類型為:INT8,UINT8,INT16,UINT16,INTEGER(32 bit integer),UINT32,LONG(64 bit integer),UINT64,FLOAT,DOUBLE,STRING。除上述多重值欄位外,本配置還支援單值STRING類型。在配置updatable_multi_value=true時,還可以配置u32offset_threshold(預設為0xFFFFFFFFL,通常情況下,使用者應忽略該配置項),當最大Offset超過u32offset_threshold時,將使用8位元組Offset檔案格式,否則使用4位元組Offset檔案格式。
fixed_multi_value_count: 多值的固定個數,如果配置該欄位,則該欄位在attribute索引中為定長多重值欄位,目前支援int8/int16/int32/int64/uint8/uint16/uint32/uint64/float/double類型欄位配置為定長多值attribute。fixed_multi_value_count可以為單值string欄位配置定長長度,不支援多值string欄位配置
compress_type :指定該欄位作為attribute欄位儲存時的壓縮方法,取值可以為uniq|equal任意一個或者組合,預設值為空白(不壓縮)。
多值attribute或者string attribute,配置uniq則對data資料進行排重壓縮儲存;配置equal則對offset資料進行等值壓縮
單值整型attribute不能配置uniq,可以配置equal對data資料進行等值壓縮;FLOAT/DOUBLE浮點型單值attribute也支援等值壓縮配置
其他壓縮方式:當欄位類型為定長多值的float類型欄位時,除了uniq|equal外,還可以額外選定如下fp16/block_fp/int8#[absMax]三種有損精度的編碼壓縮方式中的一種,進行編碼壓縮儲存。當欄位類型為單值float類型,也可配置fp16/int8#[absMax]兩種編碼方式中的一種進行壓縮。
fp16和blockfp壓縮效果均接近50%, fp16編碼空間略小,但精度損失比block_fp更大
int8#[absMax]:需要使用者指定編碼數值的絕對值上限,如int8#1.5, 則編碼值範圍在[-1.5, 1.5],壓縮後效果為原值的25%,精度損失和absMax相關,absMax越大,精度損失越大
enable_null :指定該欄位是否允許空值。enable_null為true的時候,對應欄位不可以配置成定長多值或者是單值equal壓縮。
default_null_string :指定空值的字面值,預設是"__NULL__"。
TIMESTAMP類型欄位可以配置預設時區欄位default_time_zone,格式形態為+/-HHMM(例:+0800對應GMT/UTC+0800北京時間)。配置了預設時區後,解析TIMESTAMP欄位時,欄位值如果不帶時區資訊則按照預設時區理解進行GMT/UTC時間戳記轉換。該欄位如果儲存為summary欄位,則按照預設時區進行展示
indexs配置
"indexs":
[
{index1},
{index2},
……
{indexn}
]
indexs配置是一個列表,每一項都是一個完整的index配置,召回引擎版支援的index類型及配置請參考倒排索引介紹。
attributes配置
"attributes": [
"user_id",
"product_id",
"category"
]
attributes配置是一個欄位的列表,欄位必須在fields中聲明,除了TEXT類型不能建立成attribute之外,其他都能建立為attribute。
注意:
TIME/DATE/TIMESTAMP類型的正排索引儲存含義如下:
DATE: 從1970.01.01到date的天數(單值4位元組儲存), 使用者如有需要可以取值後乘以86400000(單日ms總數)換算為時間戳記。
TIME:從00:00:00到time的毫秒數(單值4位元組儲存)。
TIMESTAMP: 從1970.01.01到timestamp的毫秒數(單值8位元組儲存)。
summarys配置
"summarys":
{
"summary_fields":["id", "company_id", "subject", "cat_id"],
"compress":false
}
summary_fields:配置需要進入summary的field,對於field的類型沒有限制,field必須在fileds中聲明。
compress:summary是否需要壓縮(使用zlib),true為需要壓縮,false為不壓縮,預設值為false。
dictionaries配置
"dictionaries":[
{
"dictionary_name":"bitmap1",
"content":"a;an"
},
{
"dictionary_name":"bitmap2",
"content":"of;and"
}
]
dictionary_name:字典的名稱;
content: 列舉該字典中的所有單詞,各單詞之間以“;”分隔。
adaptive_dictionaries配置
"adaptive_dictionaries":[
{
"adaptive_dictionary_name":"df",
"dict_type":"DOC_FREQUENCY",
"threshold":1500000
},
{
"adaptive_dictionary_name":"percent",
"dict_type":"PERCENT",
"threshold":30
},
{
"adaptive_dictionary_name":"size",
"dict_type":"INDEX_SIZE"
}
]
adaptive_dictionary_name:自適應高頻詞典建置規則名稱。
dict_type:自適應高頻詞建置規則類型。主要有三種:
DOC_FREQUENCY : 將df>=threshold的term作為高頻詞。
PERCENT : 將滿足df/totalDocCount*100>=threshold 的term作為高頻詞。
INDEX_SIZE : 比較term產生的bitmap索引和原始索引的大小,當bitmap 索引較小時,認為該term是高頻詞。
注意:
一般建議將索引term可枚舉(如term固定為a,b,c可數的幾個)和查詢query中檢索比例相對不頻繁的倒排欄位對應的自適應bitmap規則設定為INDEX_SIZE; 對於term不可枚舉且查詢比較頻繁的倒排索引對應的自適應bitmap規則建議設定為PERCENT或DOC_FREQUENCY(配置閾值建議基於效能測試結果選擇,經驗閾值為文檔總數的5%,如文檔總數為1000w,則DOC_FREQUENCY閾值建議為50w/PERCENT閾值配置為5)。