milvus-logo
LFAI
Home
  • Konzepte

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.

Attribute filtering in a segment 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.

DatentypAutomatischer Indizierungsalgorithmus
VARCHARInvertierter Index
INT8Invertierter Index
INT16Invertierter Index
INT32Invertierter Index
INT64Invertierter Index
FLOATInvertierter Index
DOUBLEInvertierter 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.

Inverted index diagram 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

    DatentypSpeicherschätzungsfunktion (MB)
    INT8numOfRows * 12 / 1024 / 1024
    INT16AnzahlZeilen * 12 / 1024 / 1024
    INT32AnzahlZeilen * 12 / 1024 / 1024
    INT64AnzahlZeilen * 24 / 1024 / 1024
    FLOAT32AnzahlZeile * 12 / 1024 / 1024
    DOUBLEAnzahlZeilen * 24 / 1024 / 1024
  • String-Felder

    Länge der ZeichenketteSpeicherschä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?

Ü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?