Index

Ein Schlüsselfeature von Qdrant ist die effektive Kombination von Vektorindex und traditionellem Index. Dies ist entscheidend, weil allein ein Vektorindex nicht ausreicht, um eine effiziente Vektorsuche unter Filterbedingungen zu ermöglichen. Vereinfacht ausgedrückt beschleunigt der Vektorindex die Vektorsuche, während der Payload-Index das Filtern beschleunigt.

Der Index innerhalb eines Absatzes existiert unabhängig, aber die Parameter des Index selbst sind für die gesamte Menge konfiguriert.

Nicht alle Absätze haben automatisch Indizes. Dies hängt von den Anforderungen der Optimierungseinstellungen ab und hängt in der Regel von der Anzahl der gespeicherten Punkte ab.

Payload-Index

Der Payload-Index in Qdrant ähnelt dem Index in einer traditionellen dokumentenorientierten Datenbank. Dieser Index wird für spezifische Felder und Typen erstellt, um Punkte schnell anhand entsprechender Filterbedingungen abzurufen.

Er wird auch verwendet, um die Kardinalität von Filterbedingungen genau zu schätzen, was dem Abfrageplaner bei der Auswahl von Suchstrategien hilft.

Die Erstellung eines Index erfordert zusätzliche Rechenressourcen und Speicher, daher ist es entscheidend, sorgfältig die Felder auszuwählen, die indiziert werden sollen. Qdrant trifft diese Auswahl nicht für Sie, sondern überlässt sie dem Benutzer.

Um ein Feld als indizierbar zu kennzeichnen, kann die folgende Methode verwendet werden:

PUT /collections/{collection_name}/index

{
    "field_name": "Name des zu indexierenden Feldes",
    "field_schema": "keyword"
}

Verfügbare Feldtypen sind:

  • keyword - für Schlüsselpayload, die Übereinstimmungsfilterbedingungen beeinflusst.
  • integer - für ganze Zahlenpayload, die Übereinstimmungs- und Bereichsfilterbedingungen beeinflusst.
  • float - für Fließkommazahlen-Payload, die Bereichsfilterbedingungen beeinflusst.
  • bool - für boolesche Payload, die Übereinstimmungsfilterbedingungen beeinflusst (verfügbar ab Version 1.4.0).
  • geo - für geografische Payload, die geografische Begrenzungsrahmen- und geografische Radiusfilterbedingungen beeinflusst.
  • text - ein spezieller Indextyp für Schlüssel-/String-Payload, der Volltextsuchfilterbedingungen beeinflusst.

Payload-Indizes können zusätzlichen Speicher verbrauchen, daher wird empfohlen, nur Felder zu indizieren, die in Filterbedingungen verwendet werden. Wenn Sie basierend auf vielen Feldern filtern müssen und Speicherbeschränkungen nicht zulassen, dass alle von ihnen indiziert werden, ist es ratsam, die Felder auszuwählen, die die Suchergebnisse am stärksten einschränken. Im Allgemeinen gilt: Je mehr ein Payload-Wert eindeutige Werte hat, desto effektiver wird der Index verwendet.

Volltextindex

Verfügbar ab Version 0.10.0

Qdrant unterstützt die Volltextsuche für String-Payloads. Der Volltextindex ermöglicht das Filtern von Punkten anhand des Vorhandenseins von Wörtern oder Phrasen im Payload-Feld.

Die Konfiguration eines Volltextindex ist etwas komplex, da Sie Tokenisierungsparameter angeben können. Tokenisierung ist der Prozess, bei dem ein String in Token aufgeteilt und diese Token dann in einen invertierten Index indiziert werden.

Um einen Volltextindex zu erstellen, können Sie die folgende Methode verwenden:

PUT /collections/{collection_name}/index

{
    "field_name": "Feldname zum Indexieren",
    "field_schema": {
        "type": "text",
        "tokenizer": "word",
        "min_token_len": 2,
        "max_token_len": 20,
        "lowercase": true
    }
}

Die verfügbaren Tokenisierungsmethoden sind:

  • word - Trennt den String anhand von Leerzeichen, Interpunktion und Sonderzeichen.
  • whitespace - Trennt den String anhand von Leerzeichen.
  • prefix - Trennt den String anhand von Leerzeichen, Interpunktion und Sonderzeichen und erstellt dann einen Präfixindex für jedes Wort. Zum Beispiel wird hello indexiert als h, he, hel, hell, hello.
  • multilingual - Eine spezielle Art der Tokenisierung basierend auf dem charabia-Paket. Es ermöglicht die korrekte Tokenisierung und Lemmatisierung mehrerer Sprachen, einschließlich Sprachen mit nichtlateinischen Alphabeten und Nicht-Leerzeittrennern. Siehe die charabia-Dokumentation für eine vollständige Liste der unterstützten Sprachen und Normalisierungsoptionen. In der Standardkonfiguration von Qdrant ist nicht Unterstützung für alle Sprachen enthalten, da dies die Größe der Binärdateien erhöhen würde. Chinesisch, Japanisch und Koreanisch sind standardmäßig nicht aktiviert, können jedoch durch Erstellen von Qdrant aus dem Quellcode mit den --features multiling-chinese, multiling-japanese, multiling-korean-Flags aktiviert werden.

Bitte beachten Sie die Beispiele für Volltextübereinstimmungen für die Verwendung eines Volltextindex für Abfragen.

Vektorindexierung

Die Vektorindexierung ist eine Datenstruktur, die auf Vektoren basiert und durch spezifische mathematische Modelle konstruiert wird. Mit der Vektorindexierung können wir effizient mehrere Vektoren abfragen, die dem Zielvektor ähnlich sind.

Derzeit verwendet Qdrant nur HNSW als Vektorindex.

HNSW (Hierarchical Navigable Small World Graph) ist ein auf Graphen basierender Indexierungsalgorithmus. Gemäß bestimmter Regeln konstruiert er eine mehrschichtige Navigationsstruktur für den Graphen. In dieser Struktur sind die oberen Schichten dünn besiedelt, mit größeren Entfernungen zwischen den Knoten. Die unteren Schichten hingegen sind dichter besiedelt, mit kleineren Entfernungen zwischen den Knoten. Die Suche beginnt in der obersten Schicht, findet den dem Ziel am nächsten gelegenen Knoten in dieser Schicht und geht dann zur nächsten Schicht für eine weitere Suche über. Nach mehreren Iterationen kann sie schnell die Zielposition erreichen.

Für eine Leistungsverbesserung begrenzt HNSW den maximalen Grad der Knoten auf jeder Ebene des Graphen auf m. Zusätzlich können Sie den Suchbereich mit ef_construct (bei der Indexkonstruktion) oder ef (beim Suchen des Ziels) angeben.

Diese Parameter können in der Konfigurationsdatei konfiguriert werden:

storage:
  hnsw_index:
    m: 16
    ef_construct: 100
    full_scan_threshold: 10000

Während des Sammlungserstellungsprozesses kann der ef-Parameter konfiguriert werden und ist standardmäßig gleich ef_construct.

HNSW wurde aus mehreren Gründen ausgewählt. Erstens ist HNSW sehr gut geeignet, um Qdrant die Änderung von Filtern während des Suchprozesses zu ermöglichen. Zweitens ist er gemäß öffentlichen Benchmark-Tests einer der genauesten und schnellsten Algorithmen.

Verfügbar ab v1.1.1

HNSW-Parameter können auch für Sammlungen und benannte Vektoren feinabgestimmt werden, um die Suchleistung durch Festlegen von hnsw_config zu optimieren.

Filterbarer Index

Separate Payload-Indizes und alleinige Vektorindizes können nicht vollständig auf die Verwendung von Filtern für die Suche eingehen.

In Fällen, in denen die Filter schwach sind, kann der HNSW-Index direkt verwendet werden. Bei strengen Filtern kann der Payload-Index verwendet und vollständig neu bewertet werden. Jedoch ist dieser Ansatz in mittleren Fällen ineffektiv.

Einerseits können wir es uns nicht leisten, eine Vollscan-Suche bei zu vielen Vektoren durchzuführen. Andererseits beginnt der HNSW-Graph beim Einsatz von übermäßig strengen Filtern zu zerfallen.

Zusätzliche Kanten ermöglichen es Ihnen, den HNSW-Index effizient zu verwenden, um benachbarte Vektoren zu suchen und Filter anzuwenden, während Sie im Graphen suchen.

Dieser Ansatz minimiert den Overhead von Bedingungsprüfungen, da Sie Bedingungen nur für einen kleinen Teil der an der Suche beteiligten Punkte berechnen müssen.