Realización de consultas condicionales

Este tema presenta cómo realizar consultas condicionales, similares a las condiciones WHERE en SQL.

A diferencia de la búsqueda de similitud de vectores, las consultas recuperan vectores basados en filtrado escalar utilizando expresiones booleanas. Milvus admite varios tipos de datos en campos escalares y una variedad de expresiones booleanas. Las expresiones booleanas pueden filtrar campos escalares o campos de clave primaria y recuperar todos los resultados que coincidan con las condiciones de filtro.

El siguiente ejemplo demuestra cómo ejecutar una consulta en un conjunto de datos que contiene 2000 filas, incluyendo el ID del libro (clave primaria), cantidad de palabras (campo escalar) e introducción del libro (campo vectorial). Simula la consulta de libros específicos basados en sus IDs.

Carga de la colección

En Milvus, todas las operaciones de búsqueda y consulta se realizan en memoria. Antes de realizar una consulta, la colección debe cargarse en memoria.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // NombreColección
  false                   // asíncrono
)
if err != nil {
  log.Fatal("Error al cargar la colección:", err.Error())
}

Ejecución de la consulta

El siguiente ejemplo filtra vectores basados en valores específicos de book_id y devuelve los campos book_id y book_intro de los resultados.

Milvus admite configurar niveles de consistencia para consultas. En este ejemplo, se establece el nivel de consistencia en Fuerte. También puedes establecer el nivel de consistencia en Limitado, Sesión o Eventualmente. Para obtener más información sobre los cuatro niveles de consistencia en Milvus, consulta Consistencia.

También puedes usar campos dinámicos en las expresiones de filtro y campos de salida en la solicitud de consulta. Por ejemplo, consulta el patrón dinámico.

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

queryResult, err := milvusClient.Query(
    context.Background(),                                   // ctx
    "book",                                                 // NombreColección
    "",                                                     // NombrePartición
    entity.NewColumnInt64("book_id", []int64{2,4,6,8}),     // expr
    []string{"book_id", "book_intro"},                      // CamposSalida
    opt,                                                    // opcionesConsulta
)
if err != nil {
    log.Fatal("Error al consultar 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 consultar. N/A
NombrePartición Nombres de las particiones a cargar. Si está vacío, consulta todas las particiones. N/A
expr Expresión booleana utilizada para filtrar atributos. Para más información, consulta Reglas de Expresiones Booleanas.
CamposSalida Nombres de los campos a devolver. Los campos vectoriales no son compatibles en la versión actual.
opts Opciones de consulta representadas en forma de entity.SearchQueryOptionFunc. - Limit indica el número de entidades a devolver. - Offset indica el número de entidades a omitir durante el proceso de búsqueda. La suma de este parámetro y Limit debe ser inferior a 16384. - ConsistencyLevel indica el nivel de consistencia que se aplicará durante el proceso de búsqueda. - Ignore Growing indica si se debe ignorar el segmento en crecimiento durante el proceso de búsqueda de similitud. El valor predeterminado es False, lo que indica que la búsqueda involucra el segmento en crecimiento.

Verifica el resultado devuelto.

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

Cálculo de la cantidad de entidades

Al ejecutar una consulta, puedes añadir count(*) a output_fields, para que Milvus pueda devolver la cantidad de entidades en la colección. Si deseas contar la cantidad de entidades que cumplen condiciones específicas, utiliza expr para definir una expresión booleana.

Restricciones

Cuando se utiliza count(*) en output_fields, no se permite el uso del parámetro limit.