Bitset
In diesem Thema wird der Bitset-Mechanismus vorgestellt, der wichtige Funktionen wie das Filtern von Attributen und Löschvorgänge in Milvus ermöglicht.
Überblick
Ein Bitset ist eine Menge von Bits. Bits sind Elemente mit nur zwei möglichen Werten, typischerweise 0
und 1
, oder boolesche Werte true
und false
. In Milvus sind Bitsets Arrays von Bit-Zahlen 0
und 1
, die verwendet werden können, um bestimmte Daten kompakt und effizient zu repräsentieren, im Gegensatz zu Ints, Floats oder Chars. Eine Bitnummer ist standardmäßig 0
und wird nur dann auf 1
gesetzt, wenn sie bestimmte Anforderungen erfüllt.
Operationen auf Bitmengen werden mit boolescher Logik durchgeführt, bei der ein Ausgabewert entweder gültig oder ungültig ist, was auch mit 1
bzw. 0
bezeichnet wird. Beispielsweise kann der logische Operator AND
verwendet werden, um zwei Bitsets auf der Grundlage von Elementen in denselben Indexpositionen zu vergleichen und ein neues Bitset mit den Ergebnissen zu erzeugen. Wenn zwei Elemente an einer Position gleich sind, wird in der neuen Bitmenge 1
an diese Position geschrieben; 0
, wenn sie unterschiedlich sind.
Implementierung
Bitset ist ein einfacher, aber leistungsfähiger Mechanismus, der Milvus hilft, Attributfilterung, Datenlöschung und Abfragen mit Time Travel durchzuführen.
Attribut-Filterung
Da Bitsets nur zwei mögliche Werte enthalten, sind sie perfekt für die Speicherung von Ergebnissen der Attributfilterung geeignet. Daten, die die Anforderungen eines bestimmten Attributfilters erfüllen, werden mit 1
markiert.
Löschung von Daten
Bitsets dienen als kompakte Möglichkeit, Informationen darüber zu speichern, ob eine Zeile in einem Segment gelöscht wurde. Gelöschte Entitäten werden mit 1
im entsprechenden Bitset markiert, das während einer Suche oder Abfrage nicht berechnet wird.
Beispiele
Hier stellen wir drei Beispiele vor, die zeigen, wie Bitsets in Milvus verwendet werden, mit Verweisen auf alle drei oben erwähnten Hauptimplementierungen von Bitsets. In allen drei Fällen gibt es ein Segment mit 8 Entitäten, und dann findet eine Reihe von DML-Ereignissen (Data Manipulation Language) in der unten dargestellten Reihenfolge statt.
- Vier der Entitäten, deren
primary_key
jeweils [1, 2, 3, 4] sind, werden eingefügt, wenn der Zeitstempelts
gleich 100 ist. - Die restlichen vier Entitäten, deren
primary_key
s [5, 6, 7, 8] lauten, werden eingefügt, wenn der Zeitstempelts
gleich 200 ist. - Entitäten, deren
primary_key
s [7, 8] sind, werden gelöscht, wenn der Zeitstempelts
gleich 300 ist. - Nur Entitäten, deren
primary_key
s [1, 3, 5, 7] sind, erfüllen die Bedingungen der Attributfilterung.
Reihenfolge der DML-Ereignisse
Fall eins
In diesem Fall setzt ein Benutzer time_travel
auf 150, was bedeutet, dass der Benutzer eine Abfrage auf Daten durchführt, die ts = 150
erfüllen. Der Prozess der Bitset-Generierung ist in Abbildung 1 dargestellt.
Während der anfänglichen Filterungsphase sollte filter_bitset
[1, 0, 1, 0, 1, 0, 1, 0]
sein, wobei die Entitäten [1, 3, 5, 7] als 1
markiert sind, da sie gültige Filterungsergebnisse sind.
Die Entitäten [4, 5, 6, 7] wurden jedoch nicht in die Vektordatenbank eingefügt, wenn ts
gleich 150 ist. Daher sollten diese vier Entitäten unabhängig von der Filterungsbedingung als 0 markiert werden. Das Bitset-Ergebnis sollte nun [1, 0, 1, 0, 0, 0, 0, 0]
lauten.
Wie in Datenlöschung beschrieben, werden Entitäten, die mit 1
markiert sind, bei einer Suche oder Abfrage ignoriert. Das Bitset-Ergebnis muss nun umgedreht werden, um mit der Lösch-Bitmap kombiniert zu werden, was uns [0, 1, 0, 1, 1, 1, 1, 1]
ergibt.
Wie bei der Lösch-Bitmap del_bitset
sollte der Anfangswert [0, 0, 0, 0, 0, 0, 1, 1]
sein. Die Entitäten 7 und 8 werden jedoch erst gelöscht, wenn ts
300 ist. Wenn ts
den Wert 150 hat, sind die Entitäten 7 und 8 daher noch gültig. Folglich ist der Wert von del_bitset
nach der Zeitreise [0, 0, 0, 0, 0, 0, 0, 0]
.
Jetzt haben wir zwei Bitsets nach der Zeitreise und der Attributfilterung: filter_bitset
[0, 1, 0, 1, 1, 1, 1, 1]
und del_bitset
[0, 0, 0, 0, 0, 0, 0, 0]
. Kombinieren Sie diese beiden Bitsätze mit dem binären Logikoperator OR
. Der endgültige Wert von result_bitset ist [0, 1, 0, 1, 1, 1, 1, 1]
, was bedeutet, dass nur die Entitäten 1 und 3 in der folgenden Such- oder Abfragephase berechnet werden.
Abbildung 1. Suche mit Zeitreise = 150.
Fall zwei
In diesem Fall setzt der Benutzer time_travel
auf 250. Der Prozess der Bitset-Generierung ist in Abbildung 2 dargestellt.
Wie im ersten Fall ist die anfängliche filter_bitset
gleich [1, 0, 1, 0, 1, 0, 1, 0]
.
Alle Entitäten befinden sich in der Vektordatenbank, wenn ts
= 250 ist. Daher bleibt filter_bitset
gleich, wenn wir den Zeitstempel mit einbeziehen. Auch hier müssen wir das Ergebnis umdrehen und erhalten [0, 1, 0, 1, 0, 1, 0, 1]
.
Für die Lösch-Bitmenge del_bitset
ist der Anfangswert [0, 0, 0, 0, 0, 0, 1, 1]
. Die Entitäten 7 und 8 wurden jedoch erst gelöscht, als ts
300 war. Wenn ts
den Wert 250 hat, sind die Entitäten 7 und 8 daher noch gültig. Daraus ergibt sich, dass del_bitset
nach der Zeitreise [0, 0, 0, 0, 0, 0, 0, 0]
ist.
Jetzt haben wir zwei Bitsets nach der Zeitreise und der Attributfilterung: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1]
und del_bitset
[0, 0, 0, 0, 0, 0, 0, 0]
. Kombinieren Sie diese beiden Bitsätze mit dem binären Logikoperator OR
. Die Ergebnis-Bitmenge ist [0, 1, 0, 1, 0, 1, 0, 1]
. Das bedeutet, dass in der folgenden Such- oder Abfragestufe nur die Entitäten [1, 3, 5, 7] berechnet werden.
Abbildung 2. Suche mit Zeitreise = 250.
Fall drei
In diesem Fall setzt der Benutzer time_travel
auf 350. Der Prozess der Bitset-Generierung ist in Abbildung 3 dargestellt.
Wie in den vorherigen Fällen ist die anfängliche filter_bitset
gleich [0, 1, 0, 1, 0, 1, 0, 1]
.
Wenn ts
= 350 ist, befinden sich alle Entitäten in der Vektordatenbank. Daher ist die endgültige, umgedrehte filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1]
, genau wie im zweiten Fall.
Was die Lösch-Bitmenge del_bitset
betrifft, so sind die Entitäten 7 und 8 bereits bei ts = 350
gelöscht worden, so dass das Ergebnis von del_bitset
[0, 0, 0, 0, 0, 0, 1, 1]
ist.
Nun haben wir zwei Bitsets nach Time Travel und Attributfilterung: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1]
und del_bitset
[0, 0, 0, 0, 0, 0, 1, 1]
. Kombinieren Sie diese beiden Bitsätze mit dem binären Logikoperator OR
. Das ultimative result_bitset
ist [0, 1, 0, 1, 0, 1, 1, 1]
. Das bedeutet, dass in der folgenden Such- oder Abfragestufe nur die Entitäten [1, 3, 5] berechnet werden.
Abbildung 3. Suche mit Zeitreise = 350.
Was kommt als Nächstes?
Jetzt, wo Sie wissen, wie Bitsets in Milvus funktionieren, möchten Sie vielleicht auch:
- Lernen Sie, wie Sie Ihre Suchergebnisse mit Hilfe von Strings filtern können, oder lesen Sie den Abschnitt Hybrid Search in unseren Dokumentationen.
- Verstehen, wie Daten in Milvus verarbeitet werden.