理解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:建立Cluster。
已獲得API-KEY:API-KEY管理。
已安裝最新版SDK:安裝DashVector 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')