分割槽Partition

DashVector發表於2024-11-14

理解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')

相關文章