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