Automatizar Actualizaciones con un Trigger
Actualmente, la columna search_vector es estática. Si actualiza el título o el contenido de un artículo, el search_vector no reflejará automáticamente el cambio. Para solucionar esto, puede crear un trigger que actualice automáticamente la columna search_vector antes de cualquier operación de INSERT o UPDATE en la tabla articles.
Primero, defina una función que será ejecutada por el trigger. Esta función actualiza el search_vector para la fila nueva o actualizada.
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 en la función se refiere a la fila que se está insertando o actualizando.
A continuación, cree el trigger en sí. Este trigger llamará a la función articles_tsvector_update antes de que cada fila sea insertada o actualizada.
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON articles FOR EACH ROW EXECUTE FUNCTION articles_tsvector_update();
Ahora, probemos el trigger. Primero, inserte un nuevo artículo sobre indexación de bases de datos.
INSERT INTO articles (title, content) VALUES ('Database Indexing', 'Learn about B-Tree and GIN indexes.');
Debido al trigger, el search_vector para este nuevo artículo se pobló automáticamente. Puede verificar esto buscando la palabra indexes.
SELECT title FROM articles WHERE search_vector @@ to_tsquery('indexes');
El nuevo artículo debería aparecer en los resultados.
title
---------------------
Database Indexing
(1 row)
Esto confirma que su trigger está funcionando correctamente, asegurando que su índice de búsqueda de texto completo permanezca sincronizado con sus datos.