BITMAP
Die Bitmap-Indizierung ist eine effiziente Indizierungstechnik zur Verbesserung der Abfrageleistung bei skalaren Feldern mit geringer Kardinalität. Kardinalität bezieht sich auf die Anzahl der eindeutigen Werte in einem Feld. Felder mit weniger eindeutigen Elementen werden als Felder mit geringer Kardinalität betrachtet.
Dieser Indextyp trägt dazu bei, die Abrufzeit skalarer Abfragen zu verringern, indem er Feldwerte in einem kompakten Binärformat darstellt und effiziente bitweise Operationen mit ihnen durchführt. Im Vergleich zu anderen Indextypen haben Bitmap-Indizes in der Regel eine höhere Speichereffizienz und schnellere Abfragegeschwindigkeiten, wenn es sich um Felder mit geringer Kardinalität handelt.
Überblick
Der Begriff Bitmap setzt sich aus zwei Wörtern zusammen: Bit und Map. Ein Bit stellt die kleinste Dateneinheit in einem Computer dar, die nur einen Wert von 0 oder 1 annehmen kann. Eine Map bezieht sich in diesem Zusammenhang auf den Prozess der Umwandlung und Organisation von Daten entsprechend dem Wert, der 0 und 1 zugewiesen werden soll.
Ein Bitmap-Index besteht aus zwei Hauptkomponenten: Bitmaps und Schlüssel. Die Schlüssel stellen die eindeutigen Werte im indizierten Feld dar. Für jeden eindeutigen Wert gibt es eine entsprechende Bitmap. Die Länge dieser Bitmaps ist gleich der Anzahl der Datensätze in der Sammlung. Jedes Bit in der Bitmap entspricht einem Datensatz in der Sammlung. Wenn der Wert des indizierten Feldes in einem Datensatz mit dem Schlüssel übereinstimmt, wird das entsprechende Bit auf 1 gesetzt; andernfalls wird es auf 0 gesetzt.
Betrachten wir eine Sammlung von Dokumenten mit den Feldern Kategorie und Öffentlich. Wir möchten Dokumente abrufen, die in die Kategorie Technik fallen und für die Öffentlichkeit zugänglich sind. In diesem Fall sind die Schlüssel für unsere Bitmap-Indizes Tech und Public.
Bitmap-Indizierung
Wie in der Abbildung zu sehen ist, lauten die Bitmap-Indizes für Category und Public.
Tech: [1, 0, 1, 0, 0], was zeigt, dass nur das erste und dritte Dokument in die Kategorie Tech fallen.
Public: [1, 0, 0, 1, 0], was bedeutet, dass nur das erste und das vierte Dokument öffentlich zugänglich sind.
Um die Dokumente zu finden, die beiden Kriterien entsprechen, führen wir eine bitweise UND-Verknüpfung dieser beiden Bitmaps durch.
- Tech AND Public: [1, 0, 0, 0, 0]
Die resultierende Bitmap [1, 0, 0, 0, 0] zeigt an, dass nur das erste Dokument(ID 1) beide Kriterien erfüllt. Durch die Verwendung von Bitmap-Indizes und effizienten bitweisen Operationen können wir den Suchbereich schnell eingrenzen und müssen nicht den gesamten Datensatz durchsuchen.
Erstellen eines Bitmap-Index
Um einen Bitmap-Index in Milvus zu erstellen, verwenden Sie die Methode create_index()
und setzen den Parameter index_type
auf "BITMAP"
.
from pymilvus import MilvusClient
index_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters
index_params.add_index(
field_name="category", # Name of the scalar field to be indexed
index_type="BITMAP", # Type of index to be created
index_name="category_bitmap_index" # Name of the index to be created
)
client.create_index(
collection_name="my_collection", # Specify the collection name
index_params=index_params
)
In diesem Beispiel erstellen wir einen Bitmap-Index für das Feld category
der Sammlung my_collection
. Die Methode add_index()
wird verwendet, um den Feldnamen, den Indextyp und den Indexnamen anzugeben.
Sobald der Bitmap-Index erstellt ist, können Sie den Parameter filter
in Abfrageoperationen verwenden, um eine skalare Filterung auf der Grundlage des indizierten Feldes durchzuführen. Auf diese Weise können Sie die Suchergebnisse mithilfe des Bitmap-Indexes effizient eingrenzen. Weitere Informationen finden Sie unter Metadatenfilterung.
Begrenzungen
Bitmap-Indizes werden nur für skalare Felder unterstützt, die keine Primärschlüssel sind.
Der Datentyp des Felds muss einer der folgenden sein.
BOOL
,INT8
,INT16
,INT32
,INT64
,VARCHAR
ARRAY
(die Elemente müssen eines der folgenden sein:BOOL
,INT8
,INT16
,INT32
,INT64
,VARCHAR
)
Bitmap-Indizes unterstützen die folgenden Datentypen nicht.
FLOAT
DOUBLE
: Fließkomma-Typen sind nicht mit der binären Natur von Bitmap-Indizes kompatibel.JSON
: JSON-Datentypen haben eine komplexe Struktur, die mit Bitmap-Indizes nicht effizient dargestellt werden kann.
Bitmap-Indizes sind nicht für Felder mit hoher Kardinalität geeignet (d. h. Felder mit einer großen Anzahl unterschiedlicher Werte).
Als allgemeine Richtlinie gilt, dass Bitmap-Indizes am effektivsten sind, wenn die Kardinalität eines Feldes weniger als 500 beträgt.
Wenn die Kardinalität über diesen Schwellenwert hinausgeht, nehmen die Leistungsvorteile von Bitmap-Indizes ab, und der Speicher-Overhead wird erheblich.
Für Felder mit hoher Kardinalität sollten Sie je nach Anwendungsfall und Abfrageanforderungen alternative Indizierungstechniken wie z. B. invertierte Indizes in Betracht ziehen.