プライマリ・キー検索Compatible with Milvus 2.6.9+
類似性検索を行う場合、クエリ・ベクターがターゲット・コレクションにすでに存在する場合でも、常に1つ以上のクエリ・ベクターの入力を求められます。検索前にベクトルを取得するのを避けるには、代わりに主キーを使用します。
概要
eコマース・プラットフォームでは、ユーザはキーワードを入力して、それに一致する商品を検索できます。ユーザーが商品の詳細ページを表示すると、プラットフォームは比較したいユーザーのために、類似商品のリストもページの下に表示します。
おすすめ商品は、キーワードまたは現在の商品との類似度によってソートされる。これを実現するために、プラットフォーム開発者は、実際の類似検索を行う前にMilvusからキーワードまたは現在の商品のベクトル表現を取得する必要があり、これはプラットフォームとMilvus間のラウンドトリップを増加させ、ネットワーク上で大量の高次元floatが送信される結果となります。
アプリケーションとMilvus間のインタラクションロジックを簡素化し、ラウンドトリップ回数を減らし、大量の高次元浮動小数点値をネットワークに送信しないようにするには、プライマリキー検索を使用することを検討してください。
プライマリキー検索では、クエリベクトルを提供する必要はありません。その代わりに、クエリ・ベクトルを含むエンティティの主キー(ids)を提供するよう求められます。
制限と制約
主キーを使用した検索は、BM25 関数のように VarChar フィールドから派生した疎なベクトル・フィールドを除 く、すべてのベクトル・データ型に適用されます。
フィルタ検索、範囲検索、グループ化検索では、クエリ・ベクタの代わりに主キーを使用できます。ただし、この機能はハイブリッド検索や検索イテレータには適用されません。
埋め込みリストを含む類似検索の場合、クエリベクタを取得し、埋め込みリストに配置し、検索を実行する必要があります。
RESTful APIでは、クエリーベクターの代わりに主キーを使用することはできません。
存在しない主キーや不正な形式の主キーの場合、Milvusはエラーを表示します。
主キーとクエリベクタは互いに排他的です。両方を指定してもエラーになります。
例
以下の例は、提供されたすべてのInt64 IDがターゲットコレクションで利用可能であると仮定しています。
主キーはフィルタリングには使用されず、ベクトル検索にのみ使用されます。
例1:基本的な主キー検索
基本的な主キー検索を行うには、クエリーベクトルを主キーに置き換えるだけでよい。
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