Pesquisa de Similaridade de Vetores

Este tópico apresenta como realizar a busca de entidades no Milvus.

A pesquisa de similaridade de vetores no Milvus calcula a distância entre o vetor de consulta e os vetores na coleção, e retorna os resultados mais semelhantes. Também é possível realizar uma pesquisa mista especificando uma expressão booleana para filtrar campos escalares ou campos de chave primária.

O exemplo a seguir demonstra como realizar a busca de similaridade de vetores em um conjunto de dados de 2000 linhas, composto por IDs de livros (chave primária), frequência de palavras (campo escalar) e descrições de livros (campo de vetor). Isso simula o cenário de busca de livros específicos com base em descrições vetorizadas. O Milvus retornará os resultados mais semelhantes com base no vetor de consulta definido e nos parâmetros de pesquisa.

Carregar Coleção

Antes de realizar a busca de similaridade de vetores, o Milvus executa todas as operações de busca e consulta na memória. Por favor, carregue a coleção na memória antes de realizar a busca de similaridade de vetores.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "livro",                 // Nome da Coleção
  false                   // assíncrono
)
if err != nil {
  log.Fatal("falha ao carregar a coleção:", err.Error())
}

Preparar Parâmetros de Pesquisa

Prepare parâmetros adequados para o seu cenário de busca. O exemplo a seguir define o uso da distância euclidiana para calcular a distância e recuperar vetores dos dez clusters mais próximos construídos pelo índice IVF_FLAT.

sp, _ := entity.NewIndexIvfFlatSearchParam( // Função NewIndex*SearchParam
    10,                                  // searchParam
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})
Parâmetro Descrição Opções
Função NewIndex*SearchParam Função para criar entity.SearchParam com base em diferentes tipos de índices. Para Vetores de Ponto Flutuante: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Para Vetores Binários: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT)
sp Parâmetros de pesquisa específicos do índice retornados pela função anterior. Veja o Índice de Vetores para detalhes.
opt Opções para pesquisa ANN. - Limit: Especifica o número de entidades a serem retornadas. - Offset: Especifica o número de entidades a serem puladas durante a pesquisa. A soma deste parâmetro e Limit deve ser menor que 16384. Por exemplo, se você deseja consultar os 9º e 10º vizinhos mais próximos de um vetor, defina Limit para 2 e Offset para 8. - ConsistencyLevel: Especifica o nível de consistência aplicado durante a pesquisa. - Ignore Growing: Indica se deve ignorar segmentos em crescimento na pesquisa de similaridade. O valor padrão é Falso, indicando que a pesquisa envolve segmentos em crescimento.

Realizar Busca Vetorial

Realize a busca vetorial usando o Milvus. Para buscar em uma partição específica, por favor especifique a lista de nomes das partições.

O Milvus suporta a definição de um nível de consistência para a busca. O exemplo neste tópico define o nível de consistência como Forte. Você também pode definir o nível de consistência como Limitado, Sessão ou Eventualmente. Para obter mais informações sobre os quatro níveis de consistência no Milvus, consulte Consistência.

searchResult, err := milvusClient.Search(
    context.Background(),                    // ctx
    "livro",                                 // CollectionName
    []string{},                              // partitionNames
    "",                                      // expr
    []string{"id_livro"},                    // outputFields
    []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vetores
    "introducao_livro",                      // campoVetor
    entity.L2,                               // tipoMétrica
    10,                                      // topK
    sp,                                      // sp
    opt,
)
if err != nil {
    log.Fatal("Falha ao buscar na coleção:", err.Error())
}
Parâmetro Descrição Opções
ctx Contexto usado para controlar o processo da chamada da API N/A
CollectionName Nome da coleção a ser carregada N/A
partitionNames Lista de nomes de partições a serem carregadas. Se vazio, busca todas as partições N/A
expr Expressão booleana para filtrar propriedades Consulte as Regras de Expressão Booleana para informações detalhadas
output_fields Nomes dos campos a serem retornados N/A
vectors Vetores a serem buscados N/A
vectorField Nome do campo a ser buscado N/A
metricType Tipo de métrica usado para a busca Este parâmetro deve ser o mesmo que o tipo de métrica usado para construir o índice
topK Número de resultados a serem retornados. A soma deste valor e offset em opts deve ser menor que 16384 N/A
sp entity.SearchParam específico para o índice N/A

Verifique os valores das chaves primárias e as distâncias dos vetores mais similares.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
    fmt.Println(sr.IDs)
    fmt.Println(sr.Scores)
}

Após a conclusão da busca, libere a coleção carregada no Milvus para reduzir o consumo de memória.

err := milvusClient.ReleaseCollection(
    context.Background(),                            // ctx
    "livro",                                          // CollectionName
)
if err != nil {
    log.Fatal("Falha ao liberar coleção:", err.Error())
}

Limitações

Recurso Limite Máximo
Comprimento do nome da coleção 255 caracteres
Número de partições em uma coleção 4.096
Número de campos em uma coleção 256
Número de fragmentos em uma coleção 256
Dimensionalidade dos vetores 32.768
Top K 16.384
Número de vetores de entrada alvo 16.384

Realizando Busca Mista

A busca mista é essencialmente uma busca vetorial com filtragem de atributos. Ao especificar uma expressão booleana para filtrar campos escalares ou campos de chave primária, é possível limitar a busca com base em condições específicas.

O exemplo a seguir demonstra como realizar a busca mista com base na busca vetorial regular. Suponha que você queira buscar por livros específicos com base na introdução vetorizada dos livros, mas deseja recuperar apenas livros dentro de uma faixa específica de contagem de palavras. Você pode então filtrar o campo contagem_palavras especificando uma expressão booleana nos parâmetros de busca. O Milvus buscará apenas vetores similares dentro de entidades que correspondam à expressão.

sp, _ := entity.NewIndexFlatSearchParam(
  10,
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})

searchResult, err := milvusClient.Search(
  context.Background(),
  "livro",
  []string{},
  "contagem_palavras <= 11000",
  []string{"id_livro"},
  []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
  "introducao_livro",
  entity.L2,
  2,
  sp,
  opt,
)

if err != nil {
  log.Fatal("Falha ao buscar na coleção:", err.Error())
}

Verifique os resultados retornados.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
  fmt.Println(sr.IDs)
  fmt.Println(sr.Scores)
}