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

基本的なベクトル検索

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

Notes

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

概要​

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

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

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

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

AUTOINDEX と適用可能なメトリクスタイプの詳細については、AUTOINDEX Explained および Metric Types を参照してください。このセクションでは、以下のトピックについて詳しく説明します。

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

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

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 検索を並列で実行し、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 検索​

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

次のコードスニペットでは、コレクション内に 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 の検索結果には、デフォルトで、top-K のベクトル埋め込みを含むエンティティの主フィールド値と類似度距離/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
search_params={
"offset": 10 # The records to skip
}
)

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

デフォルトでは、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 回目 のクエリ1000
2 回目 のクエリ100100
3 回目 のクエリ100200
n 回目 のクエリ100100 x (n-1)

単一の ANN 検索における 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 検索を最適化するため、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 パラメーターを設定することにより、単一の操作に対してデータベースまたはコレクションのデフォルトタイムゾーンを一時的に上書きできます。これにより、操作中に TIMESTAMPTZ 値が表示および比較される方法が制御されます。

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

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

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

AUTOINDEX は ANN 検索の学習曲線を大幅に緩和します。ただし、top-K が増えるにつれて、検索結果が常に正確であるとは限りません。検索スコープの縮小、検索結果の関連性の向上、検索結果の多様化により、Zilliz Cloud は以下の検索強化機能を実現します。

  • フィルター検索

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

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

  • 範囲検索

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

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

  • グループ化検索

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

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

  • ハイブリッド検索

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

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

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

  • 検索イテレーター

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

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

  • 全文検索

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

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

  • テキストマッチ

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

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

  • パーティションキーを使用する

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

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

  • mmap を使用する

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