🚀 Prueba Zilliz Cloud, el Milvus completamente gestionado, gratis—¡experimenta un rendimiento 10 veces más rápido! Prueba Ahora>>

milvus-logo
LFAI
  • Home
  • Blog
  • ¿Cómo entiende y ejecuta la base de datos su consulta?

¿Cómo entiende y ejecuta la base de datos su consulta?

  • Engineering
May 05, 2022
Milvus

Cover image Imagen de portada

Este artículo ha sido transcreado por Angela Ni.

Una consulta vectorial en Milvus es el proceso de recuperación de vectores mediante filtrado escalar basado en una expresión booleana. Con el filtrado escalar, los usuarios pueden limitar los resultados de sus consultas aplicando determinadas condiciones a los atributos de los datos. Por ejemplo, si un usuario busca películas estrenadas entre 1990 y 2010 con una puntuación superior a 8,5, sólo se mostrarán las películas cuyos atributos (año de estreno y puntuación) cumplan la condición.

Este artículo pretende examinar cómo se completa una consulta en Milvus desde la entrada de una expresión de consulta hasta la generación del plan de consulta y la ejecución de la consulta.

Ir a:

Expresión de consulta

La expresión de una consulta con filtrado de atributos en Milvus adopta la sintaxis EBNF (Extended Backus-Naur form). La siguiente imagen muestra las reglas de expresión en Milvus.

Expression Syntax Sintaxis de expresión

Las expresiones lógicas pueden crearse utilizando la combinación de operadores lógicos binarios, operadores lógicos unarios, expresiones lógicas y expresiones simples. Dado que la sintaxis EBNF es en sí misma recursiva, una expresión lógica puede ser el resultado de la combinación o parte de una expresión lógica mayor. Una expresión lógica puede contener muchas sub-expresiones lógicas. La misma regla se aplica en Milvus. Si un usuario necesita filtrar los atributos de los resultados con muchas condiciones, puede crear su propio conjunto de condiciones de filtrado combinando diferentes operadores y expresiones lógicas.

Boolean expression Expresión booleana

La imagen anterior muestra parte de las reglas de expresión booleana en Milvus. Pueden añadirse operadores lógicos unarios a una expresión. Actualmente Milvus sólo admite el operador lógico unario "not", que indica que el sistema necesita tomar los vectores cuyos valores de campo escalar no satisfacen los resultados del cálculo. Los operadores lógicos binarios incluyen "and" y "or". Las expresiones simples incluyen expresiones de término y expresiones de comparación.

Milvus también admite cálculos aritméticos básicos como la suma, la resta, la multiplicación y la división durante una consulta. La siguiente imagen muestra la precedencia de las operaciones. Los operadores se enumeran de arriba a abajo en orden descendente de precedencia.

Precedence Precedencia

¿Cómo se procesa en Milvus una expresión de consulta sobre determinadas películas?

Supongamos que hay una gran cantidad de datos de películas almacenados en Milvus y que el usuario desea consultar determinadas películas. Por ejemplo, cada dato de película almacenado en Milvus tiene los cinco campos siguientes: ID de la película, año de estreno, tipo de película, puntuación y cartel. En este ejemplo, el tipo de datos del ID de la película y el año de estreno es int64, mientras que las puntuaciones de las películas son datos de coma flotante. Además, los carteles de las películas se almacenan en formato de vectores de coma flotante, y el tipo de película en formato de datos de cadena. Cabe destacar que la compatibilidad con los tipos de datos de cadena es una nueva característica de Milvus 2.1.

Por ejemplo, si un usuario desea consultar las películas con puntuaciones superiores a 8,5 puntos. Además, las películas deben estrenarse entre una década antes de 2000 y una década después de 2000, o ser de comedia o de acción, el usuario debe introducir la siguiente expresión predicada: score > 8.5 && (2000 - 10 < release_year < 2000 + 10 || type in [comedy,action]).

Al recibir la expresión de consulta, el sistema la ejecutará con la siguiente precedencia:

  1. Buscar películas con una puntuación superior a 8,5. El resultado de la consulta se denomina "resultado1".
  2. Calcular 2000 - 10 para obtener "resultado2" (1990).
  3. Calcular 2000 + 10 para obtener "resultado3" (2010).
  4. Buscar películas cuyo valor de release_year sea mayor que "result2" y menor que "result3". Es decir, el sistema debe buscar las películas estrenadas entre 1990 y 2010. Los resultados de la consulta se denominan "resultado4".
  5. Buscar películas que sean comedias o películas de acción. Los resultados de la consulta se denominan "resultado5".
  6. Combine "resultado4" y "resultado5" para obtener películas estrenadas entre 1990 y 2010 o que pertenezcan a la categoría de comedia o película de acción. Los resultados se denominan "resultado6".
  7. Tome la parte común en "resultado1" y "resultado6" para obtener los resultados finales que satisfacen todas las condiciones.

Film example Ejemplo de película

Planificar la generación de AST

Milvus utiliza la herramienta de código abierto ANTLR (ANother Tool for Language Recognition) para la generación de planes AST (árbol de sintaxis abstracta). ANTLR es un potente generador de análisis sintáctico para leer, procesar, ejecutar o traducir texto estructurado o archivos binarios. Más concretamente, ANTLR puede generar un analizador sintáctico para construir y recorrer árboles de análisis sintáctico basados en sintaxis o reglas predefinidas. La siguiente imagen es un ejemplo en el que la expresión de entrada es "SP=100;". LEXER, la funcionalidad de reconocimiento de lenguaje integrada en ANTLR, genera cuatro tokens para la expresión de entrada: "SP", "=", "100" y ";". A continuación, la herramienta analiza los cuatro tokens para generar el correspondiente árbol de análisis sintáctico.

parse tree árbol de análisis sintáctico

El mecanismo de recorrido es una parte crucial de la herramienta ANTLR. Está diseñado para recorrer todos los árboles de análisis sintáctico con el fin de examinar si cada nodo obedece las reglas sintácticas, o para detectar ciertas palabras sensibles. En la siguiente imagen se enumeran algunas de las API relevantes. Dado que ANTLR comienza desde el nodo raíz y va descendiendo por cada subnodo hasta llegar al final, no es necesario diferenciar el orden de cómo recorrer el árbol de análisis sintáctico.

parse tree walker caminador del árbol de análisis sintáctico

Milvus genera el PlanAST para consulta de forma similar al ANTLR. Sin embargo, el uso de ANTLR requiere redefinir reglas sintácticas bastante complicadas. Por lo tanto, Milvus adopta una de las reglas más comunes, las reglas de expresión booleana, y depende del paquete Expr de código abierto en GitHub para consultar y analizar la sintaxis de las expresiones de consulta.

Durante una consulta con filtrado de atributos, Milvus generará un árbol de plan primitivo sin resolver utilizando ant-parser, el método de análisis sintáctico proporcionado por Expr, al recibir la expresión de consulta. El árbol del plan primitivo que obtendremos es un árbol binario simple. A continuación, Expr y el optimizador incorporado en Milvus afinan el árbol del plan. El optimizador de Milvus es bastante similar al mecanismo del caminante antes mencionado. Dado que la funcionalidad de optimización del árbol de planes proporcionada por Expr es bastante sofisticada, la carga del optimizador incorporado en Milvus se alivia en gran medida. En última instancia, el analizador analiza el árbol del plan optimizado de forma recursiva para generar un AST del plan en la estructura de búferes de protocolo (protobuf).

plan AST workflow Flujo de trabajo del plan AST

Ejecución de consultas

La ejecución de la consulta es, en esencia, la ejecución del plan AST generado en los pasos anteriores.

En Milvus, un plan AST se define en una estructura proto. La imagen de abajo es un mensaje con la estructura protobuf. Hay seis tipos de expresiones, entre las cuales la expresión binaria y la expresión unaria pueden tener además expresión lógica binaria y expresión lógica unaria.

protobuf1 protobuf1

protobuf2 protobuf2

La imagen siguiente es una imagen UML de la expresión de consulta. Demuestra la clase básica y la clase derivada de cada expresión. Cada clase viene con un método para aceptar parámetros del visitante. Este es un patrón de diseño de visitante típico. Milvus utiliza este patrón para ejecutar el plan AST ya que su mayor ventaja es que los usuarios no tienen que hacer nada a las expresiones primitivas sino que pueden acceder directamente a uno de los métodos de los patrones para modificar cierta clase de expresión de consulta y los elementos relevantes.

UML UML

Al ejecutar un plan AST, Milvus recibe primero un nodo de plan de tipo proto. A continuación, se obtiene un nodo de plan de tipo segcore mediante el analizador sintáctico interno de proto de C++. Al obtener los dos tipos de nodos del plan, Milvus acepta una serie de accesos a clases y, a continuación, modifica y ejecuta en la estructura interna de los nodos del plan. Por último, Milvus busca en todos los nodos del plan de ejecución para obtener los resultados filtrados. Los resultados finales se obtienen en el formato de una máscara de bits. Una máscara de bits es una matriz de números de bits ("0" y "1"). Los datos que cumplen las condiciones del filtro se marcan como "1" en la máscara de bits, mientras que los que no las cumplen se marcan como "0" en la máscara de bits.

execute workflow ejecutar flujo de trabajo

Acerca de la serie Deep Dive

Con el anuncio oficial de la disponibilidad general de Milvus 2.0, hemos orquestado esta serie de blogs Milvus Deep Dive para ofrecer una interpretación en profundidad de la arquitectura y el código fuente de Milvus. Los temas tratados en esta serie de blogs incluyen

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Sigue Leyendo