主鍵搜尋Compatible with Milvus 2.6.9+

進行相似性檢索時,總是會要求您提供一個或多個查詢向量,即使這些查詢向量已經存在於目標資料集中。為了避免在搜尋之前擷取向量,您可以使用主鍵來代替。

概觀

在電子商務平台上,使用者可以輸入關鍵字來擷取符合該關鍵字的產品。當使用者檢視產品詳細頁面後,平台也會在頁面底部顯示相似產品清單,供想要比較的使用者參考。

這些推薦會依據與關鍵字或目前產品的相似度排序。為了達到這個目的,平台開發人員需要在實際的相似性搜尋之前,先從 Milvus 擷取關鍵字或目前產品的向量表示,這會增加平台與 Milvus 之間的往返,並導致大量高維浮動值在網路上傳輸。

為了簡化您的應用程式與 Milvus 之間的互動邏輯,減少往返次數,並避免在網路上傳輸大量的高維浮點數值,請考慮使用主鍵搜尋。

在主鍵搜尋中,您不需要提供任何查詢向量。相反,您需要提供包含查詢向量的實體的主索引鍵 (ids)。

限制與約束

  • 使用主索引鍵的搜尋適用於所有向量資料類型,除了從 VarChar 欄位衍生出來的稀疏向量欄位,如 BM25 函式。

  • 您可以在篩選、範圍和群組搜尋中使用主索引鍵取代查詢向量,並可選擇啟用分頁功能。但是,此功能不適用於混合搜尋和搜尋迭接器。

  • 對於涉及嵌入清單的相似性搜尋,您仍需要擷取查詢向量、將它們排列成嵌入清單,然後執行搜尋。

  • 您不能在 RESTful API 中使用主鍵來取代查詢向量。

  • 對於任何不存在的主鍵或格式不正確的主鍵,Milvus 會提示錯誤。

  • 主鍵和查詢向量是互相排斥的。同時提供兩者也會導致錯誤。

範例

以下範例假設所有提供的 Int64 ID 在目標集合中都是可用的。

主鍵不會用於篩選;它們只會用於向量擷取。

若要進行基本的 primary-key 搜尋,只要將查詢向量換成 primary keys 即可。

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)

res = client.search(
    collection_name="quick_setup",
    anns_field="vector",
    ids=[551, 296, 43], # a list of primary keys
    limit=3,
    search_params={"metric_type": "IP"}
)

for hits in res:
    for hit in hits:
        print(hit)
// java
// node.js
// go
# restful

範例 2:使用主鍵進行篩選搜尋

以下範例假設 color 和 likes 是目標集合中兩個模式定義的欄位。

res = client.search(
    collection_name="my_collection",
    ids=[551, 296, 43], #
    filter='color like "red%" and likes > 50',
    output_fields=["color", "likes"],
    limit=3,
)
// java
// node.js
// go
# restful

範例 3:使用主鍵的範圍搜尋

res = client.search(
    collection_name="my_collection",
    ids=[551, 296, 43],
    limit=3,
    search_params={
        "params": {
            "radius": 0.4,
            "range_filter": 0.6
        }
    }
)
// java
// node.js
// go
# restful

範例 4:使用主索引鍵進行群組搜尋

以下範例假設docId 是目標集合中一個模式定義的欄位。

res = client.search(
    collection_name="my_collection",
    ids=[551, 296, 43],
    limit=3,
    group_by_field="docId",
    output_fields=["docId"]
)
// java
// node.js
// go
# restful