Pencarian Rentang
Pencarian rentang meningkatkan relevansi hasil pencarian dengan membatasi jarak atau skor entitas yang dikembalikan dalam rentang tertentu. Halaman ini membantu Anda memahami apa itu pencarian rentang dan prosedur untuk melakukan pencarian rentang.
Ikhtisar
Saat menjalankan permintaan Pencarian Rentang, Milvus menggunakan vektor yang paling mirip dengan vektor kueri dari hasil Pencarian ANN sebagai pusat, dengan radius yang ditentukan dalam permintaan Pencarian sebagai radius lingkaran luar, dan range_filter sebagai radius lingkaran dalam untuk menggambar dua lingkaran konsentris. Semua vektor dengan nilai kemiripan yang berada di dalam wilayah lingkaran yang dibentuk oleh dua lingkaran konsentris ini akan dikembalikan. Di sini, range_filter dapat diatur ke 0, yang mengindikasikan bahwa semua entitas yang berada di dalam nilai kemiripan yang ditentukan (radius) akan dikembalikan.
Pencarian rentang
Diagram di atas menunjukkan bahwa permintaan pencarian rentang membawa dua parameter: radius dan range_filter. Setelah menerima permintaan pencarian rentang, Milvus melakukan hal berikut.
Gunakan jenis metrik yang ditentukan(COSINE) untuk menemukan semua sematan vektor yang paling mirip dengan vektor kueri.
Saring sematan vektor yang jarak atau nilainya ke vektor kueri berada dalam rentang yang ditentukan oleh parameter radius dan range_filter.
Kembalikan entitas-K teratas dari yang difilter.
Cara mengatur radius dan range_filter bervariasi sesuai dengan jenis metrik pencarian. Tabel berikut mencantumkan persyaratan untuk mengatur kedua parameter ini dengan jenis metrik yang berbeda.
Jenis Metrik | Denotasi | Persyaratan untuk Mengatur radius dan range_filter |
---|---|---|
| Jarak L2 yang lebih kecil menunjukkan kemiripan yang lebih tinggi. | Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa
|
| Jarak IP yang lebih besar menunjukkan kemiripan yang lebih tinggi. | Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa
|
| Jarak COSINE yang lebih besar menunjukkan kemiripan yang lebih tinggi. | Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa
|
| Jarak Jaccard yang lebih kecil menunjukkan kemiripan yang lebih tinggi. | Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa
|
| Jarak Hamming yang lebih kecil menunjukkan kemiripan yang lebih tinggi. | Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa
|
Contoh
Bagian ini mendemonstrasikan cara melakukan pencarian rentang. Permintaan pencarian dalam cuplikan kode berikut ini tidak membawa jenis metrik, yang menunjukkan jenis metrik default COSINE berlaku. Dalam kasus ini, pastikan bahwa nilai radius lebih kecil dari nilai range_filter.
Pada potongan kode berikut ini, setel radius
ke 0.4
dan range_filter
ke 0.6
sehingga Milvus mengembalikan semua entitas yang jarak atau nilainya ke vektor kueri berada di antara 0,4 hingga 0,6.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
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={
# highlight-start
"params": {
"radius": 0.4,
"range_filter": 0.6
}
# highlight-end
}
)
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("http://localhost:19530")
.token("root:Milvus")
.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 = "http://localhost:19530";
const token = "root:Milvus";
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,
// highlight-start
params: {
"radius": 0.4,
"range_filter": 0.6
}
// highlight-end
})
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
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":[]}