Cómo Bitset hace posible la versatilidad de la búsqueda de similitud vectorial
Imagen de portada de Bitset
Por Yudong Cai y Angela Ni.
Con el lanzamiento de Milvus 2.0 se proporcionan varias nuevas características esenciales de una base de datos vectorial. Entre las nuevas características, Time Travel, el filtrado de atributos y las operaciones de eliminación están correlacionadas, ya que estas tres características se logran mediante un mecanismo común: bitset.
Por lo tanto, este artículo pretende aclarar el concepto de bitset en Milvus y explicar cómo funciona para dar soporte a las operaciones de borrado, Time Travel y filtrado de atributos con tres ejemplos.
¿Qué es un conjunto de bits?
Un conjunto de bits es una matriz de números de bits ("0" y "1") que puede utilizarse para representar cierta información de datos. Con los conjuntos de bits, puedes almacenar ciertos tipos de datos de forma compacta y eficiente en lugar de almacenarlos en Ints, floats o chars. Los conjuntos de bits funcionan con lógica booleana, según la cual el valor de una salida es válido o inválido, normalmente denotados por "1" y "0" respectivamente. "1" significa válido y "0", inválido. Dado que los conjuntos de bits son muy eficientes y pueden ahorrar almacenamiento, también se pueden utilizar para lograr muchas características como el filtrado de atributos, operaciones de borrado, Time Travel, etc.
A partir de la versión 0.7.0, el concepto de bitset se ha introducido en Milvus para habilitar la función de borrado. Más concretamente, el conjunto de bits se utiliza para marcar si cada fila del segmento está eliminada. Las entidades eliminadas se marcan con "1" en el conjunto de bits correspondiente y, como resultado, las entidades eliminadas no se computarán durante una búsqueda o consulta.
En la versión Milvus 2.0, la aplicación de bitset se amplía para permitir más funciones, como el filtrado de atributos y el Time Travel. El principio general de un bitset sigue siendo el mismo. Es decir, si una entidad está marcada con "1" en el bitset correspondiente, la entidad será ignorada durante una búsqueda o consulta. Los conjuntos de bits se utilizan para habilitar 3 características en Milvus:
- Filtrado de atributos
- Eliminación de datos
- Consulta con desplazamiento en el tiempo
¿Cómo funciona el conjunto de bits en Milvus?
Los ejemplos siguientes se utilizan para ilustrar cómo funciona bitset en Milvus.
Requisitos previos
Supongamos que hay un segmento con ocho entidades y que se produce una serie de eventos de lenguaje de manipulación de datos (DML) en el orden que se muestra en la siguiente figura.
- Cuatro de las entidades, cuyo
primary_keys
son [1, 2, 3, 4] respectivamente, se insertan cuando la marca de tiempots
es igual a 100. - Las cuatro entidades restantes, cuyas
primary_keys
son [5, 6, 7, 8], se insertan cuando la marca de tiempots
es igual a 200. - Las entidades cuyo
primary_keys
es [7, 8] se eliminan cuando la marca de tiempots
es igual a 300. - Sólo las entidades cuyo
primary_keys
es [1, 3, 5, 7] cumplen las condiciones del filtrado de atributos.
Eventos DML
Caso 1
Supongamos que el valor que un usuario establece para time_travel
es 150. En otras palabras, el usuario realiza una consulta sobre los datos almacenados en Milvus cuando ts
= 150. La figura 1 ilustra el proceso de generación del conjunto de bits.
Durante la etapa de filtrado inicial, el resultado de filter_bitset
debería ser [1, 0, 1, 0, 1, 0, 1, 0], ya que las entidades [1, 3, 5, 7] son resultados de filtrado válidos y están marcadas como "1" en el conjunto de bits. Sin embargo, las entidades [4, 5, 6, 7] ni siquiera se insertaron en la base de datos de vectores cuando ts
es igual a 150. Por lo tanto, estas cuatro entidades deberían marcarse como "0" independientemente de la condición de filtrado. Ahora el resultado del conjunto de bits debería ser [1, 0, 1, 0, 0, 0, 0, 0]. Dado que en Milvus el principio general de la computación de conjuntos de bits es que las entidades marcadas con "1" en el conjunto de bits se ignoran durante una búsqueda o consulta, el resultado del conjunto de bits tras el viaje en el tiempo y el filtrado de atributos debe invertirse para combinarse con el mapa de bits de eliminación. El resultado volteado de filter_bitset
debe ser [0, 1, 0, 1, 1, 1, 1].
En cuanto al conjunto de bits de borrado del_bitset
, el valor inicial debe ser [0, 0, 0, 0, 0, 0, 1, 1]. Sin embargo, las entidades 7 y 8 no se borran hasta que ts
es 300. Por lo tanto, cuando ts
es 150, las entidades 7 y 8 siguen siendo válidas. Como resultado, el valor de del_bitset
después del Viaje en el Tiempo debería ser [0, 0, 0, 0, 0, 0, 0, 0].
Ahora tenemos dos conjuntos de bits después del Viaje en el Tiempo y el filtrado de atributos: filter_bitset
[0, 1, 0, 1, 1, 1, 1] y del_bitset
[0, 0, 0, 0, 0, 0, 0, 0]. Combina estos dos conjuntos de bits con el operador lógico binario "OR". El valor final de result_bitset
es [0, 1, 0, 1, 1, 1, 1]. Es decir, en la siguiente etapa de búsqueda o consulta sólo se computarán las entidades 1 y 3.
Figura 1
Caso 2
Supongamos que el valor que el usuario establece para time_travel
es 250. En otras palabras, el usuario realiza una consulta sobre los datos almacenados en Milvus cuando ts
= 250. La figura 2 ilustra el proceso de generación del conjunto de bits.
Al igual que en el caso uno, la filter_bitset
resultante de la etapa inicial de filtrado de atributos debe ser [1, 0, 1, 0, 1, 0, 1, 0].
Todas las entidades [1, 2, 3, 4, 5, 6, 7, 8] se insertan en la base de datos vectorial cuando ts
= 250. Por lo tanto, el resultado anterior de filter_bitset
sigue siendo el mismo. De nuevo, tenemos que voltear el resultado de filter_bitset
, y obtendremos [0, 1, 0, 1, 0, 1, 0, 1].
En cuanto al conjunto de bits de borrado del_bitset
, el valor inicial debería ser [0, 0, 0, 0, 0, 0, 1, 1]. Sin embargo, las entidades 7 y 8 no se borran hasta que ts
es 300. Por lo tanto, cuando ts
es 250, las entidades 7 y 8 siguen siendo válidas. Como resultado, el valor de del_bitset
después del Viaje en el Tiempo debería ser [0, 0, 0, 0, 0, 0, 0, 0].
Ahora tenemos dos conjuntos de bits después del Viaje en el Tiempo y el filtrado de atributos: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1] y del_bitset
[0, 0, 0, 0, 0, 0, 0, 0, 0]. Combina estos dos conjuntos de bits con el operador lógico binario "OR". El valor final de result_bitset
es [0, 1, 0, 1, 0, 1, 0, 1]. Es decir, en la siguiente etapa de búsqueda o consulta sólo se computarán las entidades [1, 3, 5, 7].
Figura 2
Caso 3
Supongamos que el valor que el usuario establece para time_travel
es 350. En otras palabras, el usuario realiza una consulta sobre los datos almacenados en Milvus cuando ts
= 350. El proceso de generación del conjunto de bits se ilustra en la figura 3.
Al igual que en los casos uno y dos, la filter_bitset
resultante de la etapa inicial de filtrado de atributos es [0, 1, 0, 1, 0, 1, 0, 1].
Todas las entidades [1, 2, 3, 4, 5, 6, 7, 8] se insertan en la base de datos vectorial cuando ts
= 350. Por lo tanto, el resultado final volteado de filter_bitset
es [0, 1, 0, 1, 0, 1, 0, 1], igual que en el caso dos.
En cuanto al conjunto de bits de borrado del_bitset
, puesto que las entidades 7 y 8 ya están borradas cuando ts
=350, por lo tanto, el resultado de del_bitset
debería ser [0, 0, 0, 0, 0, 0, 1, 1].
Ahora tenemos dos conjuntos de bits después del viaje en el tiempo y el filtrado de atributos: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1] y del_bitset
[0, 0, 0, 0, 0, 0, 1, 1]. Combina estos dos conjuntos de bits con el operador lógico binario "OR". El valor final de result_bitset
es [0, 1, 0, 1, 0, 1, 1, 1]. Es decir, en la siguiente etapa de búsqueda o consulta sólo se computarán las entidades [1, 3, 5].
Figura 3
¿Y ahora qué?
En el blog de la serie de nuevas funciones 2.0, pretendemos explicar el diseño de las nuevas funciones. Lea más en esta serie de blogs
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word