Recherche par intervalle
Une recherche par intervalle améliore la pertinence des résultats de recherche en limitant la distance ou le score des entités retournées à un intervalle spécifique. Cette page vous aide à comprendre ce qu'est une recherche par intervalle et les procédures à suivre pour effectuer une recherche par intervalle.
Vue d'ensemble
Lors de l'exécution d'une requête de recherche par plage, Milvus utilise les vecteurs les plus similaires au vecteur de requête des résultats de la recherche ANN comme centre, avec le rayon spécifié dans la requête de recherche comme rayon du cercle extérieur et le filtre_périmètre comme rayon du cercle intérieur pour dessiner deux cercles concentriques. Tous les vecteurs dont les scores de similarité se situent dans la région annulaire formée par ces deux cercles concentriques seront renvoyés. Ici, le filtre_intervalle peut être fixé à 0, ce qui indique que toutes les entités comprises dans le score de similarité spécifié (rayon) seront renvoyées.
Recherche par plage
Le diagramme ci-dessus montre qu'une demande de recherche d'intervalle comporte deux paramètres : radius et range_filter. Lors de la réception d'une demande de recherche d'intervalle, Milvus effectue les opérations suivantes.
Utiliser le type de métrique spécifié(COSINE) pour trouver tous les ancrages vectoriels les plus similaires au vecteur de la requête.
Filtrer les intégrations vectorielles dont les distances ou les scores par rapport au vecteur d'interrogation se situent dans l'intervalle spécifié par les paramètres radius et range_filter.
Renvoyer les K premières entités parmi celles qui ont été filtrées.
La manière de définir radius et range_filter varie en fonction du type de métrique de la recherche. Le tableau suivant répertorie les exigences relatives à la définition de ces deux paramètres en fonction des différents types de métriques.
Type de métrique | Dénotations | Exigences relatives à la définition de radius et range_filter |
---|---|---|
| Une distance L2 plus petite indique une plus grande similarité. | Pour ignorer les intégrations vectorielles les plus similaires, il faut s'assurer que
|
| Une plus grande distance IP indique une plus grande similarité. | Pour ignorer les vector embeddings les plus similaires, assurez-vous que
|
| Une plus grande distance COSINE indique une plus grande similarité. | Pour ne pas tenir compte des encastrements vectoriels les plus similaires, assurez-vous que < distance <=
|
| Une distance de Jaccard plus petite indique une plus grande similarité. | Pour ignorer les vector embeddings les plus similaires, il faut s'assurer que
|
| Une distance de Hamming plus petite indique une plus grande similarité. | Pour ignorer les vector embeddings les plus similaires, assurez-vous que
|
Exemples de recherche
Cette section montre comment effectuer une recherche par plage. Les requêtes de recherche dans les extraits de code suivants ne comportent pas de type de métrique, ce qui indique que le type de métrique par défaut COSINE s'applique. Dans ce cas, assurez-vous que la valeur radius est inférieure à la valeur range_filter.
Dans les extraits de code suivants, définissez radius
sur 0.4
et range_filter
sur 0.6
afin que Milvus renvoie toutes les entités dont les distances ou les scores par rapport au vecteur de requête sont compris entre 0,4 et 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":[]}