milvus-logo
LFAI
Home
  • Guía del usuario

Búsqueda por rango

Una búsqueda por rango mejora la relevancia de los resultados de búsqueda restringiendo la distancia o puntuación de las entidades devueltas dentro de un rango específico. Esta página le ayuda a entender qué es la búsqueda por rango y los procedimientos para realizar una búsqueda por rango.

Visión general

Cuando se ejecuta una solicitud de Búsqueda por rango, Milvus utiliza los vectores más similares al vector de consulta de los resultados de la Búsqueda RNA como centro, con el radio especificado en la solicitud de Búsqueda como radio del círculo exterior, y el filtro_rango como radio del círculo interior para dibujar dos círculos concéntricos. Se devolverán todos los vectores con puntuaciones de similitud que se encuentren dentro de la región anular formada por estos dos círculos concéntricos. Aquí, el filtro_rango puede fijarse en 0, lo que indica que se devolverán todas las entidades dentro de la puntuación de similitud especificada (radio).

Range search Búsqueda por rango

El diagrama anterior muestra que una solicitud de búsqueda por rango contiene dos parámetros: radio y filtro_rango. Al recibir una solicitud de búsqueda por rango, Milvus hace lo siguiente.

  • Utiliza el tipo de métrica especificado(COSINE) para encontrar todas las incrustaciones vectoriales más similares al vector de consulta.

  • Filtra las incrustaciones vectoriales cuyas distancias o puntuaciones al vector de consulta se encuentran dentro del rango especificado por los parámetros radio y rango_filtro.

  • Devolver las entidades top-K a partir de las filtradas.

La forma de establecer radio y rango_filtro varía según el tipo de métrica de la búsqueda. La siguiente tabla enumera los requisitos para establecer estos dos parámetros con distintos tipos de métrica.

Tipo de métrica

Denotaciones

Requisitos para configurar radius y range_filter

L2

Una distancia L2 menor indica una mayor similitud.

Para ignorar las incrustaciones vectoriales más similares, asegúrese de que

range_filter <= distancia < radius

IP

Una distancia IP mayor indica una mayor similitud.

Para ignorar las incrustaciones vectoriales más similares, asegúrese de que

radius < distancia <= range_filter

COSINE

Una distancia COSINE mayor indica una mayor similitud.

Para ignorar las incrustaciones vectoriales más similares, asegúrese de que

radius < distancia <= range_filter

JACCARD

Una distancia Jaccard menor indica una mayor similitud.

Para ignorar las incrustaciones vectoriales más similares, asegúrese de que

range_filter <= distancia < radius

HAMMING

Una distancia Hamming menor indica una mayor similitud.

Para ignorar las incrustaciones vectoriales más similares, asegúrese de que

range_filter <= distancia < radius

Ejemplos

Esta sección muestra cómo realizar una búsqueda de rango. Las solicitudes de búsqueda en los siguientes fragmentos de código no llevan un tipo métrico, lo que indica que se aplica el tipo métrico predeterminado COSINE. En este caso, asegúrese de que el valor de radio es menor que el valor de range_filter.

En los siguientes fragmentos de código, establezca radius en 0.4 y range_filter en 0.6 para que Milvus devuelva todas las entidades cuyas distancias o puntuaciones al vector de consulta estén comprendidas entre 0,4 y 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":[]}

Traducido porDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

¿Fue útil esta página?