条件付きクエリ

このトピックでは、条件付きクエリの実行方法が紹介されています。

ベクトルの類似性検索とは異なり、条件付きクエリはブール式を介してスカラーフィルタを使用してベクトルを取得します。Milvusはスカラーフィールドと様々なブール式によるクエリをサポートしています。ブール式はスカラーフィールドやプライマリキーフィールドをフィルタリングするために使用され、フィルタリング条件に一致する結果をすべて取得することができます。

以下の例では、本のデータセットを2000行持つデータをクエリし、本のID(プライマリキー)、単語数(スカラーフィールド)、本の概要(ベクトルフィールド)を含んでおり、それぞれのIDに基づいて特定の本をクエリするシナリオをシミュレートしています。

コレクションのロード

クエリを実行する前に、コレクションをメモリにロードする必要があります。

from pymilvus import Collection
collection = Collection("book")      # 既存のコレクションを取得
collection.load()

クエリの実行

以下の例では、特定の book_id の値に基づいてベクトルをフィルタリングし、結果に book_id フィールドと book_intro フィールドを返します。

Milvusはクエリのための一貫性レベルの設定をサポートしています。このトピックの例では一貫性レベルを Strong に設定しています。BoundedSessionEventually のいずれかに一貫性レベルを設定することもできます。Milvusの四つの一貫性レベルの詳細については、一貫性 を参照してください。

フィルタ式に動的フィールドを使用し、クエリリクエストで出力フィールドを指定することもできます。例えば、Dynamic Schema を参照してください。

res = collection.query(
  expr = "book_id in [2,4,6,8]",
  offset = 0,
  limit = 10, 
  output_fields = ["book_id", "book_intro"],
)

パラメータ 説明
expr プロパティをフィルタリングするために使用されるブール式。ブール式のルールの詳細については、ブール式のルール を参照してください。
limit 返される類似度の高い結果の数。この値と offset の合計は16384未満である必要があります。
offset コレクション内でスキップする結果の数。limit が指定されている場合にのみ利用可能で、この値と limit の合計は16384未満である必要があります。例えば、ベクトルの9番目と10番目に近い隣人をクエリしたい場合は、limit2 に設定し、offset8 に設定します。
output_fields (オプション) 返すフィールド名のリスト。
partition_names (オプション) クエリを実行するパーティション名のリスト。
consistency_level (オプション) クエリのための一貫性レベル。

返された結果をチェックします。

sorted_res = sorted(res, key=lambda k: k['book_id'])
sorted_res

エンティティ数のカウント

クエリを実行する際、output_fieldscount(*) を追加することで、Milvusはコレクション内のエンティティ数を返すことができます。特定の条件を満たすエンティティの数をカウントしたい場合は、expr を使用してブール式を定義します。

コレクション内のすべてのエンティティをカウントします:

res = collection.query(
  expr="", 
  output_fields = ["count(*)"],
)

print(res)
print(res[0])

特定の条件を満たすエンティティの数をカウントします:

res = collection.query(
  expr="book_id in [2,4,6,8]", 
  output_fields = ["count(*)"],
)

print(res)
print(res[0])

制限事項

output_fieldscount(*) を使用する際には、limit パラメータの使用が禁止されています。