Í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.
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 datos | Algoritmo 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.
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 datos Función de estimación de memoria (MB) INT8 numOfRows * 12 / 1024 / 1024 INT16 numOfRows * 12 / 1024 / 1024 INT32 numOfRows * 12 / 1024 / 1024 INT64 numOfRows * 24 / 1024 / 1024 FLOAT32 númeroDeFilas * 12 / 1024 / 1024 DOUBLE numOfRows * 24 / 1024 / 1024 Campos de cadena
Longitud de la cadena Funció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
Para indexar un campo escalar, lea Construir un índice sobre escalares.
Para obtener más información sobre los términos y reglas mencionados anteriormente, lea