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)
}