Updates mit einem Trigger automatisieren
Derzeit ist die search_vector-Spalte statisch. Wenn Sie den Titel oder Inhalt eines Artikels aktualisieren, wird der search_vector die Änderung nicht automatisch widerspiegeln. Um dies zu lösen, können Sie einen Trigger erstellen, der die search_vector-Spalte vor jeder INSERT- oder UPDATE-Operation auf der articles-Tabelle automatisch aktualisiert.
Definieren Sie zunächst eine Funktion, die vom Trigger ausgeführt wird. Diese Funktion aktualisiert den search_vector für die neue oder aktualisierte Zeile.
CREATE OR REPLACE FUNCTION articles_tsvector_update() RETURNS TRIGGER AS $$
BEGIN
NEW.search_vector :=
to_tsvector('pg_catalog.english', NEW.title || ' ' || NEW.content);
RETURN NEW;
END
$$ LANGUAGE plpgsql;
Die Variable NEW in der Funktion bezieht sich auf die Zeile, die eingefügt oder aktualisiert wird.
Erstellen Sie als Nächstes den Trigger selbst. Dieser Trigger ruft die Funktion articles_tsvector_update vor jeder Zeileneinfügung oder -aktualisierung auf.
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON articles FOR EACH ROW EXECUTE FUNCTION articles_tsvector_update();
Testen wir nun den Trigger. Fügen Sie zunächst einen neuen Artikel über Datenbankindizierung ein.
INSERT INTO articles (title, content) VALUES ('Database Indexing', 'Learn about B-Tree and GIN indexes.');
Aufgrund des Triggers wurde der search_vector für diesen neuen Artikel automatisch befüllt. Sie können dies überprüfen, indem Sie nach dem Wort indexes suchen.
SELECT title FROM articles WHERE search_vector @@ to_tsquery('indexes');
Der neue Artikel sollte in den Ergebnissen erscheinen.
title
---------------------
Database Indexing
(1 row)
Dies bestätigt, dass Ihr Trigger korrekt funktioniert und sicherstellt, dass Ihr Volltextsuchindex mit Ihren Daten synchron bleibt.