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

レンジ検索

レンジ検索は、返されるエンティティの距離またはスコアを特定の範囲内に制限することで、検索結果の関連性を向上させます。このページでは、レンジ検索とは何か、およびレンジ検索を実行する手順について説明します。

概要

レンジ検索リクエストを実行すると、Zilliz CloudはANN検索結果からクエリベクトルに最も類似したベクトルを中央として使用し、検索リクエストで指定されたradiusを外円の半径として、range_filterを内円の半径として2つの同心円を描画します。これら2つの同心円によって形成される環状領域内に類似度スコアが収まるすべてのベクトルが返されます。ここで、range_filter0に設定でき、指定された類似度スコア(radius)内のすべてのエンティティが返されることを示します。

Sewjwp5DShFgKAbC1Mwcrr7enOD

上記の図は、レンジ検索リクエストがradiusrange_filterの2つのパラメータを持つことを示しています。レンジ検索リクエストを受信すると、Zilliz Cloudは次のことを行います。

  • 指定されたメトリックタイプ(COSINE)を使用して、クエリベクトルに最も類似したすべてのベクトル埋め込みを検索します。

  • クエリベクトルに対する距離またはスコアradiusrange_filterパラメータで指定された範囲内に収まるベクトル埋め込みをフィルタリングします。

  • フィルタリングされたエンティティから上位K個のエンティティを返します。

radiusrange_filterの設定方法は、検索のメトリックタイプによって異なります。次の表は、異なるメトリックタイプでこれら2つのパラメータを設定するための要件を示しています。

メトリックタイプ

表記

radiusとrange_filterの設定要件

L2

L2距離が小さいほど類似度が高いことを示します。

最も類似したベクトル埋め込みを無視するには、以下を確認してください。

range_filter <= 距離 < radius

IP

IP距離が大きいほど類似度が高いことを示します。

最も類似したベクトル埋め込みを無視するには、以下を確認してください。

radius < 距離 <= range_filter

COSINE

COSINE距離が大きいほど類似度が高いことを示します。

最も類似したベクトル埋め込みを無視するには、以下を確認してください。

radius < 距離 <= range_filter

JACCARD

Jaccard距離が小さいほど類似度が高いことを示します。

最も類似したベクトル埋め込みを無視するには、以下を確認してください。

range_filter <= 距離 < radius

HAMMING

ハミング距離が小さいほど類似度が高いことを示します。

最も類似したベクトル埋め込みを無視するには、以下を確認してください。

range_filter <= 距離 < radius

このセクションでは、レンジ検索を実行する方法を示します。以下のコードスニペットの検索リクエストにはメトリックタイプが含まれていないため、デフォルトのメトリックタイプCOSINEが適用されます。この場合、radiusの値がrange_filterの値よりも小さいことを確認してください。

以下のコードスニペットでは、radius0.4に、range_filter0.6に設定し、Zilliz Cloudがクエリベクトルに対する距離またはスコアが0.4から0.6の範囲内にあるすべてのエンティティを返すようにします。

from pymilvus import MilvusClient

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

query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]

res = client.search(
collection_name="my_collection",
data=[query_vector],
limit=3,
search_params={
"params": {
"radius": 0.4,
"range_filter": 0.6
}
}
)

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

クエリベクトルがターゲットコレクションにすでに存在する場合は、検索前に取得する代わりにidsを使用することを検討してください。詳細については、主キー検索を参照してください。