Gefilterte Vektorsuche in AlloyDB Omni – Übersicht

Wählen Sie eine Dokumentenversion aus:

Auf dieser Seite erhalten Sie einen Überblick über die gefilterte Vektorsuche in AlloyDB Omni.

Eine gefilterte Vektorsuche besteht aus einem Anfragevektor und einem Filter für ein bestimmtes Feld. AlloyDB Omni nutzt die umfangreichen Abfragefunktionen von PostgreSQL, sodass Sie Vektorsuchen durchführen und sowohl strukturierte als auch unstrukturierte Daten über eine einzige SQL-Schnittstelle abfragen können.

Filteroptionen

Der AlloyDB Omni-Abfrageoptimierer spielt eine entscheidende Rolle bei der Ermittlung der effizientesten Filterstrategie für Ihre Vektorsuche.

Um die Kosten verschiedener Ausführungspläne zu schätzen, analysiert das Abfrageoptimierungstool Ihre Abfrage und berücksichtigt Faktoren wie Filterselektivität, Datenverteilung und Indexverfügbarkeit.

Anhand der Kostenschätzung wählt der Optimierer eine optimale Filterstrategie aus den folgenden Optionen aus:

Vorfilterung

Die Vorfilterung ist eine Strategie zur Abfrageoptimierung, bei der AlloyDB Omni Ihre Filter verwendet, um eine kleinere Gruppe von Elementen zu finden, die Ihren Kriterien entsprechen, anstatt den gesamten Datensatz zu durchsuchen. Anschließend wird die Vektorsuche in AlloyDB Omni für diese kleinere Gruppe ausgeführt.

Wenn Sie beispielsweise nach ähnlichen blauen Hemden suchen, findet AlloyDB Omni zuerst alle blauen Hemden und sucht dann innerhalb dieser Gruppe nach ähnlichen Elementen.

Diese Strategie verbessert die Leistung, da die rechenintensive Suche nach Vektorähnlichkeit für einen reduzierten Datensatz ausgeführt wird.

Nachfilterung

Die Nachfilterung ist eine Strategie, die von AlloyDB Omni verwendet wird, wenn Ihre Filter die Ergebnisse nicht wesentlich eingrenzen. Anstatt zuerst zu filtern, sucht AlloyDB Omni zuerst nach einer breiten Liste ähnlicher Elemente basierend auf Ihrer Vektorsuche. Anschließend werden die Ergebnisse mit Ihren Filterbedingungen abgeglichen, um die endgültige Liste zu erstellen.

Wenn Sie beispielsweise nach ähnlichen Filmen suchen und einen sehr allgemeinen Filter wie genre = drama haben, findet AlloyDB Omni zuerst eine große Anzahl von Filmen, die Ihrer Suche ähneln, und filtert sie dann nach Genre, da die meisten Filme möglicherweise Dramen sind.

Diese Strategie ist effizient, wenn Sie erwarten, dass viele Ergebnisse Ihrem Filter entsprechen.

Inline-Filterung

Die Inline-Filterung ist eine Strategie zur Abfrageoptimierung, bei der AlloyDB Omni sowohl Vektor- als auch andere sekundäre Indexe verwendet, um die Vektorsuche und die Filterauswertung gleichzeitig durchzuführen. AlloyDB Omni durchsucht den Vektorindex nach ähnlichen Vektoren und prüft auch, ob jeder Vektor den Bedingungen Ihres Metadatenfilters entspricht. Dabei werden Indexe wie B-trees, GIN oder GiST verwendet, um diese Bedingungen schnell auszuwerten.

Wenn Sie beispielsweise nach ähnlichen Schuhen suchen und nach color = black filtern, werden bei der Inline-Filterung nur die Ähnlichkeiten von Schuhen geprüft, die ohnehin schwarz sind. Das ist effizienter, als die Ähnlichkeit aller Schuhe zu prüfen und dann nach Farbe zu filtern oder alle Schuhe nach Farbe zu filtern und dann auf Ähnlichkeit zu prüfen.

Inline-Filter eignen sich am besten, wenn die Ergebnisse nur mäßig eingegrenzt werden können.

Abfragepläne verstehen

Ein Abfrageplan bietet einen umfassenden Überblick über den Prozess der Abfrageausführung und zeigt im Feld Ausführungsstrategie, welche Filterstrategie AlloyDB Omni für den Vektorscanvorgang auswählt.

Ein Abfrageplan für die Inline-Filterung

Für die Inline-Filterung verwendet AlloyDB Omni einen Planknoten für benutzerdefinierte Scans, auch als Vektorscan bezeichnet, der auf einem Planknoten für Bitmap-Index-Scans basiert, um die Bitmap für die Filterklauseln bereitzustellen.

Beim Vektorscan werden Distanzen nur für Zeilen berechnet, die die Filterkriterien erfüllen.

Die folgende Abfrage zeigt die Inline-Filterung für eine shoes-Suche, die nach color = black gefiltert wird.

EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;

Das folgende Beispiel für einen Abfrageplan zeigt eine optimierte Vektorsuche mit Inline-Filterung:

Limit (actual rows=10)
  ->  Custom Scan (vector scan) on products
      Execution Strategy: Bitmap assisted vector Scan on products_embedding_index
      Order By: (embedding <=> '[...]')::vector)
      Limit: 10
      ->  Bitmap Index Scan on products (color_index)
          Index Cond: (color = 'black')

Im Beispielabfrageplan zeigt Limit (actual rows=10), dass die Abfrage die SQL-Anweisung LIMIT 10; verwendet hat, um die Ausgabe einzuschränken. actual rows=10 bedeutet, dass dieser Knoten während der Abfrageausführung 10 Zeilen zurückgegeben hat.

Der Knoten -> Custom Scan (vector scan) on products stellt einen Vektorsuchvorgang dar. Es handelt sich um einen benutzerdefinierten Scan, da es sich um einen speziellen Scan für Vektordaten handelt, der für die Tabelle products ausgeführt wird. Im Beispielabfrageplan für die Inline-Filterung wird Bitmap assisted vector Scan on products_embedding_index im Feld Ausführungsstrategie angezeigt. Das bedeutet, dass beim Vektorscan die Bitmap verwendet wird, um eine Liste mit Zeilen zu erstellen, für die eine Suche nach Ähnlichkeiten durchgeführt werden muss. Der Bitmap-Indexscan wird verwendet, um die Daten anhand der color = 'black'-Bedingung zu filtern.

Das Attribut Order By: (embedding <=> '[...]')::vector gibt an, dass die Ergebnisse anhand der Vektorähnlichkeit sortiert werden, die mit dem Ausdruck (embedding <=> '[...]')::vector berechnet wird. Dabei bezieht sich embedding auf die Vektorspalte, <=> auf den Operator für den nächsten Nachbarn, [...] auf den Anfragevektor und ::vector auf die Typumwandlung in den Vektordatentyp.

Der Knoten -> Bitmap Index Scan on products (color_index) stellt einen Bitmap-Indexscan für colors_index dar. Bei einem Bitmap-Indexscan werden Zeilen, die der Filterbedingung entsprechen, mithilfe einer Bitmap ausgewählt und color_index zum Filtern verwendet.

Das Attribut Index Cond: (color = 'black') gibt die Filterbedingung an, die vom color = 'black'-Indexscan aus der WHERE-Anweisung der Abfrage verwendet wird.

Nächste Schritte