レンジ検索
範囲検索は、特定の範囲内で返されるエンティティの距離またはスコアを制限することにより、検索結果の関連性を向上させます。このページでは、範囲検索と範囲検索を実行する手順を理解するのに役立ちます。
概要について
範囲検索リクエストを実行する場合、Zilliz Cloudは、ANN検索結果のクエリベクトルに最も類似したベクトルを中心に、検索リクエストで指定された半径を外側の円の半径、range_filterを内側の円の半径として使用して、2つの同心円を描画します。これら2つの同心円によって形成される環状領域に含まれる類似度スコアを持つすべてのベクトルが返されます。ここで、range_filterを0に設定すると、指定された類似度スコア(半径)内のすべてのエンティティが返されます。
上の図は、範囲検索リクエストが半径とrange_filterの2つのパラメータを持っていることを示しています。範囲検索リクエストを受け取ると、Zilliz Cloudは次のようにします:
-
指定したメトリック型(COSINE)を使用して、クエリベクトルに最も似たすべてのベクトル埋め込みを検索します。
-
クエリベクトルとの距離またはスコアが半径およびrange_filterパラメーターで指定された範囲内にあるベクトル埋め込みをフィルター処理します。
-
フィルタした図形から上位K個の図形を返します。
検索のメトリックタイプによって、半径とrange_filterの設定方法が異なります。以下の表は、これら2つのパラメータを異なるメトリックタイプで設定するための要件を示しています。
メートルタイプ | デノテーション | 半径と範囲フィルターの設定要件 |
---|---|---|
| L 2距離が小さいほど、類似度が高いことを示します。 | 最も類似したベクトル埋め込みを無視するには、確認してください |
| IP距離が大きいほど、類似度が高いことを示します。 | 最も類似したベクトル埋め込みを無視するには、確認してください |
| COSINE距離が大きいほど類似度が高いことを示します。 | 最も類似したベクトル埋め込みを無視するには、確認してください |
| ジャッカード距離が小さいほど類似度が高いことを示す。 | 最も類似したベクトル埋め込みを無視するには、確認してください |
| ハミング距離が小さいほど類似度が高いことを示す。 | 最も類似したベクトル埋め込みを無視するには、確認してください |
例例
このセクションでは、範囲検索を実行する方法を示します。次のコードスニペットの検索要求にはメトリックタイプが含まれていないため、デフォルトのメトリックタイプであるCOSINEが適用されます。この場合、半径値がrange_filter値よりも小さいことを確認してください。
以下のコードスニペットでは、radius
を0.4
、range_filter
を0.6
に設定して、Zilliz Cloudは、クエリベクトルとの距離またはスコアが0.4から0.6の範囲内にあるすべてのエンティティを返します。
- Python
- Java
- Go
- NodeJS
- cURL
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)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
io.milvus.v2.service.vector.request.SearchReq
import io.milvus.v2.service.vector.request.data.FloatVec;
import io.milvus.v2.service.vector.response.SearchResp
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN")
.build());
FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});
Map<String,Object> extraParams = new HashMap<>();
extraParams.put("radius", 0.4);
extraParams.put("range_filter", 0.6);
SearchReq searchReq = SearchReq.builder()
.collectionName("range_search_collection")
.data(Collections.singletonList(queryVector))
.topK(5)
.searchParams(extraParams)
.build();
SearchResp searchResp = client.search(searchReq);
List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();
for (List<SearchResp.SearchResult> results : searchResults) {
System.out.println("TopK results:");
for (SearchResp.SearchResult result : results) {
System.out.println(result);
}
}
// Output
// TopK results:
// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)
// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)
// TODO
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "YOUR_CLUSTER_ENDPOINT";
const token = "YOUR_CLUSTER_TOKEN";
const client = new MilvusClient({address, token});
var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
res = await client.search({
collection_name: "range_search_collection",
data: [query_vector],
limit: 5,
params: {
"radius": 0.4,
"range_filter": 0.6
}
})
export CLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT"
export TOKEN="YOUR_CLUSTER_TOKEN"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "quick_setup",
"data": [
[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
],
"annsField": "vector",
"filter": "color like \"red%\" and likes > 50",
"limit": 3,
"searchParams": {
"params": {
"radius": 0.4,
"range_filter": 0.6
}
}
}'
# {"code":0,"cost":0,"data":[]}