milvus-logo
LFAI
Home
  • Guide de l'utilisateur

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.

Range search 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

L2

Une distance L2 plus petite indique une plus grande similarité.

Pour ignorer les intégrations vectorielles les plus similaires, il faut s'assurer que

range_filter <= distance < radius

IP

Une plus grande distance IP indique une plus grande similarité.

Pour ignorer les vector embeddings les plus similaires, assurez-vous que

radius < distance <= range_filter

COSINE

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 <=

radius < distance <= range_filter

JACCARD

Une distance de Jaccard plus petite indique une plus grande similarité.

Pour ignorer les vector embeddings les plus similaires, il faut s'assurer que

range_filter <= distance < radius

HAMMING

Une distance de Hamming plus petite indique une plus grande similarité.

Pour ignorer les vector embeddings les plus similaires, assurez-vous que

range_filter <= distance < radius

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":[]}

Traduit parDeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Cette page a-t - elle été utile ?