Búsqueda de similitud de vectores
Este tema presenta cómo realizar la búsqueda de entidades en Milvus.
La búsqueda de similitud de vectores en Milvus calcula la distancia entre el vector de consulta y los vectores en la colección, y devuelve los resultados más similares. También se puede realizar una búsqueda mixta especificando una expresión booleana para filtrar campos escalares o campos de clave primaria.
El siguiente ejemplo demuestra cómo realizar una búsqueda de similitud de vectores en un conjunto de datos de 2000 filas, que consiste en IDs de libros (clave primaria), frecuencia de palabras (campo escalar) y descripciones de libros (campo vector). Esto simula el escenario de búsqueda de libros específicos basados en descripciones vectorizadas. Milvus devolverá los resultados más similares basados en el vector de consulta definido y los parámetros de búsqueda.
Cargar colección
Antes de realizar la búsqueda de similitud de vectores, Milvus ejecuta todas las operaciones de búsqueda y consulta en la memoria. Por favor, carga la colección en memoria antes de realizar la búsqueda de similitud de vectores.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("fallo al cargar la colección:", err.Error())
}
Preparar parámetros de búsqueda
Prepara parámetros adecuados para tu escenario de búsqueda. El siguiente ejemplo define el uso de la distancia euclidiana para calcular la distancia y recuperar vectores de los diez clusters más cercanos construidos por el índice IVF_FLAT.
sp, _ := entity.NewIndexIvfFlatSearchParam( // Función NewIndex*SearchParam
10, // nprobe
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
Parámetro | Descripción | Opciones |
---|---|---|
Función NewIndex*SearchParam |
Función para crear entity.SearchParam basado en diferentes tipos de índices. |
Para vectores de punto flotante: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Para vectores binarios: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT) |
sp |
Parámetros de búsqueda específicos del índice devueltos por la función anterior. | Ver Índice de vectores para más detalles. |
opt |
Opciones para la búsqueda de ANN. | - Limit : Especifica el número de entidades a devolver. - Offset : Especifica el número de entidades a omitir durante la búsqueda. La suma de este parámetro y Limit debe ser menor que 16384. Por ejemplo, si deseas consultar los vecinos más cercanos 9 y 10 de un vector, configura Limit en 2 y Offset en 8 . - ConsistencyLevel : Especifica el nivel de consistencia aplicado durante la búsqueda. - Ignore Growing : Indica si se deben ignorar los segmentos en crecimiento en la búsqueda de similitud. El valor predeterminado es False , lo que indica que la búsqueda implica segmentos en crecimiento. |
Realizar búsqueda vectorial
Realiza una búsqueda vectorial utilizando Milvus. Para buscar en una partición específica, por favor especifica la lista de nombres de partición.
Milvus admite establecer un nivel de consistencia para la búsqueda. El ejemplo en este tema establece el nivel de consistencia en Strong
. También puedes configurar el nivel de consistencia en Bounded
, Session
, o Eventually
. Para obtener más información sobre los cuatro niveles de consistencia en Milvus, consulta la sección de Consistencia.
searchResult, err := milvusClient.Search(
context.Background(), // ctx
"book", // NombreColección
[]string{}, // nombresParticiones
"", // expr
[]string{"book_id"}, // camposSalida
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vectores
"book_intro", // campoVector
entity.L2, // tipoMétrica
10, // topK
sp, // sp
opt,
)
if err != nil {
log.Fatal("Error al buscar en la colección:", err.Error())
}
Parámetro | Descripción | Opciones |
---|---|---|
ctx |
Contexto utilizado para controlar el proceso de llamada a la API | N/A |
NombreColección |
Nombre de la colección a cargar | N/A |
nombresParticiones |
Lista de nombres de particiones a cargar. Si está vacío, buscar en todas las particiones | N/A |
expr |
Expresión booleana para filtrar propiedades | Consulta las reglas de expresión booleana para obtener información detallada |
camposSalida |
Nombres de campos a devolver | N/A |
vectores |
Vectores a buscar | N/A |
campoVector |
Nombre del campo a buscar | N/A |
tipoMétrica |
Tipo de métrica utilizado para la búsqueda | Este parámetro debe ser el mismo que el tipo de métrica utilizado para construir el índice |
topK |
Número de resultados a devolver. La suma de este valor y offset en opts debe ser menor que 16384 |
N/A |
sp |
entity.SearchParam específico para el índice |
N/A |
Verifica los valores de clave primaria y las distancias de los vectores más similares.
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}
Una vez completada la búsqueda, libera la colección cargada en Milvus para reducir el consumo de memoria.
err := milvusClient.ReleaseCollection(
context.Background(), // ctx
"book", // NombreColección
)
if err != nil {
log.Fatal("Error al liberar la colección:", err.Error())
}
Limitaciones
Característica | Límite Máximo |
---|---|
Longitud del nombre de la colección | 255 caracteres |
Número de particiones en una colección | 4,096 |
Número de campos en una colección | 256 |
Número de fragmentos en una colección | 256 |
Dimensionalidad de vectores | 32,768 |
Top K | 16,384 |
Número de vectores de entrada objetivo | 16,384 |
Realización de Búsqueda Mixta
La búsqueda mixta es esencialmente una búsqueda vectorial con filtrado de atributos. Al especificar una expresión booleana para filtrar campos escalares o campos de clave primaria, puedes limitar la búsqueda en función de condiciones específicas.
El siguiente ejemplo demuestra cómo realizar una búsqueda mixta basada en una búsqueda vectorial regular. Supongamos que quieres buscar libros específicos basados en la introducción vectorizada de los libros, pero solo deseas recuperar libros dentro de un rango de recuento de palabras específico. Luego puedes filtrar el campo word_count
especificando una expresión booleana en los parámetros de búsqueda. Milvus solo buscará vectores similares dentro de entidades que coincidan con la expresión.
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(),
"book",
[]string{},
"word_count <= 11000",
[]string{"book_id"},
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
"book_intro",
entity.L2,
2,
sp,
opt,
)
if err != nil {
log.Fatal("Error al buscar en la colección:", err.Error())
}
Verifica los resultados devueltos.
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}