milvus-logo
LFAI
Casa
  • Guida per l'utente

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.

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

L2

Una distanza L2 più piccola indica una maggiore somiglianza.

Per ignorare le incorporazioni vettoriali più simili, assicuratevi che

range_filter <= distanza < radius

IP

Una distanza IP maggiore indica una maggiore somiglianza.

Per ignorare le incorporazioni vettoriali più simili, assicurarsi che

radius < distanza <= range_filter

COSINE

Una distanza COSINE maggiore indica una maggiore somiglianza.

Per ignorare le incorporazioni vettoriali più simili, assicurarsi che

radius < distanza <= range_filter

JACCARD

Una distanza di Jaccard minore indica una maggiore somiglianza.

Per ignorare le incorporazioni vettoriali più simili, assicurarsi che

range_filter <= distanza < radius

HAMMING

Una distanza di Hamming più piccola indica una maggiore somiglianza.

Per ignorare le incorporazioni vettoriali più simili, assicurarsi che

range_filter <= distanza < radius

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

Tradotto daDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Questa pagina è stata utile?