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

範囲検索

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

概要

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

Sewjwp5DShFgKAbC1Mwcrr7enOD

上の図は、範囲検索リクエストが radiusrange_filter という 2 つのパラメータを伴うことを示しています。範囲検索リクエストを受け取ると、Zilliz Cloud は次の処理を実行します。

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

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

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

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

メトリックタイプ意味radius と range_filter の設定要件
L2L2 距離が小さいほど、類似度が高くなります。最も類似したベクトル埋め込みを無視するには、
range_filter <= distance < radius を満たすようにしてください。
IPIP 距離が大きいほど、類似度が高くなります。最も類似したベクトル埋め込みを無視するには、
radius < distance <= range_filter を満たすようにしてください。
COSINECOSINE 距離が大きいほど、類似度が高くなります。最も類似したベクトル埋め込みを無視するには、
radius < distance <= range_filter を満たすようにしてください。
JACCARDJaccard 距離が小さいほど、類似度が高くなります。最も類似したベクトル埋め込みを無視するには、
range_filter <= distance < radius を満たすようにしてください。
HAMMINGHamming 距離が小さいほど、類似度が高くなります。最も類似したベクトル埋め込みを無視するには、
range_filter <= distance < radius を満たすようにしてください。

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

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

python
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 を使用することを検討してください。詳細については、Primary-Key Search を参照してください。