理解Partition
向量檢索服務DashVector的Collection具有分割槽(Partition)的能力,同一個Collection下的Doc可透過不同的Partition進行物理和邏輯上的分割槽。各種Doc操作(如插入Doc、檢索Doc等。若指定Partition,則該操作將限定在該指定的Paritition內進行。透過合理的Partition設定,可有效提升Doc操作的效率。
-
同一個Collection下,可以建立若干個Partition,具體限制見約束與限制
-
每個Partition透過唯一的名稱進行標識,同一個Collection下的Partition名稱不可重複;
-
同一個Collection下的所有Partition,具有相同的Schema,如向量維度、向量資料型別、度量方式、Fields定義等;
-
每個Collection預設自帶一個無法刪除的Partition,當各種Doc操作(如插入Doc、檢索Doc等,不指定Partition時,等價於使用該預設Partition;
-
Partition需透過API呼叫顯示的建立和刪除。
Partition使用場景舉例
在Collection中使用Partition能顯著提高Query的效能,但並非所有場景都建議使用。當資料量較小時,使用Partition收益不明顯。當資料量較大、但沒有合適的劃分欄位時,同樣不建議使用Partition。例如,如果沒有合適的劃分欄位但又設定了多個Partition時,檢索時可能需要跨多個Partition進行多次Query,檢索效能將低於單個Partition的一次Query。
下面列舉幾個典型的適合Partition場景供參考。
電商圖搜場景
例如某跨境電商使用者,有2000w服裝商品圖片,需要實現以圖搜圖業務場景。商品有固定多個分類(鞋子,裙子,褲子等),商品提特徵後按類別入庫,每個分類對應一個Partition,查詢時使用者顯示指定類別或使用者不指定由分類模型確定類別。
影片監控場景
例如某影片監控廠商,需要對一工業園區的1000個攝像頭採集的影片進行抽幀,識別提取車輛特徵後,匯入DashVector向量庫用於後續搜尋,生成車輛軌跡等業務場景,但資料只需保留30天,按日期每天建立Partition,並定期刪除過期的Partition。
商標侵權檢測
例如某商標代理商收集了一個5000w規模的商標資料庫,需要快速查詢相似商標判定是否侵權。按結構分為文字商標、圖形商標、數字商標、字母商標等9個分類,每個分類資料入庫DashVector時對應一個Partition。查詢時指定Partition,只從特定類別中查詢。
多語言問答系統
某電商國際化知識庫團隊,需要根據使用者所使用的語言類別來查詢對應語言的相似問題,比如要支援中文、英文、法文三種語言。在知識庫內容經過Embedding後,分別匯入Chinese、English、French三個Partition中,查詢時,根據使用者所使用的語言類別選擇對應的Partition進行查詢。
多租戶
Partition也可用來支援多租戶場景。例如某電商服務商為其下小微電商提供以圖搜圖能力,可在一個Collection中建立多個Partition對應多個客戶,實現了資料的物理隔離、保證安全的同時,又節約了成本。
Partition使用示例
前提條件
- 已建立Cluster
- 已獲得API-KEY
- 已安裝最新版SDK
程式碼示例
說明
需要使用您的api-key替換示例中的 YOUR_API_KEY、您的Cluster Endpoint替換示例中的YOUR_CLUSTER_ENDPOINT,程式碼才能正常執行。
import dashvector
# 建立Client
client = dashvector.Client(
api_key='YOUR_API_KEY',
endpoint='YOUR_CLUSTER_ENDPOINT'
)
assert client
# 建立Collection
client.create(name='understand_partition', dimension=4)
collection = client.get('understand_partition')
assert collection
# 建立Partition,Partition名稱為shoes
collection.create_partition(name='shoes')
# 描述Partition
ret = collection.describe_partition('shoes')
print(ret)
# 檢視Partition列表
partitions = collection.list_partitions()
print(partitions)
# 插入Doc至Partition
collection.insert(
('1', [0.1,0.1,0.1,0.1]), partition='shoes'
)
# 向量相似性檢索時指定Partition
docs = collection.query(
vector=[0.1, 0.1, 0.2, 0.1],
partition='shoes'
)
print(docs)
# 從指定Partition中刪除Doc
collection.delete(ids=['1'], partition='shoes')
# 檢視Partition統計資料
ret = collection.stats_partition('shoes')
print(ret)
# 刪除Partition
collection.delete_partition('shoes')