メインコンテンツまでスキップ

主キー検索

類似性検索を実行する際は、クエリベクトルが対象コレクションにすでに存在している場合でも、常に 1 つ以上のクエリベクトルを指定する必要があります。検索前にベクトルを取得することを避けるには、代わりに主キーを使用できます。

概要​

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

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

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

主キー検索では、クエリベクトルを指定する必要はありません。代わりに、クエリベクトルを含むエンティティの主キー(ids)を指定します。

制限と制約​

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

  • フィルター検索、範囲検索、グループ化検索では、必要に応じてページネーションを有効にした状態で、クエリベクトルの代わりに主キーを使用できます。ただし、この機能はハイブリッド検索と検索イテレーターには適用されません。

  • 埋め込みリストを含む類似性検索では、引き続きクエリベクトルを取得し、埋め込みリストに整理してから検索を実行する必要があります。

  • 存在しない主キーや形式が正しくない主キーについては、Milvus がエラーを通知します。

  • 主キーとクエリベクトルは相互に排他的です。両方を指定した場合もエラーになります。

例​

次の例では、指定したすべての Int64 ID が対象コレクション内に存在することを前提としています。

Notes

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

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

python
from pymilvus import MilvusClient

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

res = client.search(
collection_name="my_collection",
anns_field="vector",
ids=[551, 296, 43], # a list of primary keys
limit=3
)

for hits in res:
for hit in hits:
print(hit)

例 2: 主キーを使用したフィルター検索​

次の例では、color と likes が対象コレクションでスキーマ定義された 2 つのフィールドであることを前提としています。

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

例 3: 主キーを使用した範囲検索​

python
res = client.search(
collection_name="my_collection",
ids=[551, 296, 43],
limit=3,
search_params={
"params": {
"radius": 0.4,
"range_filter": 0.6
}
}
)

例 4: 主キーを使用したグループ化検索​

次の例では、docId が対象コレクションでスキーマ定義されたフィールドであることを前提としています。

python
res = client.search(
collection_name="my_collection",
ids=[551, 296, 43],
limit=3,
group_by_field="docId",
output_fields=["docId"]
)