Skalarer Index
Milvus unterstützt gefilterte Suchen, die sowohl skalare als auch vektorielle Felder kombinieren. Um die Effizienz der Suche nach skalaren Feldern zu verbessern, hat Milvus ab Version 2.1.0 die Skalarfeldindizierung eingeführt. Dieser Artikel gibt einen Überblick über die Skalarfeld-Indizierung in Milvus und hilft Ihnen, deren Bedeutung und Implementierung zu verstehen.
Überblick
Wenn Sie in Milvus eine Suche nach Vektorähnlichkeit durchführen, können Sie logische Operatoren verwenden, um skalare Felder in booleschen Ausdrücken zu organisieren.
Wenn Milvus eine Suchanfrage mit einem solchen booleschen Ausdruck erhält, parst es den booleschen Ausdruck in einen abstrakten Syntaxbaum (AST), um einen physischen Plan für die Attributfilterung zu erstellen. Milvus wendet dann den physischen Plan in jedem Segment an, um ein Bitset als Filterergebnis zu erzeugen, und schließt das Ergebnis als Vektorsuchparameter ein, um den Suchbereich einzugrenzen. In diesem Fall hängt die Geschwindigkeit der Vektorsuche stark von der Geschwindigkeit der Attributfilterung ab.
Attributfilterung in einem Segment
Die Skalarfeld-Indizierung ist eine Möglichkeit, die Geschwindigkeit der Attributfilterung zu gewährleisten, indem skalare Feldwerte auf eine bestimmte Weise sortiert werden, um den Informationsabruf zu beschleunigen.
Algorithmen zur Indizierung skalarer Felder
Milvus zielt darauf ab, mit seinen Skalarfeld-Indizierungsalgorithmen einen geringen Speicherverbrauch, eine hohe Filtereffizienz und eine kurze Ladezeit zu erreichen. Diese Algorithmen werden in zwei Haupttypen eingeteilt: automatische Indizierung und invertierte Indizierung.
Automatische Indizierung
Milvus bietet die Option AUTOINDEX
an, damit Sie nicht manuell einen Index-Typ auswählen müssen. Wenn die Methode create_index
aufgerufen wird und index_type
nicht angegeben ist, wählt Milvus automatisch den am besten geeigneten Indextyp auf der Grundlage des Datentyps aus.
In der folgenden Tabelle sind die von Milvus unterstützten Datentypen und die entsprechenden automatischen Indizierungsalgorithmen aufgeführt.
Datentyp | Automatischer Indizierungsalgorithmus |
---|---|
VARCHAR | Invertierter Index |
INT8 | Invertierter Index |
INT16 | Invertierter Index |
INT32 | Invertierter Index |
INT64 | Invertierter Index |
FLOAT | Invertierter Index |
DOUBLE | Invertierter Index |
Invertierte Indizierung
Die invertierte Indizierung bietet eine flexible Möglichkeit, einen Index für ein skalares Feld zu erstellen, indem Indexparameter manuell angegeben werden. Diese Methode eignet sich für verschiedene Szenarien, einschließlich Punktabfragen, Musterabgleichsabfragen, Volltextsuchen, JSON-Suchen, boolesche Suchen und sogar Präfixabgleichsabfragen.
Die in Milvus implementierten invertierten Indizes werden von Tantivy, einer Volltext-Suchmaschinenbibliothek, unterstützt. Tantivy sorgt dafür, dass die invertierte Indexierung in Milvus sowohl effizient als auch schnell ist.
Ein invertierter Index hat zwei Hauptkomponenten: ein Begriffswörterbuch und eine invertierte Liste. Das Begriffswörterbuch enthält alle tokenisierten Wörter in alphabetischer Reihenfolge, während die invertierte Liste die Liste der Dokumente enthält, in denen jedes Wort vorkommt. Mit diesem Aufbau sind Punkt- und Bereichsabfragen viel schneller und effizienter als Brute-Force-Suchen.
Diagramm des invertierten Index
Die Vorteile der Verwendung eines invertierten Indexes zeigen sich besonders bei den folgenden Operationen:
- Punktabfrage: Bei der Suche nach Dokumenten, die das Wort "Milvus" enthalten, wird zunächst geprüft, ob "Milvus" im Begriffswörterbuch vorhanden ist. Wenn es nicht gefunden wird, enthalten keine Dokumente das Wort. Wird es jedoch gefunden, wird die mit Milvus verknüpfte invertierte Liste abgerufen, in der die Dokumente aufgeführt sind, die das Wort enthalten. Diese Methode ist weitaus effizienter als eine rohe Suche durch eine Million Dokumente, da das sortierte Begriffswörterbuch die Zeitkomplexität beim Auffinden des Wortes Milvus erheblich reduziert.
- Bereichsabfrage: Die Effizienz von Bereichsabfragen, z. B. das Auffinden von Dokumenten mit Wörtern, die alphabetisch größer als very sind, wird ebenfalls durch das sortierte Begriffswörterbuch verbessert. Dieser Ansatz ist effizienter als eine Brute-Force-Suche und liefert schnellere und genauere Ergebnisse.
Testergebnisse
Um die Leistungsverbesserungen durch skalare Indizes in Milvus zu demonstrieren, wurde ein Experiment durchgeführt, bei dem die Leistung verschiedener Ausdrücke mit invertierter Indizierung und Brute-Force-Suche auf Rohdaten verglichen wurde.
Das Experiment umfasste das Testen verschiedener Ausdrücke unter zwei Bedingungen: mit einem invertierten Index und mit einer Brute-Force-Suche. Um die Fairness zu gewährleisten, wurde bei allen Tests die gleiche Datenverteilung beibehalten und jedes Mal dieselbe Sammlung verwendet. Vor jedem Test wurde die Sammlung freigegeben, der Index gelöscht und neu aufgebaut. Außerdem wurde vor jedem Test eine Warmabfrage durchgeführt, um die Auswirkungen kalter und heißer Daten zu minimieren, und jede Abfrage wurde mehrfach ausgeführt, um die Genauigkeit zu gewährleisten.
Bei einem Datensatz von 1 Million Datensätzen kann die Verwendung eines invertierten Index eine bis zu 30-fache Leistungssteigerung bei Punktabfragen bewirken. Bei größeren Datensätzen können die Leistungssteigerungen sogar noch deutlicher ausfallen.
Leistungsempfehlungen
Um die Fähigkeiten von Milvus bei der Indizierung von Skalarfeldern voll auszunutzen und die Leistung bei der Suche nach Vektorähnlichkeit zu entfesseln, benötigen Sie ein Modell, mit dem Sie die Größe des erforderlichen Speichers auf der Grundlage der vorhandenen Daten schätzen können.
In den folgenden Tabellen sind die Schätzungsfunktionen für alle von Milvus unterstützten Datentypen aufgeführt.
Numerische Felder
Datentyp Speicherschätzungsfunktion (MB) INT8 numOfRows * 12 / 1024 / 1024 INT16 AnzahlZeilen * 12 / 1024 / 1024 INT32 AnzahlZeilen * 12 / 1024 / 1024 INT64 AnzahlZeilen * 24 / 1024 / 1024 FLOAT32 AnzahlZeile * 12 / 1024 / 1024 DOUBLE AnzahlZeilen * 24 / 1024 / 1024 String-Felder
Länge der Zeichenkette Speicherschätzungsfunktion (MB) (0, 8] numOfRows * 128 / 1024 / 1024 (8, 16] numOfRows * 144 / 1024 / 1024 (16, 32] numOfRows * 160 / 1024 / 1024 (32, 64] numOfRows * 192 / 1024 / 1024 (64, 128] numOfRows * 256 / 1024 / 1024 (128, 65535] numOfRows * strLen * 1.5 / 1024 / 1024
Wie geht es weiter?
Um ein skalares Feld zu indizieren, lesen Sie Index auf Skalaren erstellen.
Um mehr über die oben erwähnten verwandten Begriffe und Regeln zu erfahren, lesen Sie