🚀 Testen Sie Zilliz Cloud, die vollständig verwaltete Milvus, kostenlos – erleben Sie 10x schnellere Leistung! Jetzt testen>>

milvus-logo
LFAI
  • Home
  • Blog
  • Wie Bitset die Vielseitigkeit der Vektorähnlichkeitssuche ermöglicht

Wie Bitset die Vielseitigkeit der Vektorähnlichkeitssuche ermöglicht

  • Engineering
February 14, 2022
Yudong Cai

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

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

Figure 1 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.

Figure 2 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_bitsetDa 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.

Figure 3 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 Started

Like the article? Spread the word

Weiterlesen