milvus-logo
LFAI
Home
  • Conceptos

Índice escalar

Milvus admite búsquedas filtradas que combinan campos escalares y vectoriales. Para mejorar la eficiencia de las búsquedas que implican campos escalares, Milvus introdujo la indexación de campos escalares a partir de la versión 2.1.0. Este artículo proporciona una visión general de la indexación de campos escalares en Milvus, ayudándole a comprender su significado e implementación.

Visión general

Al realizar búsquedas de similitud vectorial en Milvus, puede utilizar operadores lógicos para organizar campos escalares en expresiones booleanas.

Cuando Milvus recibe una solicitud de búsqueda con una expresión booleana de este tipo, analiza la expresión booleana en un árbol de sintaxis abstracta (AST) para generar un plan físico para el filtrado de atributos. A continuación, Milvus aplica el plan físico en cada segmento para generar un conjunto de bits como resultado del filtrado e incluye el resultado como parámetro de búsqueda vectorial para acotar el ámbito de búsqueda. En este caso, la velocidad de las búsquedas vectoriales depende en gran medida de la velocidad del filtrado de atributos.

Attribute filtering in a segment Filtrado de atributos en un segmento

La indexación de campos escalares es una forma de garantizar la velocidad del filtrado por atributos ordenando los valores de los campos escalares de una forma determinada para acelerar la recuperación de la información.

Algoritmos de indexación de campos escalares

Milvus pretende conseguir un bajo uso de memoria, una alta eficacia de filtrado y un tiempo de carga corto con sus algoritmos de indexación de campos escalares. Estos algoritmos se clasifican en dos tipos principales: autoindización e indización invertida.

Indexación automática

Milvus proporciona la opción AUTOINDEX para liberarle de tener que elegir manualmente un tipo de índice. Al llamar al método create_index, si no se especifica index_type, Milvus selecciona automáticamente el tipo de índice más adecuado en función del tipo de datos.

La siguiente tabla enumera los tipos de datos que soporta Milvus y sus correspondientes algoritmos de indexación automática.

Tipo de datosAlgoritmo de autoíndice
VARCHARÍndice invertido
INT8Índice invertido
INT16Índice invertido
INT32Índice invertido
INT64Índice invertido
FLOATÍndice invertido
DOUBLEÍndice invertido

Índice invertido

La indexación invertida ofrece una forma flexible de crear un índice para un campo escalar especificando manualmente los parámetros del índice. Este método funciona bien para varios escenarios, incluyendo consultas puntuales, consultas de coincidencia de patrones, búsquedas de texto completo, búsquedas JSON, búsquedas booleanas e incluso consultas de coincidencia de prefijos.

Los índices invertidos implementados en Milvus funcionan con Tantivy, una biblioteca de motores de búsqueda de texto completo. Tantivy garantiza que la indexación invertida en Milvus sea eficiente y rápida.

Un índice invertido tiene dos componentes principales: un diccionario de términos y una lista invertida. El diccionario de términos incluye todas las palabras tokenizadas ordenadas alfabéticamente, mientras que la lista invertida contiene la lista de documentos donde aparece cada palabra. Esta configuración hace que las consultas puntuales y por rango sean mucho más rápidas y eficaces que las búsquedas por fuerza bruta.

Inverted index diagram Diagrama del índice invertido

Las ventajas de utilizar un índice invertido son especialmente evidentes en las siguientes operaciones:

  • Consultas puntuales: Por ejemplo, al buscar documentos que contengan la palabra Milvus, el proceso comienza comprobando si Milvus está presente en el diccionario de términos. Si no se encuentra, ningún documento contiene la palabra. Sin embargo, si se encuentra, se recupera la lista invertida asociada a Milvus, que indica los documentos que contienen la palabra. Este método es mucho más eficaz que una búsqueda por fuerza bruta en un millón de documentos, ya que el diccionario de términos ordenado reduce considerablemente la complejidad temporal de la búsqueda de la palabra Milvus.
  • Consulta por rango: La eficacia de las consultas de rango, como la búsqueda de documentos con palabras alfabéticamente mayores que muy, también se ve mejorada por el diccionario de términos ordenados. Este enfoque es más eficaz que una búsqueda de fuerza bruta, ya que proporciona resultados más rápidos y precisos.

Resultados de las pruebas

Para demostrar las mejoras de rendimiento proporcionadas por los índices escalares en Milvus, se realizó un experimento comparando el rendimiento de varias expresiones utilizando la indexación invertida y la búsqueda de fuerza bruta en datos brutos.

El experimento consistió en probar varias expresiones en dos condiciones: con un índice invertido y con una búsqueda de fuerza bruta. Para garantizar la equidad, se mantuvo la misma distribución de datos en todas las pruebas, utilizando la misma colección cada vez. Antes de cada prueba, se liberó la colección y se eliminó y reconstruyó el índice. Además, se realizó una consulta en caliente antes de cada prueba para minimizar el impacto de los datos fríos y calientes, y cada consulta se ejecutó varias veces para garantizar la precisión.

Para un conjunto de datos de 1 millón de registros, el uso de un índice invertido puede proporcionar una mejora del rendimiento de hasta 30 veces en las consultas puntuales. Las ganancias de rendimiento pueden ser incluso más significativas para conjuntos de datos de mayor tamaño.

Recomendaciones de rendimiento

Para aprovechar al máximo la capacidad de Milvus en la indexación de campos escalares y dar rienda suelta a su potencia en las búsquedas de similitud vectorial, es posible que necesite un modelo para estimar el tamaño de la memoria necesaria en función de los datos de que disponga.

Las siguientes tablas enumeran las funciones de estimación para todos los tipos de datos que soporta Milvus.

  • Campos numéricos

    Tipo de datosFunción de estimación de memoria (MB)
    INT8numOfRows * 12 / 1024 / 1024
    INT16numOfRows * 12 / 1024 / 1024
    INT32numOfRows * 12 / 1024 / 1024
    INT64numOfRows * 24 / 1024 / 1024
    FLOAT32númeroDeFilas * 12 / 1024 / 1024
    DOUBLEnumOfRows * 24 / 1024 / 1024
  • Campos de cadena

    Longitud de la cadenaFunción de estimación de memoria (MB)
    (0, 8]numOfRows * 128 / 1024 / 1024
    (8, 16]numOfRows * 144 / 1024 / 1024
    (16, 32]númeroDeFilas * 160 / 1024 / 1024
    (32, 64]númeroDeFilas * 192 / 1024 / 1024
    (64, 128]númeroDeFilas * 256 / 1024 / 1024
    (128, 65535]numOfRows * strLen * 1.5 / 1024 / 1024

Siguiente paso

Traducido porDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

¿Fue útil esta página?