プライマリ・キー検索Compatible with Milvus 2.6.9+

類似性検索を行う場合、クエリ・ベクターがターゲット・コレクションにすでに存在する場合でも、常に1つ以上のクエリ・ベクターの入力を求められます。検索前にベクトルを取得するのを避けるには、代わりに主キーを使用します。

概要

eコマース・プラットフォームでは、ユーザはキーワードを入力して、それに一致する商品を検索できます。ユーザーが商品の詳細ページを表示すると、プラットフォームは比較したいユーザーのために、類似商品のリストもページの下に表示します。

おすすめ商品は、キーワードまたは現在の商品との類似度によってソートされる。これを実現するために、プラットフォーム開発者は、実際の類似検索を行う前にMilvusからキーワードまたは現在の商品のベクトル表現を取得する必要があり、これはプラットフォームとMilvus間のラウンドトリップを増加させ、ネットワーク上で大量の高次元floatが送信される結果となります。

アプリケーションとMilvus間のインタラクションロジックを簡素化し、ラウンドトリップ回数を減らし、大量の高次元浮動小数点値をネットワークに送信しないようにするには、プライマリキー検索を使用することを検討してください。

プライマリキー検索では、クエリベクトルを提供する必要はありません。その代わりに、クエリ・ベクトルを含むエンティティの主キー(ids)を提供するよう求められます。

制限と制約

  • 主キーを使用した検索は、BM25 関数のように VarChar フィールドから派生した疎なベクトル・フィールドを除 く、すべてのベクトル・データ型に適用されます。

  • フィルタ検索、範囲検索、グループ化検索では、クエリ・ベクタの代わりに主キーを使用できます。ただし、この機能はハイブリッド検索や検索イテレータには適用されません。

  • 埋め込みリストを含む類似検索の場合、クエリベクタを取得し、埋め込みリストに配置し、検索を実行する必要があります。

  • RESTful APIでは、クエリーベクターの代わりに主キーを使用することはできません。

  • 存在しない主キーや不正な形式の主キーの場合、Milvusはエラーを表示します。

  • 主キーとクエリベクタは互いに排他的です。両方を指定してもエラーになります。

以下の例は、提供されたすべてのInt64 IDがターゲットコレクションで利用可能であると仮定しています。

主キーはフィルタリングには使用されず、ベクトル検索にのみ使用されます。

基本的な主キー検索を行うには、クエリーベクトルを主キーに置き換えるだけでよい。

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 が対象コレクション内の 2 つのスキーマ定義フィールドであると仮定します。

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