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

Primary-Key Search

類似検索を行う際は、クエリ vector がすでに対象 collection 内に存在している場合でも、常に 1 つ以上のクエリ vector を指定する必要があります。検索前に vector を取得する手間を避けるには、代わりに primary key を使用できます。

概要

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

これらの推薦結果は、キーワードまたは現在の商品との類似度に基づいて並べ替えられます。これを実現するには、プラットフォーム開発者は実際の類似検索の前に、キーワードまたは現在の商品の vector 表現を Milvus から取得する必要があります。これにより、プラットフォームと Milvus 間の往復回数が増え、多数の高次元 float 値がネットワーク越しに送信されることになります。

アプリケーションと Milvus の間のやり取りのロジックを簡素化し、往復回数を減らし、大量の高次元浮動小数点値をネットワーク越しに送信することを避けるために、primary key search の使用を検討してください。

primary key search では、クエリ vector を指定する必要はありません。代わりに、クエリ vector を含む entity の primary key(ids)を指定します。

制限事項

  • primary key を使用した検索は、BM25 関数のように VarChar フィールドから派生した sparse vector フィールドを除き、すべての vector データ型に適用されます。

  • フィルタ付き検索、範囲検索、グループ化検索では、必要に応じて pagination を有効にしたうえで、クエリ vector の代わりに primary key を使用できます。ただし、この機能は hybrid search と search iterator には適用されません。

  • embedding list を含む類似検索では、引き続きクエリ vector を取得し、それらを embedding list にまとめて検索を実行する必要があります。

  • 存在しない primary key、または形式が正しくない primary key に対しては、Milvus がエラーを返します。

  • primary key とクエリ vector は相互排他的です。両方を指定した場合もエラーになります。

以下の例では、指定されたすべての Int64 ID が対象 collection 内に存在することを前提としています。

📘注意

primary key はフィルタリングには使用されません。vector の取得にのみ使用されます。

基本的な primary-key search を行うには、クエリ vector を primary key に置き換えるだけです。

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: primary key を使用したフィルタ付き検索

次の例では、colorlikes が対象 collection 内でスキーマ定義された 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: primary key を使用した範囲検索

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: primary key を使用したグループ化検索

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

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