Bitset
Cette rubrique présente le mécanisme de bitset qui permet d'activer des fonctionnalités clés telles que le filtrage d'attributs et les opérations de suppression dans Milvus.
Vue d'ensemble
Un ensemble de bits est un ensemble de bits. Les bits sont des éléments qui n'ont que deux valeurs possibles, le plus souvent 0
et 1
, ou des valeurs booléennes true
et false
. Dans Milvus, les ensembles de bits sont des tableaux de nombres de bits 0
et 1
qui peuvent être utilisés pour représenter certaines données de manière compacte et efficace, contrairement aux ints, aux floats ou aux chars. Un nombre de bits est 0
par défaut et n'est défini sur 1
que s'il répond à certaines exigences.
Les opérations sur les ensembles de bits sont effectuées en logique booléenne, selon laquelle une valeur de sortie est soit valide, soit invalide, également désignée par 1
et 0
respectivement. Par exemple, l'opérateur logique AND
peut être utilisé pour comparer deux ensembles de bits sur la base des éléments situés dans les mêmes positions d'index et produit un nouvel ensemble de bits avec les résultats. Si deux éléments d'une position sont identiques, le nouvel ensemble binaire contiendra 1
à cette position et 0
s'ils sont différents.
Mise en œuvre
Le jeu de bits est un mécanisme simple mais puissant qui permet à Milvus d'effectuer le filtrage d'attributs, la suppression de données et l'interrogation avec Time Travel.
Filtrage des attributs
Comme les bitsets ne contiennent que deux valeurs possibles, ils sont parfaits pour stocker les résultats du filtrage d'attributs. Les données qui répondent aux exigences d'un filtre d'attribut donné sont marquées par 1
.
Suppression de données
Les bitsets constituent un moyen compact de stocker des informations indiquant si une ligne d'un segment a été supprimée. Les entités supprimées sont marquées par 1
dans le jeu de bits correspondant, qui ne sera pas calculé lors d'une recherche ou d'une interrogation.
Exemples
Nous présentons ici trois exemples qui illustrent la manière dont les ensembles de bits sont utilisés dans Milvus, avec des références aux trois principales implémentations d'ensembles de bits discutées ci-dessus. Dans les trois cas, il y a un segment avec 8 entités, puis une série d'événements de langage de manipulation de données (DML) se déroule dans l'ordre indiqué ci-dessous.
- Quatre des entités, dont les
primary_key
sont respectivement [1, 2, 3, 4], sont insérées lorsque l'horodatagets
est égal à 100. - Les quatre autres entités, dont les adresses
primary_key
sont [5, 6, 7, 8], sont insérées lorsque l'horodatagets
est égal à 200. - Les entités dont les
primary_key
sont [7, 8] sont supprimées lorsque l'horodatagets
est égal à 300. - Seules les entités dont les adresses
primary_key
sont [1, 3, 5, 7] satisfont aux conditions de filtrage des attributs.
Ordre des événements DML
Premier cas
Dans ce cas, un utilisateur définit time_travel
comme étant 150, ce qui signifie qu'il effectue une requête sur des données qui satisfont à ts = 150
. Le processus de génération de l'ensemble de bits est illustré par la figure 1.
Au cours de la phase de filtrage initiale, filter_bitset
devrait être [1, 0, 1, 0, 1, 0, 1, 0]
, où les entités [1, 3, 5, 7] sont marquées comme 1
parce qu'elles sont des résultats de filtrage valides.
Cependant, les entités [4, 5, 6, 7] n'ont pas été insérées dans la base de données vectorielle lorsque ts
est égal à 150. Par conséquent, ces quatre entités doivent être marquées comme 0, quelle que soit la condition de filtrage. Le résultat de l'ensemble de bits est maintenant [1, 0, 1, 0, 0, 0, 0, 0]
.
Comme indiqué dans Suppression des données, les entités marquées par 1
sont ignorées lors d'une recherche ou d'une interrogation. Le résultat de l'ensemble de bits doit maintenant être inversé afin d'être combiné avec le bitmap de suppression, ce qui nous donne [0, 1, 0, 1, 1, 1, 1, 1]
.
En ce qui concerne le jeu de bits de suppression del_bitset
, la valeur initiale devrait être [0, 0, 0, 0, 0, 0, 1, 1]
. Cependant, les entités 7 et 8 ne sont pas supprimées tant que ts
n'a pas atteint la valeur 300. Par conséquent, lorsque ts
vaut 150, les entités 7 et 8 sont encore valides. Par conséquent, la valeur de del_bitset
après le voyage dans le temps est [0, 0, 0, 0, 0, 0, 0, 0]
.
Nous avons maintenant deux ensembles de bits après le voyage dans le temps et le filtrage des attributs : filter_bitset
[0, 1, 0, 1, 1, 1, 1, 1]
et del_bitset
[0, 0, 0, 0, 0, 0, 0, 0]
. Combinez ces deux ensembles de bits avec l'opérateur logique binaire OR
. La valeur finale de result_bitset est [0, 1, 0, 1, 1, 1, 1, 1]
, ce qui signifie que seules les entités 1 et 3 seront calculées lors de l'étape suivante de recherche ou d'interrogation.
Figure 1. Recherche avec déplacement dans le temps = 150.
Deuxième cas
Dans ce cas, l'utilisateur fixe la valeur de time_travel
à 250. Le processus de génération de l'ensemble de bits est illustré par la figure 2.
Comme dans le premier cas, la valeur initiale de filter_bitset
est [1, 0, 1, 0, 1, 0, 1, 0]
.
Toutes les entités se trouvent dans la base de données vectorielle lorsque ts
= 250. Par conséquent, le filter_bitset
reste le même lorsque nous prenons en compte l'horodatage. Une fois de plus, nous devons inverser le résultat et obtenir [0, 1, 0, 1, 0, 1, 0, 1]
.
En ce qui concerne l'ensemble de bits de suppression del_bitset
, la valeur initiale est [0, 0, 0, 0, 0, 0, 1, 1]
. Cependant, les entités 7 et 8 n'ont pas été supprimées avant que ts
ne soit 300. Par conséquent, lorsque ts
est à 250, les entités 7 et 8 sont encore valides. Par conséquent, le jeu de bits del_bitset
après le voyage dans le temps est [0, 0, 0, 0, 0, 0, 0, 0]
.
Nous avons maintenant deux ensembles de bits après le voyage dans le temps et le filtrage des attributs : filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1]
et del_bitset
[0, 0, 0, 0, 0, 0, 0, 0]
. Combinez ces deux ensembles de bits avec l'opérateur logique binaire OR
. L'ensemble de bits résultant est [0, 1, 0, 1, 0, 1, 0, 1]
. En d'autres termes, seules les entités [1, 3, 5, 7] seront calculées lors de l'étape suivante de recherche ou d'interrogation.
Figure 2. Recherche avec déplacement dans le temps = 250.
Troisième cas
Dans ce cas, l'utilisateur fixe time_travel
à 350. Le processus de génération de l'ensemble de bits est illustré par la figure 3.
Comme dans les cas précédents, la valeur initiale de filter_bitset
est [0, 1, 0, 1, 0, 1, 0, 1]
.
Toutes les entités se trouvent dans la base de données vectorielle lorsque ts
= 350. Par conséquent, le jeu de bits final inversé filter_bitset
est [0, 1, 0, 1, 0, 1, 0, 1]
, comme dans le deuxième cas.
Quant à l'ensemble de bits de suppression del_bitset
, les entités 7 et 8 ayant déjà été supprimées lors de ts = 350
, le résultat de del_bitset
est donc [0, 0, 0, 0, 0, 0, 1, 1]
.
Nous avons maintenant deux ensembles binaires après le voyage dans le temps et le filtrage des attributs : filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1]
et del_bitset
[0, 0, 0, 0, 0, 0, 1, 1]
. Combinez ces deux ensembles de bits avec l'opérateur logique binaire OR
. L'ultime result_bitset
est [0, 1, 0, 1, 0, 1, 1, 1]
. En d'autres termes, seules les entités [1, 3, 5] seront calculées lors de l'étape suivante de recherche ou d'interrogation.
Figure 3. Recherche avec voyage dans le temps = 350.
Et maintenant ?
Maintenant que vous savez comment fonctionnent les ensembles de bits dans Milvus, vous pouvez également :
- Apprendre à utiliser des chaînes pour filtrer vos résultats de recherche, ou vous référer à la recherche hybride dans notre documentation.
- Comprendre comment les données sont traitées dans Milvus.