Wie Bitset die Vielseitigkeit der Vektorähnlichkeitssuche ermöglicht
Bitset Titelbild
Von Yudong Cai und Angela Ni.
Mit der Veröffentlichung von Milvus 2.0 werden verschiedene neue wesentliche Funktionen einer Vektordatenbank bereitgestellt. Unter den neuen Funktionen sind Zeitreisen, Attributfilterung und Löschvorgänge miteinander verbunden, da diese drei Funktionen durch einen gemeinsamen Mechanismus erreicht werden - Bitset.
In diesem Artikel soll daher das Konzept des Bitsets in Milvus erläutert werden und anhand von drei Beispielen erklärt werden, wie es funktioniert, um Löschvorgänge, Time Travel und Attributfilterung zu unterstützen.
Was ist ein Bitset?
Ein Bitset ist ein Array von Bitzahlen ("0" und "1"), die zur Darstellung bestimmter Dateninformationen verwendet werden können. Mit Bitsets können Sie bestimmte Datentypen kompakt und effizient speichern, anstatt sie in Ints, Floats oder Chars zu speichern. Bitsets basieren auf der booleschen Logik, nach der der Wert einer Ausgabe entweder gültig oder ungültig ist, was in der Regel mit "1" bzw. "0" angegeben wird. Eine "1" steht für gültig und eine "0" für ungültig. Da Bitsets sehr effizient sind und Speicherplatz sparen, können sie auch für viele Funktionen wie Attributfilterung, Löschoperationen, Zeitreisen und mehr verwendet werden.
Ab Version 0.7.0 wurde das Konzept des Bitsets in Milvus eingeführt, um die Löschfunktion zu ermöglichen. Genauer gesagt wird Bitset verwendet, um zu markieren, ob jede Zeile im Segment gelöscht ist. Gelöschte Entitäten werden im entsprechenden Bitset mit "1" markiert, und als Ergebnis werden die gelöschten Entitäten bei einer Suche oder Abfrage nicht berechnet.
In der Version Milvus 2.0 wurde die Anwendung von Bitset erweitert, um weitere Funktionen wie Attributfilterung und Zeitreisen zu ermöglichen. Das allgemeine Prinzip in einem Bitset bleibt das gleiche. Das heißt, wenn eine Entität im entsprechenden Bitset mit "1" markiert ist, wird die Entität bei einer Suche oder Abfrage ignoriert. Bitsets werden verwendet, um 3 Funktionen in Milvus zu aktivieren:
- Filterung von Attributen
- Löschung von Daten
- Abfrage mit Zeitreise
Wie funktioniert das Bitset in Milvus?
Die folgenden Beispiele zeigen, wie Bitset in Milvus funktioniert.
Voraussetzungen
Angenommen, es gibt ein Segment mit acht Entitäten und eine Reihe von DML-Ereignissen (Data Manipulation Language) findet in der Reihenfolge statt, die in der folgenden Abbildung dargestellt ist.
- Vier der Entitäten, deren
primary_keys
jeweils [1, 2, 3, 4] lautet, werden eingefügt, wenn der Zeitstempelts
gleich 100 ist. - Die restlichen vier Entitäten, deren
primary_keys
[5, 6, 7, 8] lautet, werden eingefügt, wenn der Zeitstempelts
gleich 200 ist. - Entitäten, deren
primary_keys
gleich [7, 8] ist, werden gelöscht, wenn der Zeitstempelts
gleich 300 ist. - Nur Entitäten, deren
primary_keys
[1, 3, 5, 7] ist, erfüllen die Bedingungen der Attributfilterung.
DML-Ereignisse
Erster Fall
Angenommen, der Wert, den ein Benutzer für time_travel
setzt, ist 150. Mit anderen Worten: Der Benutzer führt eine Abfrage auf die in Milvus gespeicherten Daten durch, wenn ts
= 150 ist. Der Prozess der Bitset-Generierung ist in Abbildung 1 dargestellt.
Während der anfänglichen Filterungsphase sollte das Ergebnis von filter_bitset
[1, 0, 1, 0, 1, 0, 1, 0] lauten, da die Entitäten [1, 3, 5, 7] gültige Filterungsergebnisse sind und in der Bitmenge als "1" markiert sind. Die Entitäten [4, 5, 6, 7] wurden jedoch nicht einmal in die Vektordatenbank aufgenommen, wenn ts
gleich 150 ist. Daher sollten diese vier Entitäten unabhängig von der Filterungsbedingung als "0" markiert werden. Das Ergebnis der Bitmenge sollte nun [1, 0, 1, 0, 0, 0, 0, 0, 0] sein. Da in Milvus das allgemeine Prinzip der Bitset-Berechnung darin besteht, dass Entitäten, die im Bitset mit "1" markiert sind, während einer Suche oder Abfrage ignoriert werden, muss das Bitset-Ergebnis nach der Zeitreise- und Attributfilterung umgedreht werden, um mit der Lösch-Bitmap kombiniert werden zu können. Das gespiegelte Ergebnis von filter_bitset
sollte [0, 1, 0, 1, 1, 1, 1, 1] sein.
Für die Lösch-Bitmap del_bitset
sollte der Ausgangswert [0, 0, 0, 0, 0, 0, 1, 1] lauten. 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 sollte der Wert von del_bitset
nach der Zeitreise [0, 0, 0, 0, 0, 0, 0, 0, 0] sein.
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, 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]. Das bedeutet, dass in der folgenden Such- oder Abfragestufe nur die Entitäten 1 und 3 berechnet werden.
Abbildung 1
Fall zwei
Angenommen, der Wert, den der Benutzer für time_travel
einstellt, ist 250. Mit anderen Worten: Der Benutzer führt eine Abfrage der in Milvus gespeicherten Daten durch, wenn ts
= 250 ist. Der Prozess der Bitset-Generierung ist in Abbildung 2 dargestellt.
Wie im ersten Fall sollte das Ergebnis filter_bitset
der anfänglichen Attributfilterung [1, 0, 1, 0, 1, 0, 1, 0, 1, 0] sein.
Alle Entitäten [1, 2, 3, 4, 5, 6, 7, 8] werden in die Vektordatenbank eingefügt, wenn ts
= 250. Daher bleibt das vorherige Ergebnis von filter_bitset
unverändert. Wiederum müssen wir das Ergebnis von filter_bitset
umdrehen und erhalten [0, 1, 0, 1, 0, 1, 0, 1, 0, 1].
Für die Löschungs-Bitmenge del_bitset
sollte der Anfangswert [0, 0, 0, 0, 0, 0, 1, 1] sein. Die Entitäten 7 und 8 wurden jedoch erst gelöscht, als ts
300 war. Wenn ts
250 ist, sind die Entitäten 7 und 8 daher noch gültig. Folglich sollte der del_bitset
Wert nach der Zeitreise [0, 0, 0, 0, 0, 0, 0, 0, 0] sein.
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, 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, 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
Fall drei
Angenommen, der Wert, den der Benutzer für time_travel
einstellt, ist 350. Mit anderen Worten: Der Benutzer führt eine Abfrage der in Milvus gespeicherten Daten durch, wenn ts
= 350 ist. Der Prozess der Bitset-Generierung ist in Abbildung 3 dargestellt.
Wie in den Fällen eins und zwei lautet das Ergebnis filter_bitset
der anfänglichen Attributfilterungsphase [0, 1, 0, 1, 0, 1, 0, 1].
Alle Entitäten [1, 2, 3, 4, 5, 6, 7, 8] werden in die Vektordatenbank eingefügt, wenn ts
= 350. Das endgültige Ergebnis der filter_bitset
ist also [0, 1, 0, 1, 0, 1, 0, 1], genau wie im zweiten Fall.
del_bitset
Da die Entitäten 7 und 8 bereits gelöscht sind, wenn ts
= 350 ist, sollte das Ergebnis von del_bitset
[0, 0, 0, 0, 0, 0, 1, 1] sein.
Jetzt 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, 0, 1, 1]. Kombinieren Sie diese beiden Bitsets mit dem binären Logikoperator "OR". Der endgültige Wert von result_bitset
ist [0, 1, 0, 1, 0, 1, 1, 1]. Das bedeutet, dass in der folgenden Such- oder Abfragephase nur die Entitäten [1, 3, 5] berechnet werden.
Abbildung 3
Was kommt als Nächstes?
In der Blogserie zu den neuen Funktionen 2.0 möchten wir Ihnen das Design der neuen Funktionen erklären. Lesen Sie mehr in dieser Blogserie!
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word