Auf dieser Seite erhalten Sie einen Überblick über die gefilterte Vektorsuche in AlloyDB for PostgreSQL.
Eine gefilterte Vektorsuche besteht aus einem Anfragevektor und einem Filter für ein bestimmtes Feld. AlloyDB 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-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 Ihre Filter verwendet, um eine kleinere Gruppe von Elementen zu finden, die Ihren Kriterien entsprechen, anstatt den gesamten Datensatz zu durchsuchen. Anschließend führt AlloyDB die Vektorsuche für diese kleinere Gruppe aus.
Wenn Sie beispielsweise nach ähnlichen blauen Hemden suchen, findet AlloyDB 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 verwendet wird, wenn Ihre Filter die Ergebnisse nicht wesentlich eingrenzen. Anstatt zuerst zu filtern, sucht AlloyDB 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 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 sowohl Vektor- als auch andere sekundäre Indexe verwendet, um die Vektorsuche und die Filterauswertung gleichzeitig durchzuführen. AlloyDB durchsucht den Vektorindex nach ähnlichen Vektoren und prüft auch, ob jeder Vektor Ihren Metadatenfilterbedingungen entspricht. Dabei werden Indexe wie B-Bäume, 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 für den Vektorscanvorgang auswählt.
Ein Abfrageplan für die Inline-Filterung
Für die Inline-Filterung verwendet AlloyDB 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 im Feld Ausführungsstrategie Bitmap assisted vector Scan on products_embedding_index 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.
Best Practices für die gefilterte Vektorsuche
Wenn Ihre Vektorsuchabfragen Filter enthalten, empfehlen wir, einen B-Baum-Index für die in diesen Filtern verwendeten Spalten zu erstellen, unabhängig davon, ob Sie einen ScaNN-, HNSW- oder IVFFlat-Vektorindex verwenden.