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

Range Search

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

概要

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

Sewjwp5DShFgKAbC1Mwcrr7enOD

上記の図は、レンジ検索リクエストが radius および range_filter の2つのパラメータを持つことを示しています。Zilliz Cloud はレンジ検索リクエストを受信すると、以下の処理を行います。

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

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

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

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

メトリックタイプ

Denotations

Requirements for Setting radius and range_filter

L2

A smaller L2 distance indicates a higher similarity.

To ignore the most similar vector embeddings, ensure that

range_filter <= distance < radius

IP

A greater IP distance indicates a higher similarity.

To ignore the most similar vector embeddings, ensure that

radius < distance <= range_filter

COSINE

A greater COSINE distance indicates a higher similarity.

To ignore the most similar vector embeddings, ensure that

radius < distance <= range_filter

JACCARD

A smaller Jaccard distance indicates a higher similarity.

To ignore the most similar vector embeddings, ensure that

range_filter <= distance < radius

HAMMING

A smaller ハミング distance indicates a higher similarity.

To ignore the most similar vector embeddings, ensure that

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)
📘Notes

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