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

基本ベクトル検索

ベクトル埋め込みのソート順を記録したインデックスファイルに基づき、近似最近傍探索(ANN search)は、受信した検索リクエストに含まれるクエリベクトルに基づいてベクトル埋め込みのサブセットを特定し、そのサブグループ内のベクトルとクエリベクトルを比較して、最も類似した結果を返します。ANN search により、Zilliz Cloud は効率的な検索体験を提供します。このページでは、基本的な ANN search の実行方法を学べます。

Notes

コレクションの作成後に新しいフィールドを追加した場合、これらのフィールドを含む検索では、明示的に値を設定していないエンティティに対して、定義済みのデフォルト値または NULL が返されます。詳細については、コレクション スキーマの変更 を参照してください。

概要​

ANN search と k-Nearest Neighbors(kNN)search は、ベクトル類似検索で一般的に使用される手法です。kNN search では、最も類似したベクトルを特定する前に、検索リクエストに含まれるクエリベクトルとベクトル空間内のすべてのベクトルを比較する必要があるため、時間とリソースを消費します。

kNN search とは異なり、ANN search アルゴリズムでは、ベクトル埋め込みのソート順を記録した インデックスファイルが必要です。検索リクエストを受信すると、このインデックスファイルを参照して、クエリベクトルに最も類似したベクトル埋め込みを含む可能性が高いサブグループをすばやく特定できます。次に、指定された メトリックタイプ を使用してクエリベクトルとサブグループ内のベクトルとの類似度を測定し、クエリベクトルとの類似度に基づいてグループのメンバーを並べ替え、top-K のグループメンバーを特定できます。

ANN search は事前に構築されたインデックスに依存しており、検索スループット、メモリ使用量、検索の正確性は、選択するインデックスタイプによって異なる場合があります。検索パフォーマンスと正確性のバランスを取る必要があります。

学習コストを下げるために、Zilliz Cloud は AUTOINDEX を提供しています。AUTOINDEX を使用すると、Zilliz Cloud はインデックスの構築中にコレクション内のデータ分布を分析し、その分析に基づいて最適化されたインデックスパラメータを設定して、検索パフォーマンスと正確性のバランスを取ります。

AUTOINDEX と適用可能なメトリックタイプの詳細については、AUTOINDEX の解説 および メトリックタイプ を参照してください。このセクションでは、以下のトピックに関する詳細情報を確認できます。

ANN search において、単一ベクトル検索とは、1 つのクエリベクトルのみを対象とする検索を指します。事前に構築されたインデックスと検索リクエストに含まれるメトリックタイプに基づいて、Zilliz Cloud はクエリベクトルに最も類似した top-K 個のベクトルを検索します。

このセクションでは、単一ベクトル検索の実行方法について説明します。検索リクエストには 1 つのクエリベクトルを含め、Zilliz Cloud に対して Inner Product(IP)を使用してクエリベクトルとコレクション内のベクトルとの類似度を計算するよう指示すると、最も類似した 3 件が返されます。

Notes

データプレーン RESTful API エンドポイントを呼び出す際は、対象クラスターのユーザー名とパスワードをコロンで区切った文字列(例: username:password)を認証トークンとして使用します。

python
from pymilvus import MilvusClient

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

# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
res = client.search(
collection_name="quick_setup",
anns_field="vector",
data=[query_vector],
limit=3
)

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

# [
# [
# {
# "id": 551,
# "distance": 0.08821295201778412,
# "entity": {}
# },
# {
# "id": 296,
# "distance": 0.0800950899720192,
# "entity": {}
# },
# {
# "id": 43,
# "distance": 0.07794742286205292,
# "entity": {}
# }
# ]
# ]

Milvus は、検索結果をクエリベクトルとの類似度スコアの降順で並べ替えます。この類似度スコアはクエリベクトルへの距離とも呼ばれ、その値の範囲は使用するメトリックタイプによって異なります。

以下の表に、適用可能なメトリックタイプと対応する距離の範囲を示します。

メトリックタイプ特性距離の範囲
L2値が小さいほど類似度が高くなります。[0, ∞)
IP値が大きいほど類似度が高くなります。[-1, 1]
COSINE値が大きいほど類似度が高くなります。[-1, 1]
JACCARD値が小さいほど類似度が高くなります。[0, 1]
HAMMING値が小さいほど類似度が高くなります。[0, dim(vector)]

同様に、検索リクエストには複数のクエリベクトルを含めることができます。Zilliz Cloud は、これらのクエリベクトルに対して ANN search を並列に実行し、2 組の結果を返します。

python
# 7. Search with multiple vectors
# 7.1. Prepare query vectors
query_vectors = [
[0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],
[0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]
]

# 7.2. Start search
res = client.search(
collection_name="quick_setup",
data=query_vectors,
limit=3,
)

for hits in res:
print("TopK results:")
for hit in hits:
print(hit)

# Output
#
# [
# [
# {
# "id": 551,
# "distance": 0.08821295201778412,
# "entity": {}
# },
# {
# "id": 296,
# "distance": 0.0800950899720192,
# "entity": {}
# },
# {
# "id": 43,
# "distance": 0.07794742286205292,
# "entity": {}
# }
# ],
# [
# {
# "id": 730,
# "distance": 0.04431751370429993,
# "entity": {}
# },
# {
# "id": 333,
# "distance": 0.04231833666563034,
# "entity": {}
# },
# {
# "id": 232,
# "distance": 0.04221535101532936,
# "entity": {}
# }
# ]
# ]

クエリベクトルを設定する代わりに、対象のコレクションにクエリベクトルがすでに存在する場合は、主キーを使用できます。

python
res = client.search(
collection_name="quick_setup",
anns_field="vector",
ids=[551, 296, 43],
limit=3
)

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

パーティション内での ANN Search​

コレクションに複数のパーティションを作成しており、検索範囲を特定の数のパーティションに絞り込める状況を想定します。その場合は、検索リクエストに対象のパーティション名を含めることで、検索範囲を指定したパーティション内に制限できます。検索対象のパーティション数を減らすと、検索パフォーマンスが向上します。

以下のコードスニペットは、コレクション内に PartitionA という名前のパーティションが存在することを前提としています。

python
# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
res = client.search(
collection_name="quick_setup",
partition_names=["partitionA"],
data=[query_vector],
limit=3,
)

for hits in res:
print("TopK results:")
for hit in hits:
print(hit)

# [
# [
# {
# "id": 551,
# "distance": 0.08821295201778412,
# "entity": {}
# },
# {
# "id": 296,
# "distance": 0.0800950899720192,
# "entity": {}
# },
# {
# "id": 43,
# "distance": 0.07794742286205292,
# "entity": {}
# }
# ]
# ]

出力フィールドの使用​

検索結果では、Zilliz Cloud はデフォルトで、上位 K 個のベクトル埋め込みを含むエンティティの主フィールド値と類似度スコア(distance/scores)を含めます。検索結果にこれらのエンティティの他のフィールドの値も含めるには、ベクトルフィールドとスカラーフィールドの両方を含む対象フィールドの名前を、出力フィールドとして検索リクエストに含めます。

python
# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],

res = client.search(
collection_name="quick_setup",
data=[query_vector],
limit=3, # The number of results to return
output_fields=["color"]
)

print(res)

# [
# [
# {
# "id": 551,
# "distance": 0.08821295201778412,
# "entity": {
# "color": "orange_6781"
# }
# },
# {
# "id": 296,
# "distance": 0.0800950899720192,
# "entity": {
# "color": "red_4794"
# }
# },
# {
# "id": 43,
# "distance": 0.07794742286205292,
# "entity": {
# "color": "grey_8510"
# }
# }
# ]
# ]

スカラーフィールドで検索結果を並べ替える | ONDEMAND​

デフォルトでは、Zilliz Cloud は検索結果をクエリベクトルとの類似度スコア順に並べ替えます。返されるエンティティをスカラーフィールドの順序に従わせたい場合は、検索リクエストに order_by_fields を追加します。

order_by_fields の各項目は、スカラーフィールドと並べ替え方向を指定します。昇順には "asc"、降順には "desc" を使用します。order を省略した場合、Zilliz Cloud はそのフィールドを昇順で並べ替えます。

以下の例では、検索結果を price の低い順から高い順に並べ替えます。レスポンスでフィールドの値を確認したい場合は、並べ替えに使用するフィールドを output_fields に含めてください。

python
res = client.search(
collection_name="product_catalog",
data=query_vectors,
anns_field="embedding",
limit=20,
output_fields=["id", "price", "rating", "category"],
order_by_fields=[
{"field": "price", "order": "asc"}
],
)

複数のスカラーフィールドで並べ替えることもできます。Zilliz Cloud は、指定した順序でフィールドを適用します。以下の例では、Zilliz Cloud は結果を price の昇順で並べ替えます。同じ price を持つエンティティについては、Zilliz Cloud は続いて rating の降順で並べ替えます。

python
res = client.search(
collection_name="product_catalog",
data=query_vectors,
anns_field="embedding",
limit=20,
output_fields=["id", "price", "rating", "category"],
order_by_fields=[
{"field": "price", "order": "asc"},
{"field": "rating", "order": "desc"},
],
)

指定したすべての並べ替えフィールドで同じ値を持つエンティティについては、Zilliz Cloud は元の類似度スコア順を維持します。

limit と offset の使用​

検索リクエストに含まれる limit パラメータが、検索結果に含めるエンティティ数を決定することに気付くかもしれません。このパラメータは、1 回の検索で返すエンティティの最大数を指定するものであり、通常 top-K と呼ばれます。

ページネーションされたクエリを実行する場合は、ループを使用して複数の Search リクエストを送信し、各クエリリクエストに Limit パラメータと Offset パラメータを含めます。具体的には、Limit パラメータに現在のクエリ結果に含めたいエンティティ数を設定し、Offset にすでに返されたエンティティの合計数を設定します。

以下の表に、一度に 100 個のエンティティを返す場合の、ページネーションされたクエリにおける Limit パラメータと Offset パラメータの設定方法を示します。

クエリ1 回のクエリで返すエンティティ数すでに返されたエンティティの合計数
1 回目のクエリ1000
2 回目のクエリ100100
3 回目のクエリ100200
n 回目のクエリ100100 x (n-1)

1 回の ANN search における limit と offset の合計は 16,384 未満にする必要があります。

python
# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],

res = client.search(
collection_name="quick_setup",
data=[query_vector],
limit=3, # The number of results to return
search_params={
"offset": 10 # The records to skip
}
)

level の使用​

ANN search を最適化するために、Zilliz Cloud は、簡素化された検索最適化によって検索精度を制御する level というパラメータを提供しています。

このパラメータは 1 から 10 の範囲で、デフォルトは 1 です。値を大きくすると検索の再現率は向上しますが、検索パフォーマンスは低下します。一般的なケースでは、デフォルト値で最大 90% の再現率が得られます。必要に応じて値を大きくしてください。

Notes

level パラメータは現在も Public Preview です。5 より大きい値を設定できない場合、お使いのクラスターがこの機能に完全には対応していない可能性があります。回避策として、代わりに 1 から 5 までの範囲の値を設定するか、Zilliz Cloud support までお問い合わせください。

python
# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],

res = client.search(
collection_name="quick_setup",
data=[query_vector],
limit=3, # The number of results to return
search_params={
"params": {
"level": 10 # The precision control
}
}
)

再現率の取得​

level パラメータを調整する際に enable_recall_calculation を true に設定すると、異なる level 値での検索の精度を評価できます。

Notes

enable_recall_calculation パラメータは現在も Public Preview であり、互換性の問題により使用できない場合があります。サポートが必要な場合は、Zilliz Cloud support までお問い合わせください。

python
# 4. Single vector search
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],

res = client.search(
collection_name="quick_setup",
data=[query_vector],
limit=3, # The number of results to return
search_params={
"params": {
"level": 10 # The precision control,
"enable_recall_calculation": True # Ask to return recall rate
}
}
)

コレクションに TIMESTAMPTZ フィールドがある場合、検索呼び出しで timezone パラメータを設定することで、1 回の操作に限りデータベースまたはコレクションのデフォルトのタイムゾーンを一時的に上書きできます。これは、操作中に TIMESTAMPTZ 値がどのように表示および比較されるかを制御します。

timezone の値は、有効な IANA time zone identifier である必要があります(例: Asia/Shanghai, America/Chicago, または UTC)。TIMESTAMPTZ フィールドの使用方法の詳細については、TIMESTAMPTZ フィールド を参照してください。

以下の例では、検索操作のタイムゾーンを一時的に設定する方法を示します。

python
res = client.search(
collection_name="quick_setup",
anns_field="vector",
data=[query_vector],
limit=3,
timezone="America/Havana",
)

AUTOINDEX は ANN search の学習コストを大幅に軽減します。ただし、top-K が大きくなるにつれて、検索結果が常に正確であるとは限りません。検索範囲の絞り込み、検索結果の関連性の向上、検索結果の多様化によって、Zilliz Cloud は以下の検索拡張機能を実現します。

  • フィルタリング検索

    検索リクエストにフィルタリング条件を含めることで、Zilliz Cloud は ANN search を実行する前にメタデータのフィルタリングを行い、検索範囲をコレクション全体から指定したフィルタリング条件に一致するエンティティのみに絞り込めます。

    メタデータのフィルタリングとフィルタリング条件の詳細については、Filtered Search および フィルタリングの解説 を参照してください。

  • 範囲検索

    返されるエンティティの距離またはスコアを特定の範囲内に制限することで、検索結果の関連性を向上できます。Zilliz Cloud のレンジ検索では、クエリベクトルに最も類似したベクトル埋め込みを中心とする 2 つの同心円を描きます。検索リクエストで両方の円の半径を指定すると、Zilliz Cloud は外側の円の内側で内側の円の外側にあるすべてのベクトル埋め込みを返します。

    レンジ検索の詳細については、範囲検索 を参照してください。

  • グループ検索

    返されるエンティティが特定のフィールドで同じ値を持つ場合、検索結果がベクトル空間内のすべてのベクトル埋め込みの分布を表さないことがあります。検索結果を多様化するには、グループ検索の使用を検討してください。

    グループ検索の詳細については、Grouping Search を参照してください。

  • ハイブリッド検索

    コレクションには、異なる埋め込みモデルを使用して生成されたベクトル埋め込みを保存するために、複数のベクトルフィールドを含めることができます。そうすることで、ハイブリッド検索を使用してこれらのベクトルフィールドからの検索結果を再ランク付けし、再現率を向上させることができます。

    ハイブリッド検索の詳細については、ハイブリッド検索 を参照してください。

    コレクションで許可されるベクトルフィールド数の制限の詳細については、Zilliz Cloud の制限 を参照してください。

  • 検索イテレーター

    1 回の ANN search で返されるエンティティの最大数は 16,384 です。1 回の検索でより多くのエンティティを返す必要がある場合は、検索イテレーターの使用を検討してください。

    検索イテレーターの詳細については、Search Iterator を参照してください。

  • 全文検索

    全文検索は、テキストデータセット内で特定の用語やフレーズを含むドキュメントを取得し、関連性に基づいて結果をランク付けする機能です。この機能は、正確な用語を見落とす可能性があるセマンティック検索の制限を克服し、最も正確で文脈に関連した結果を得られるようにします。さらに、生のテキスト入力を受け付け、手動でベクトル埋め込みを生成することなくテキストデータを自動的にスパース埋め込みに変換するため、ベクトル検索を簡素化します。

    全文検索の詳細については、全文検索 を参照してください。

  • テキストマッチ

    Zilliz Cloud のキーワードマッチを使用すると、特定の用語に基づいてドキュメントを正確に取得できます。この機能は主に、特定の条件を満たすためのフィルタリング検索に使用され、スカラーフィルタリングを組み合わせてクエリ結果を絞り込むことができ、スカラー条件を満たすベクトル内での類似検索が可能になります。

    キーワードマッチの詳細については、Keyword Match を参照してください。

  • パーティションキーの使用

    メタデータフィルタリングに複数のスカラーフィールドを含め、かなり複雑なフィルタリング条件を使用すると、検索効率に影響する可能性があります。スカラーフィールドをパーティションキーとして設定し、検索リクエストでパーティションキーを含むフィルタリング条件を使用すると、指定したパーティションキーの値に対応するパーティション内に検索範囲を制限するのに役立ちます。

    パーティションキーの詳細については、Partition Key を使用する を参照してください。

  • mmap の使用

    mmap 設定の詳細については、mmap を使用する を参照してください。