Automatiser les mises à jour avec un déclencheur (trigger)
Actuellement, la colonne search_vector est statique. Si vous mettez à jour le titre ou le contenu d'un article, le search_vector ne reflétera pas automatiquement le changement. Pour résoudre ce problème, vous pouvez créer un déclencheur qui met à jour automatiquement la colonne search_vector avant toute opération INSERT ou UPDATE sur la table articles.
Tout d'abord, définissez une fonction qui sera exécutée par le déclencheur. Cette fonction met à jour le search_vector pour la ligne nouvelle ou mise à jour.
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;
La variable NEW dans la fonction fait référence à la ligne en cours d'insertion ou de mise à jour.
Ensuite, créez le déclencheur lui-même. Ce déclencheur appellera la fonction articles_tsvector_update avant chaque insertion ou mise à jour de ligne.
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON articles FOR EACH ROW EXECUTE FUNCTION articles_tsvector_update();
Maintenant, testons le déclencheur. Tout d'abord, insérez un nouvel article sur l'indexation de base de données.
INSERT INTO articles (title, content) VALUES ('Database Indexing', 'Learn about B-Tree and GIN indexes.');
En raison du déclencheur, le search_vector de ce nouvel article a été automatiquement renseigné. Vous pouvez le vérifier en recherchant le mot indexes.
SELECT title FROM articles WHERE search_vector @@ to_tsquery('indexes');
Le nouvel article devrait apparaître dans les résultats.
title
---------------------
Database Indexing
(1 row)
Cela confirme que votre déclencheur fonctionne correctement, garantissant que votre index de recherche en texte intégral reste synchronisé avec vos données.