TairVector是Tair自研的擴充資料結構,提供高效能、即時,集儲存、檢索於一體的向量資料庫服務。
TairVector簡介
TairVector採用多層Hash的資料結構,如下所示:TairVector提供了HNSW(Hierarchical Navigable Small World)和暴力搜尋(Flat Search)兩種索引演算法:
HNSW:以圖結構構建向量檢索的索引,支援非同步空間回收,可以在保證高查詢精度的同時,均衡即時更新的效能表現。
暴力搜尋:具有100%查詢精度,插入資料速度快,適用於小規模資料集。
同時,TairVector支援歐式距離(Euclidean distance)、向量內積(Internal product)、餘弦距離(Cosine distance)和Jaccard距離(Jaccard distance)等多種距離函數。相對於傳統的向量檢索服務,TairVector的優勢如下:
所有資料均在記憶體中,支援即時更新索引,具有更短的讀寫時延。
最佳化記憶體資料結構,佔用空間更小。
開箱即用,以雲端服務的方式整體申請即可使用,整體架構簡單高效,沒有複雜組件依賴。
支援向量檢索與全文檢索索引組合的混合檢索。
支援建立標量(標籤屬性等)倒排索引,並提供先標量後向量的KNN檢索特性。
發布記錄
2022年10月13日隨Tair記憶體型(相容Redis 6.0)首次發布TairVector。
2022年11月22日發布6.2.2.0版本,新增支援Jaccard距離函數、TVS.GETINDEX命令支援統計每個索引的記憶體佔用(
index_data_size
和attribute_data_size
)。2022年12月26日發布6.2.3.0版本,支援叢集代理模式,新增FLOAT16的向量資料類型,新增TVS.MINDEXKNNSEARCH、TVS.MINDEXMKNNSEARCH命令。
2023年07月04日發布6.2.8.2版本,支援餘弦距離、支援HNSW索引垃圾自動回收。
2023年08月03日發布23.8.0.0版本,支援對Index中的key層級設定TTL(新增TVS.HEXPIREAT、TVS.HPEXPIREAT等命令),支援對指定Key列表進行向量近鄰查詢(新增TVS.GETDISTANCE命令),支援全文檢索索引(更新TVS.CREATEINDEX、TVS.KNNSEARCH等命令),可以實現向量檢索與全文檢索索引組合的混合檢索。
2024年06月06日發布24.5.1.0版本,新增TVS.KNNSEARCHFIELD、TVS.MINDEXKNNSEARCHFIELD命令,支援在近鄰查詢時返回標籤屬性資訊。
2024年07月22日發布24.7.0.0版本,支援在稀疏向量中使用HNSW索引。
最佳實務
前提條件
執行個體的儲存介質為記憶體型(相容Redis 6.0及以上)。
記憶體型(相容Redis 5.0)執行個體暫不支援升級至記憶體型(相容Redis 6.0),如需使用請建立執行個體。
注意事項
操作對象為Tair執行個體中的TairVector資料。
TairVector資料結構的index_name、Key等暫不支援Redis的Hashtags特性。
TairVector暫不支援MOVE等特性。
若業務情境對資料持久化要求較高,建議開啟半同步功能,將#no_loose_tsync-repl-mode參數的值改為semisync,具體操作請參見設定執行個體參數。
命令列表
表 1. TairVector命令
類型 | 命令 | 文法 | 說明 |
索引中繼資料操作 |
| 建立一個向量索引空間,同時指定構建索引和查詢的具體演算法,以及距離函數。該對象僅能通過 | |
| 查詢指定的向量索引,擷取該向量索引的中繼資料資訊。 | ||
| 刪除指定的向量索引及該索引內的所有資料。 | ||
| 掃描Tair執行個體中所有合格向量索引。 | ||
向量資料操作 |
| 往向量索引中插入資料記錄(key),若該記錄已存在則更新並覆蓋原記錄。 | |
| 查詢指定向量索引中的key對應的所有資料記錄。 | ||
| 查詢指定向量索引的key中對應的attribute_key所對應的數值。 | ||
| 在指定向量索引中,刪除指定資料記錄(key)。 | ||
| 在向量索引的資料記錄(key)中,刪除指定的attribute_key與其數值。 | ||
| 在指定向量索引中,掃描合格資料記錄(key)。 | ||
| 在指定向量索引中,將指定資料記錄(key)的attribute_key的值增加num,num為一個整數。 | ||
| 在指定向量索引中,將指定資料記錄(key)的attribute_key的值增加num,num為一個浮點數。 | ||
| 在指定向量索引中,為指定資料記錄(key)設定絕對到期時間,精確到毫秒。 | ||
| 在指定向量索引中,為指定資料記錄(key)設定相對到期時間,精確到毫秒。 | ||
| 在指定向量索引中,為指定資料記錄(key)設定絕對到期時間,精確到秒。 | ||
| 在指定向量索引中,為指定資料記錄(key)設定相對到期時間,精確到秒。 | ||
| 在指定向量索引中,查看指定資料記錄(key)的剩餘到期時間,精確到毫秒。 | ||
| 在指定向量索引中,查看指定資料記錄(key)的剩餘到期時間,精確到秒。 | ||
| 在指定向量索引中,查看指定資料記錄(key)的絕對到期時間,精確到毫秒。 | ||
| 在指定向量索引中,查看指定資料記錄(key)的絕對到期時間,精確到秒。 | ||
向量近鄰查詢 |
| 在指定向量索引中,對指定的向量(VECTOR)進行近鄰查詢,最多可返回topN條。 | |
| 在指定向量索引中,對指定的向量(VECTOR)進行近鄰查詢,檢索邏輯與TVS.KNNSEARCH相同,額外支援返回標籤屬性。 | ||
| 在指定向量索引中,針對指定Key列表,進行向量(VECTOR)近鄰查詢。 | ||
| 在指定向量索引中,批量對多條向量(VECTOR)進行近鄰查詢。 | ||
| 在多個向量索引中,對指定的向量(VECTOR)進行近鄰查詢。 | ||
| 在多個向量索引中,對指定的向量(VECTOR)進行近鄰查詢,支援返回標籤屬性。 | ||
| 在多個向量索引中,批量對多條向量(VECTOR)進行近鄰查詢。 |
本文的命令文法定義如下:
大寫關鍵字
:命令關鍵字。斜體
:變數。[options]
:選擇性參數,不在括弧中的參數為必選。A|B
:該組參數互斥,請進行二選一或多選一。...
:前面的內容可重複。
TVS.CREATEINDEX
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 建立一個向量索引空間,同時指定構建索引和查詢的具體演算法,以及距離函數。該對象僅能通過 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本均為如下:
|
TVS.GETINDEX
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 查詢指定的向量索引,擷取該向量索引的中繼資料資訊。 |
選項 |
|
傳回值 |
|
樣本 | 請提前執行如下命令:
命令樣本(以HNSW演算法的向量索引為例):
返回樣本:
|
TVS.DELINDEX
類別 | 說明 |
文法 |
|
時間複雜度 | O(N),N為該向量索引中Key的數量。 |
命令描述 | 刪除指定的向量索引及該索引內的所有資料。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.SCANINDEX
類別 | 說明 |
文法 |
|
時間複雜度 | O(N),N為Tair執行個體中向量索引數量。 |
命令描述 | 掃描Tair執行個體中所有合格向量索引。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
帶Pattern的查詢樣本:
返回樣本:
|
TVS.HSET
類別 | 說明 |
文法 |
|
時間複雜度 | 若本次插入、更新資料無需建立或更新向量值,則時間複雜度為O(1);否則時間複雜度為O(log(N)),N為該向量索引中Key的數量。 |
命令描述 | 往向量索引中插入資料記錄(key),若該記錄已存在則更新並覆蓋原記錄。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HGETALL
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 查詢指定向量索引中的key對應的所有資料記錄。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HMGET
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 查詢指定向量索引的key中對應的attribute_key所對應的數值。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.DEL
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,刪除指定資料記錄(key)。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HDEL
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在向量索引的資料記錄(key)中,刪除指定的attribute_key與其數值。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.SCAN
類別 | 說明 |
文法 |
|
時間複雜度 | O(N),N為該向量索引中Key的數量。 |
命令描述 | 在指定向量索引中,掃描合格資料記錄(key)。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HINCRBY
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,將指定資料記錄(key)的attribute_key的值增加num,num為一個整數。 若指定的attribute_key不存在則自動建立並賦予該值,若該記錄已存在則更新並覆蓋原值。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HINCRBYFLOAT
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,將指定資料記錄(key)的attribute_key的值增加num,num為一個浮點數。 若指定的attribute_key不存在則自動建立並賦予該值,若該記錄已存在則更新並覆蓋原值。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HPEXPIREAT
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,為指定資料記錄(key)設定絕對到期時間,精確到毫秒。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HPEXPIRE
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,為指定資料記錄(key)設定相對到期時間,精確到毫秒。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HEXPIREAT
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,為指定資料記錄(key)設定絕對到期時間,精確到秒。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HEXPIRE
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,為指定資料記錄(key)設定相對到期時間,精確到秒。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HPTTL
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,查看指定資料記錄(key)的剩餘到期時間,精確到毫秒。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HTTL
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,查看指定資料記錄(key)的剩餘到期時間,精確到秒。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HPEXPIRETIME
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,查看指定資料記錄(key)的絕對到期時間,精確到毫秒。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.HEXPIRETIME
類別 | 說明 |
文法 |
|
時間複雜度 | O(1) |
命令描述 | 在指定向量索引中,查看指定資料記錄(key)的絕對到期時間,精確到秒。 |
選項 |
|
傳回值 |
|
樣本 | 命令樣本:
返回樣本:
|
TVS.KNNSEARCH
類別 | 說明 |
文法 |
|
時間複雜度 |
N為該向量索引中Key的數量。 |
命令描述 | 在指定向量索引中,對指定的向量(VECTOR)進行近鄰查詢,最多可返回topN條。 |
選項 |
|
傳回值 |
|
樣本 | 請提前執行如下命令:
命令樣本1:
返回樣本1:
命令樣本2:
返回樣本2:
|
TVS.KNNSEARCHFIELD
類別 | 說明 |
文法 |
|
時間複雜度 |
N為該向量索引中Key的數量。 |
命令描述 | 在指定向量索引中,對指定的向量(VECTOR)進行近鄰查詢,檢索邏輯與TVS.KNNSEARCH相同,額外支援返回標籤屬性。 |
選項 |
|
傳回值 |
|
樣本 | 請提前執行如下命令:
命令樣本:
返回樣本:
|
TVS.GETDISTANCE
類別 | 說明 |
文法 |
|
時間複雜度 |
N為該向量索引中Key的數量。 |
命令描述 | 在指定向量索引中,針對指定Key列表,進行向量(VECTOR)近鄰查詢。 |
選項 |
|
傳回值 |
|
樣本 | 請提前執行如下命令:
命令樣本:
返回樣本:
|
TVS.MKNNSEARCH
類別 | 說明 |
文法 |
|
時間複雜度 |
N為該向量索引中Key的數量。 |
命令描述 | 在指定向量索引中,批量對多條向量(VECTOR)進行近鄰查詢。 |
選項 |
|
傳回值 |
|
樣本 | 請提前執行如下命令:
命令樣本:
返回樣本:
|
TVS.MINDEXKNNSEARCH
類別 | 說明 |
文法 |
|
時間複雜度 |
N為該向量索引中Key的數量。 |
命令描述 | 在多個向量索引中,對指定的向量(VECTOR)進行近鄰查詢。 |
選項 |
|
傳回值 |
|
樣本 | 請提前執行如下命令:
命令樣本:
返回樣本:
|
TVS.MINDEXKNNSEARCHFIELD
類別 | 說明 |
文法 |
|
時間複雜度 |
N為該向量索引中Key的數量。 |
命令描述 | 在多個向量索引中,對指定的向量(VECTOR)進行近鄰查詢,支援返回標籤屬性。 |
選項 |
|
傳回值 |
|
樣本 | 請提前執行如下命令:
命令樣本:
返回樣本:
|
TVS.MINDEXMKNNSEARCH
類別 | 說明 |
文法 |
|
時間複雜度 |
N為該向量索引中Key的數量。 |
命令描述 | 在多個向量索引中,批量對多條向量(VECTOR)進行近鄰查詢。 |
選項 |
|
傳回值 |
|
樣本 | 請提前執行如下命令:
命令樣本:
返回樣本:
|