milvus-logo
LFAI
Home
  • Konzepte

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_keyjeweils [1, 2, 3, 4] sind, werden eingefügt, wenn der Zeitstempel ts gleich 100 ist.
  • Die restlichen vier Entitäten, deren primary_keys [5, 6, 7, 8] lauten, werden eingefügt, wenn der Zeitstempel ts gleich 200 ist.
  • Entitäten, deren primary_keys [7, 8] sind, werden gelöscht, wenn der Zeitstempel ts gleich 300 ist.
  • Nur Entitäten, deren primary_keys [1, 3, 5, 7] sind, erfüllen die Bedingungen der Attributfilterung.

Order of DML events 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.

Figure 1. Search with Time Travel = 150. 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.

Figure 2. Search with Time Travel = 250. 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.

Figure 3. Search with Time Travel = 350. 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:

Übersetzt vonDeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

War diese Seite hilfreich?