Ricerca per intervallo
Una ricerca per intervallo migliora la pertinenza dei risultati di ricerca limitando la distanza o il punteggio delle entità restituite entro un intervallo specifico. Questa pagina aiuta a capire cos'è la ricerca per intervallo e le procedure per condurre una ricerca per intervallo.
Panoramica
Quando si esegue una richiesta di ricerca per intervallo, Milvus utilizza i vettori più simili al vettore della query dai risultati della ricerca RNA come centro, con il raggio specificato nella richiesta di ricerca come raggio del cerchio esterno e il range_filter come raggio del cerchio interno per disegnare due cerchi concentrici. Verranno restituiti tutti i vettori con punteggi di somiglianza che rientrano nell'area anulare formata da questi due cerchi concentrici. In questo caso, range_filter può essere impostato a 0, indicando che verranno restituite tutte le entità che rientrano nel punteggio di somiglianza (raggio) specificato.
Ricerca per intervallo
Il diagramma precedente mostra che una richiesta di ricerca per intervallo contiene due parametri: radius e range_filter. Quando riceve una richiesta di ricerca per raggio, Milvus esegue le seguenti operazioni.
Utilizza il tipo di metrica specificato(COSINE) per trovare tutte le incorporazioni vettoriali più simili al vettore interrogato.
Filtra le incorporazioni vettoriali le cui distanze o punteggi rispetto al vettore di interrogazione rientrano nell'intervallo specificato dai parametri radius e range_filter.
Restituire le entità top-K tra quelle filtrate.
Il modo in cui impostare radius e range_filter varia a seconda del tipo di metrica della ricerca. La tabella seguente elenca i requisiti per l'impostazione di questi due parametri con diversi tipi di metrica.
Tipo di metrica | Denotazioni | Requisiti per l'impostazione di radius e range_filter |
---|---|---|
| Una distanza L2 più piccola indica una maggiore somiglianza. | Per ignorare le incorporazioni vettoriali più simili, assicuratevi che
|
| Una distanza IP maggiore indica una maggiore somiglianza. | Per ignorare le incorporazioni vettoriali più simili, assicurarsi che
|
| Una distanza COSINE maggiore indica una maggiore somiglianza. | Per ignorare le incorporazioni vettoriali più simili, assicurarsi che
|
| Una distanza di Jaccard minore indica una maggiore somiglianza. | Per ignorare le incorporazioni vettoriali più simili, assicurarsi che
|
| Una distanza di Hamming più piccola indica una maggiore somiglianza. | Per ignorare le incorporazioni vettoriali più simili, assicurarsi che
|
Esempi
Questa sezione mostra come effettuare una ricerca per intervallo. Le richieste di ricerca nei seguenti frammenti di codice non riportano un tipo di metrica, indicando che si applica il tipo di metrica predefinito COSINE. In questo caso, assicurarsi che il valore del raggio sia inferiore al valore di range_filter.
Nei seguenti frammenti di codice, impostare radius
su 0.4
e range_filter
su 0.6
in modo che Milvus restituisca tutte le entità le cui distanze o i cui punteggi dal vettore di interrogazione siano compresi tra 0,4 e 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":[]}