メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

クエリ

ANN検索に加えて、Zilliz Cloudはクエリを通じたメタデータフィルタリングもサポートしています。このページでは、Query、Get、QueryIteratorを使用してメタデータフィルタリングを実行する方法を紹介します。

概要

コレクションはさまざまな種類のスカラーフィールドを格納できます。Zilliz Cloudでは、1つ以上のスカラーフィールドに基づいてエンティティをフィルターできます。Zilliz Cloudは3つのタイプのクエリを提供しています:Query、Get、QueryIterator。以下の表は、これらの3つのクエリタイプを比較しています。

Get

Query

QueryIterator

適用可能なシナリオ

指定されたプライマリキーを持つエンティティを見つけるため。

カスタムフィルター条件を満たすすべてまたは指定された数のエンティティを見つけるため。

ページネーションクエリでカスタムフィルター条件を満たすすべてのエンティティを見つけるため。

フィルタリング方法

プライマリキーによる

フィルタリング式による。

フィルタリング式による。

必須パラメータ

  • コレクション名

  • プライマリキー

  • コレクション名

  • フィルタリング式

  • コレクション名

  • フィルタリング式

  • クエリごとに返すエンティティ数

任意パラメータ

  • パーティション名

  • 出力フィールド

  • パーティション名

  • 返すエンティティ数

  • 出力フィールド

  • パーティション名

  • 合計で返すエンティティ数

  • 出力フィールド

返すもの

指定されたコレクションまたはパーティション内で指定されたプライマリキーを持つエンティティを返します。

指定されたコレクションまたはパーティション内でカスタムフィルター条件を満たすすべてまたは指定された数のエンティティを返します。

ページネーションクエリを通じて、指定されたコレクションまたはパーティション内でカスタムフィルター条件を満たすすべてのエンティティを返します。

メタデータフィルタリングの詳細については、フィルタリングフィルタリングの説明を参照してください。

Getの使用

プライマリキーでエンティティを検索する必要がある場合、Getメソッドを使用できます。以下のコード例では、コレクションにidvectorcolorという名前の3つのフィールドがあると仮定しています。

[
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"},
]

以下のようにしてIDでエンティティを取得できます。

from pymilvus import MilvusClient

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

res = client.get(
collection_name="my_collection",
ids=[0, 1, 2],
output_fields=["vector", "color"]
)

print(res)

Queryの使用

カスタムフィルター条件でエンティティを検索する必要がある場合は、Queryメソッドを使用します。以下のコード例では、idvectorcolorという名前の3つのフィールドがあり、color値がredで始まる指定された数のエンティティを返すと仮定しています。

from pymilvus import MilvusClient

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

res = client.query(
collection_name="my_collection",
filter="color like \"red%\"",
output_fields=["vector", "color"],
limit=3
)

QueryIteratorの使用

ページネーションクエリを通じてカスタムフィルター条件でエンティティを検索する場合は、QueryIteratorを作成し、その**next()**メソッドを使用してすべてのエンティティを反復処理し、フィルター条件を満たすエンティティを見つけます。以下のコード例では、idvectorcolorという名前の3つのフィールドがあり、color値がredで始まるすべてのエンティティを返すと仮定しています。

from pymilvus import connections, Collection

connections.connect(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

collection = Collection("my_collection")

iterator = collection.query_iterator(
batch_size=10,
expr="color like \"red%\"",
output_fields=["color"]
)

results = []

while True:
result = iterator.next()
if not result:
iterator.close()
break

print(result)
results += result

パーティション内でのクエリ

Get、Query、またはQueryIteratorリクエストにパーティション名を含めることで、1つまたは複数のパーティション内でクエリを実行することもできます。以下のコード例では、コレクションにPartitionAという名前のパーティションがあると仮定しています。

from pymilvus import MilvusClient
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

res = client.get(
collection_name="my_collection",
partitionNames=["partitionA"],
ids=[10, 11, 12],
output_fields=["vector", "color"]
)

from pymilvus import MilvusClient

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

res = client.query(
collection_name="my_collection",
partitionNames=["partitionA"],
filter="color like \"red%\"",
output_fields=["vector", "color"],
limit=3
)

# Use QueryIterator
from pymilvus import connections, Collection

connections.connect(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

collection = Collection("my_collection")

iterator = collection.query_iterator(
partition_names=["partitionA"],
batch_size=10,
expr="color like \"red%\"",
output_fields=["color"]
)

results = []

while True:
result = iterator.next()
if not result:
iterator.close()
break

print(result)
results += result

Queryでのランダムサンプリング

データ探索や開発テストのためにコレクションから代表的なデータのサブセットを抽出するには、RANDOM_SAMPLE(sampling_factor)式を使用します。sampling_factorは、0から1の間の浮動小数点数で、サンプルするデータの割合を表します。

📘注釈

詳細な使用方法、高度な例、およびベストプラクティスについては、ランダムサンプリングを参照してください。

from pymilvus import MilvusClient

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

# Sample 1% of the entire collection
res = client.query(
collection_name="my_collection",
filter="RANDOM_SAMPLE(0.01)",
output_fields=["vector", "color"]
)

print(f"Sampled {len(res)} entities from collection")

# Combine with other filters - first filter, then sample
res = client.query(
collection_name="my_collection",
filter="color like \"red%\" AND RANDOM_SAMPLE(0.005)",
output_fields=["vector", "color"],
limit=10
)

print(f"Found {len(res)} red items in sample")