milvus-logo
LFAI
Home
  • Guia do utilizador

Pesquisa de intervalo

Uma pesquisa de intervalo melhora a relevância dos resultados de pesquisa ao restringir a distância ou a pontuação das entidades devolvidas dentro de um intervalo específico. Esta página ajuda-o a compreender o que é a pesquisa de intervalo e os procedimentos para efetuar uma pesquisa de intervalo.

Visão geral

Ao executar um pedido de Pesquisa de Intervalo, o Milvus utiliza os vectores mais semelhantes ao vetor de consulta dos resultados da Pesquisa ANN como centro, com o raio especificado no pedido de Pesquisa como o raio do círculo exterior e o filtro_de_intervalo como o raio do círculo interior para desenhar dois círculos concêntricos. Todos os vetores com pontuações de similaridade que se enquadram na região anular formada por esses dois círculos concêntricos serão retornados. Aqui, o filtro_de_intervalo pode ser definido como 0, indicando que todas as entidades dentro da pontuação de similaridade especificada (raio) serão retornadas.

Range search Pesquisa por intervalo

O diagrama acima mostra que um pedido de pesquisa de intervalo tem dois parâmetros: raio e filtro_de_intervalo. Ao receber um pedido de pesquisa de intervalo, o Milvus faz o seguinte.

  • Utiliza o tipo de métrica especificado(COSINE) para encontrar todas as incorporações vectoriais mais semelhantes ao vetor em questão.

  • Filtra as incorporações vetoriais cujas distâncias ou pontuações para o vetor de consulta estão dentro do intervalo especificado pelos parâmetros radius e range_filter.

  • Devolver as entidades top-K a partir das entidades filtradas.

A forma de definir o raio e o filtro_de_alcance varia com o tipo de métrica da pesquisa. A tabela a seguir lista os requisitos para definir esses dois parâmetros com diferentes tipos de métrica.

Tipo de métrica

Denotações

Requisitos para definir radius e range_filter

L2

Uma distância L2 mais pequena indica uma maior semelhança.

Para ignorar as incorporações vetoriais mais semelhantes, certifique-se de que

range_filter <= distância < radius

IP

Uma distância IP maior indica uma maior semelhança.

Para ignorar as incorporações vectoriais mais semelhantes, certifique-se de que

radius < distância <= range_filter

COSINE

Uma maior distância COSINE indica uma maior semelhança.

Para ignorar as incorporações vectoriais mais semelhantes, certifique-se de que

radius < distância <= range_filter

JACCARD

Uma distância Jaccard menor indica uma maior similaridade.

Para ignorar as incorporações vectoriais mais semelhantes, certifique-se de que

range_filter <= distância < radius

HAMMING

Uma distância de Hamming mais pequena indica uma maior semelhança.

Para ignorar as incorporações vectoriais mais semelhantes, certifique-se de que

range_filter <= distância < radius

Exemplos

Esta secção demonstra como realizar uma pesquisa de intervalo. As solicitações de pesquisa nos trechos de código a seguir não carregam um tipo de métrica, indicando que o tipo de métrica padrão COSINE se aplica. Neste caso, certifique-se de que o valor do raio é menor do que o valor de range_filter.

Nos trechos de código a seguir, defina radius como 0.4 e range_filter como 0.6 para que Milvus retorne todas as entidades cujas distâncias ou pontuações para o vetor de consulta estejam entre 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":[]}

Traduzido porDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Esta página foi útil?