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

範囲検索

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

概要

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

Sewjwp5DShFgKAbC1Mwcrr7enOD

上記の図は、範囲検索リクエストがradiusrange_filterの2つのパラメータを含んでいることを示しています。範囲検索リクエストを受け取ると、Zilliz Cloudは以下のことを行います。

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

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

  • フィルターされたものからtop-Kエンティティを返します。

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

メトリックタイプ

表記

radiusとrange_filterの設定要件

L2

より小さいL2距離はより高い類似性を示します。

最も類似するベクトル埋め込みを無視するには、

range_filter <= distance < radiusを確実に満たしてください

IP

より大きなIP距離はより高い類似性を示します。

最も類似するベクトル埋め込みを無視するには、

radius < distance <= range_filterを確実に満たしてください

COSINE

より大きなCOSINE距離はより高い類似性を示します。

最も類似するベクトル埋め込みを無視するには、

radius < distance <= range_filterを確実に満たしてください

JACCARD

より小さいJaccard距離はより高い類似性を示します。

最も類似するベクトル埋め込みを無視するには、

range_filter <= distance < radiusを確実に満たしてください

HAMMING

より小さいHamming距離はより高い類似性を示します。

最も類似するベクトル埋め込みを無視するには、

range_filter <= distance < radiusを確実に満たしてください

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

以下のコードスニペットでは、radius0.4range_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)