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

範囲検索

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

概要

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

Sewjwp5DShFgKAbC1Mwcrr7enOD

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

  • 指定された metric type(COSINE)を使用して、クエリ vector に最も類似したすべての vector embeddings を見つけます。

  • クエリ vector に対する distances または scores が、radius および range_filter パラメータで指定された範囲内に収まる vector embeddings をフィルタリングします。

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

radiusrange_filter の設定方法は、検索の metric type によって異なります。次の表は、異なる metric types でこれら 2 つのパラメータを設定する際の要件を示しています。

Metric Type表記radius と range_filter の設定要件
L2L2 distance が小さいほど similarity が高いことを示します。最も類似した vector embeddings を無視するには、
range_filter <= distance < radius を満たしてください
IPIP distance が大きいほど similarity が高いことを示します。最も類似した vector embeddings を無視するには、
radius < distance <= range_filter を満たしてください
COSINECOSINE distance が大きいほど similarity が高いことを示します。最も類似した vector embeddings を無視するには、
radius < distance <= range_filter を満たしてください
JACCARDJaccard distance が小さいほど similarity が高いことを示します。最も類似した vector embeddings を無視するには、
range_filter <= distance < radius を満たしてください
HAMMINGHamming distance が小さいほど similarity が高いことを示します。最も類似した vector embeddings を無視するには、
range_filter <= distance < radius を満たしてください

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

次のコードスニペットでは、radius0.4range_filter0.6 に設定しているため、Zilliz Cloud はクエリ vector に対する distances または scores が 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)
📘注意

クエリ vectors がすでに対象の collection に存在する場合は、検索前にそれらを取得する代わりに ids を使用することを検討してください。詳細については、Primary-Key Search を参照してください。

Ctrl I