Conjunto de bits
Este tema presenta el mecanismo de conjunto de bits que ayuda a habilitar funcionalidades clave como el filtrado de atributos y las operaciones de borrado en Milvus.
Visión general
Un conjunto de bits es un conjunto de bits. Los bits son elementos con sólo dos valores posibles, más típicamente 0
y 1
, o valores booleanos true
y false
. En Milvus, los conjuntos de bits son matrices de números de bits 0
y 1
que pueden usarse para representar ciertos datos de forma compacta y eficiente en lugar de en ints, floats o chars. Un número de bits es 0
por defecto y sólo se establece en 1
si cumple ciertos requisitos.
Las operaciones sobre conjuntos de bits se realizan con lógica booleana, según la cual un valor de salida es válido o inválido, también denotados por 1
y 0
respectivamente. Por ejemplo, el operador lógico AND
puede utilizarse para comparar dos conjuntos de bits basados en elementos en las mismas posiciones de índice y produce un nuevo conjunto de bits con los resultados. Si dos elementos en una posición son iguales, en el nuevo conjunto de bits se escribirá 1
en esa posición; 0
si son diferentes.
Implementación
Bitset es un mecanismo sencillo pero potente que ayuda a Milvus a realizar el filtrado de atributos, la eliminación de datos y la consulta con Time Travel.
Filtrado de atributos
Como los bitsets contienen sólo dos valores posibles, son perfectos para almacenar los resultados del filtrado de atributos. Los datos que cumplen los requisitos de un determinado filtro de atributos se marcan con 1
.
Eliminación de datos
Los conjuntos de bits son una forma compacta de almacenar información sobre si se ha eliminado una fila de un segmento. Las entidades eliminadas se marcan con 1
en el bitset correspondiente, que no se computará durante una búsqueda o consulta.
Ejemplos
Aquí presentamos tres ejemplos que ilustran cómo se utilizan los conjuntos de bits en Milvus, con referencias a las tres principales implementaciones de conjuntos de bits comentadas anteriormente. En los tres casos, hay un segmento con 8 entidades y a continuación tiene lugar una serie de eventos del lenguaje de manipulación de datos (DML) en el orden que se muestra a continuación.
- Cuatro de las entidades, cuyas
primary_key
s son [1, 2, 3, 4] respectivamente, se insertan cuando la marca de tiempots
es igual a 100. - Las cuatro entidades restantes, cuyas
primary_key
s son [5, 6, 7, 8], se insertan cuando la marca de tiempots
es igual a 200. - Las entidades cuyo
primary_key
s es [7, 8] se eliminan cuando la marca de tiempots
es igual a 300. - Sólo las entidades cuyo
primary_key
s es [1, 3, 5, 7] cumplen las condiciones del filtrado de atributos.
Orden de los eventos DML
Caso 1
En este caso, un usuario establece time_travel
como 150, lo que significa que el usuario realiza una consulta sobre datos que satisfacen ts = 150
. El proceso de generación del conjunto de bits se ilustra en la figura 1.
Durante la etapa de filtrado inicial, el filter_bitset
debe ser [1, 0, 1, 0, 1, 0, 1, 0]
, donde las entidades [1, 3, 5, 7] se marcan como 1
porque son resultados de filtrado válidos.
Sin embargo, las entidades [4, 5, 6, 7] no se insertaron en la base de datos vectorial 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]
.
Como se ha comentado en Eliminación de datos, las entidades marcadas con 1
se ignoran durante una búsqueda o consulta. Ahora hay que dar la vuelta al resultado del conjunto de bits para combinarlo con el mapa de bits de borrado, lo que nos da [0, 1, 0, 1, 1, 1, 1, 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 150, las entidades 7 y 8 siguen siendo válidas. Como resultado, el valor de del_bitset
después del Viaje en el Tiempo es [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, 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, 1]
, lo que significa que sólo se computarán las entidades 1 y 3 en la siguiente etapa de búsqueda o consulta.
Figura 1. Búsqueda con Time Travel = 150.
Caso 2
En este caso, el usuario establece time_travel
como 250. El proceso de generación del conjunto de bits se ilustra en la Figura 2.
Como en el caso uno, el filter_bitset
inicial es [1, 0, 1, 0, 1, 0, 1, 0]
.
Todas las entidades se encuentran en la base de datos vectorial cuando ts
= 250. Por lo tanto, filter_bitset
sigue siendo el mismo cuando introducimos la marca de tiempo. De nuevo, tenemos que voltear el resultado y obtener [0, 1, 0, 1, 0, 1, 0, 1]
.
En cuanto al conjunto de bits de borrado del_bitset
, el valor inicial es [0, 0, 0, 0, 0, 0, 1, 1]
. Sin embargo, las entidades 7 y 8 no se borraron hasta que ts
es 300. Por lo tanto, cuando ts
es 250, las entidades 7 y 8 siguen siendo válidas. Como resultado, el del_bitset
después del Viaje en el Tiempo es [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]
. Combina estos dos conjuntos de bits con el operador lógico binario OR
. El conjunto_de_bits resultante es [0, 1, 0, 1, 0, 1, 0, 1]
. Es decir, sólo las entidades [1, 3, 5, 7] se computarán en la siguiente etapa de búsqueda o consulta.
Figura 2. Búsqueda con Time Travel = 250.
Caso 3
En este caso, el usuario establece time_travel
como 350. El proceso de generación del conjunto de bits se ilustra en la Figura 3.
Como en los casos anteriores, el filter_bitset
inicial es [0, 1, 0, 1, 0, 1, 0, 1]
.
Todas las entidades se encuentran en la base de datos vectorial cuando ts
= 350. Por lo tanto, el filter_bitset
final volteado 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 han sido borradas cuando ts = 350
, por lo tanto, el resultado de del_bitset
es [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 último 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. Búsqueda con Time Travel = 350.
Lo que sigue
Ahora que ya sabe cómo funcionan los conjuntos de bits en Milvus, puede que también quiera
- Aprender a utilizar cadenas para filtrar los resultados de la búsqueda, o consultar Búsqueda híbrida en nuestra documentación.
- Comprender cómo se procesan los datos en Milvus.