Auf dieser Seite finden Sie einen Überblick über die gefilterte Vektorsuche in AlloyDB for PostgreSQL.
Eine gefilterte Vektorsuche besteht aus einem Abfragevektor und einem Filter für ein bestimmtes Feld. AlloyDB nutzt die umfangreichen Abfragefunktionen von PostgreSQL, sodass Sie sowohl strukturierte als auch unstrukturierte Daten über eine einzige SQL-Schnittstelle vektorisieren und abfragen können.
Filteroptionen
Der AlloyDB-Abfrageoptimierer spielt eine entscheidende Rolle bei der Bestimmung 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 dabei Faktoren wie Filterselektion, Datenverteilung und Indexverfügbarkeit.
Basierend auf der Kostenschätzung wählt der Optimierer eine optimale Filterstrategie aus den folgenden Optionen aus:
Vorfilterung
Das Vorabfiltern ist eine Abfrageoptimierungsstrategie, bei der AlloyDB anhand Ihrer Filter eine kleinere Gruppe von Elementen findet, die Ihren Kriterien entsprechen, anstatt den gesamten Datensatz zu durchsuchen. Anschließend führt AlloyDB die Vektorsuche auf dieser kleineren Gruppe aus.
Wenn Sie beispielsweise nach ähnlichen blauen Hemden suchen, sucht AlloyDB zuerst nach allen blauen Hemden und dann nach ähnlichen Artikeln innerhalb dieser Gruppe.
Mit dieser Strategie wird die Leistung verbessert, da die rechenintensive Suche nach Ähnlichkeit von Vektoren auf einem reduzierten Datensatz ausgeführt wird.
Nachfilterung
Die Nachfilterung ist eine Strategie, die AlloyDB verwendet, wenn die Ergebnisse durch Ihre Filter nicht wesentlich eingegrenzt werden. Anstatt zuerst zu filtern, ermittelt AlloyDB anhand Ihrer Vektorsuche eine umfassende Liste ähnlicher Elemente. Anschließend werden die Ergebnisse anhand Ihrer Filterbedingungen geprüft, um die endgültige Liste zu generieren.
Wenn Sie beispielsweise nach ähnlichen Filmen suchen und einen sehr breiten Filter wie genre = drama
verwenden, findet AlloyDB zuerst eine große Anzahl von Filmen, die Ihrer Suche ähneln, und filtert sie dann nach Genre, da die meisten Filme Dramen sein könnten.
Diese Strategie ist effizient, wenn Sie davon ausgehen, dass viele Ergebnisse Ihren Filtern entsprechen.
Inline-Filterung
Der Inline-Filter ist eine Abfrageoptimierungsstrategie, bei der AlloyDB sowohl Vektor- als auch andere sekundäre Indexe verwendet, um Vektorsuche und Filterbewertung gleichzeitig durchzuführen. AlloyDB durchsucht den Vektorindex, um ähnliche Vektoren zu finden, und prüft auch, ob jeder Vektor mit Ihren Metadatenfilterbedingungen übereinstimmt. Dabei werden Indexe wie B-Bäume, GIN oder GiST für eine schnelle Auswertung dieser Bedingungen verwendet.
Wenn Sie beispielsweise nach ähnlichen Schuhen suchen und nach color = black
filtern, bedeutet der Inline-Filter, dass AlloyDB nur die Ähnlichkeit von Schuhen prüft, die bereits 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 die Ähnlichkeit zu prüfen.
Inline-Filter eignen sich besonders, wenn die Ergebnisse mithilfe von Filtern nur mäßig eingegrenzt werden sollen.
Abfragepläne
Ein Abfrageplan bietet einen umfassenden Überblick über den Abfrageausführungsprozess und zeigt im Feld Execution Strategy (Ausführungsstrategie), welche Filterstrategie AlloyDB für den Vektorsuchvorgang auswählt.
Ein Abfrageplan für das Inline-Filtern
Für die Inline-Filterung verwendet AlloyDB einen Knoten für benutzerdefinierte Suchpläne, auch als Vektorsuche bezeichnet, der auf einem Knoten für Bitmap-Index-Suchpläne basiert, um die Bitmap für die Filterklauseln bereitzustellen.
Beim Vektorscan werden nur Entfernungen für Zeilen berechnet, die die Filterkriterien erfüllen.
Die folgende Abfrage veranschaulicht das Inline-Filtern 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;
Im folgenden Beispielabfrageplan wird eine optimierte Vektorsuche mit Inline-Filterung veranschaulicht:
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 gibt Limit (actual rows=10)
an, dass die Abfrage die SQL-Klausel 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
steht für einen Vektorsuchvorgang. Es handelt sich um einen benutzerdefinierten Scan, da es sich um einen speziellen Scan für Vektordaten handelt, der auf der Tabelle products
ausgeführt wird.
Im Beispielabfrageplan für das Inline-Filtern ist im Feld Ausführungsstrategie Bitmap assisted vector Scan on products_embedding_index
zu sehen. Das bedeutet, dass beim Vektorscan die Bitmap verwendet wird, um eine Kurzliste der Zeilen zu erstellen, für die die Ähnlichkeitssuche durchgeführt werden muss. Mit dem Bitmap-Index-Scan werden die Daten anhand der color = 'black'
-Bedingung gefiltert.
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, <=>
steht für den Nearest-Neighbor-Operator, [...]
ist der Abfragevektor und ::vector
führt einen Typumwandlung in den Vektordatentyp aus.
Der Knoten -> Bitmap Index Scan on products (color_index)
steht für einen Bitmap-Indexscan auf der colors_index
. Bei einem Bitmap-Indexscan werden Zeilen, die der Filterbedingung entsprechen, mithilfe eines Bitmaps ausgewählt und mit color_index
gefiltert.
Das Index Cond: (color = 'black')
-Attribut gibt die Filterbedingung an, die vom color = 'black'
-Indexscan aus der WHERE
-Klausel der Abfrage verwendet wird.