mardi 3 novembre 2009

Mysql recherche fulltext sur table InnoDb

Le moteur de stockage InnoDb à de nombreux avantages mais pas celui de permettre la recherche fulltext pourtant extrêmement pratique lorsque l'on souhaite faire un petit moteur de recherche sur son application !
Ne pouvant me séparer de l'intégrité référentielle du moteur innodb, il m'a fallut trouver une solution.
Etant en mysql 5 le plus simple à été de créer une table de "recherche" avec le moteur myisam.
C'est une table allégée qui ne contient que les id et les champs textes à indexer.

Afin de garder cette table constamment à jour par rapport à la table originelle , il suffit de créer 3 triggers pour les 3 grandes opérations :
--Insertion 
CREATE TRIGGER bug_search_insert 
AFTER INSERT ON bugs 
FOR EACH ROW 
INSERT INTO bugs_search SET idBug = NEW.id, description = NEW.description 

--Update 
CREATE TRIGGER bug_search_update 
AFTER UPDATE ON bugs 
FOR EACH ROW 
UPDATE bugs_search SET idBug = OLD.id, description = NEW.description WHERE id = OLD.id

--Delete 
CREATE TRIGGER bug_search_delete 
AFTER DELETE ON bugs 
FOR EACH ROW 
DELETE FROM bugs_search WHERE id = OLD.id 

Ainsi chaque modification dans la table au moteur innodb sera répercutée dans la table au moteur myIsam. On perd évidemment en performance puisque que l'on doit travailler sur une table supplémentaire, mais on gagne la recherche fulltext sans sacrifier l'intégrité référentielle !


Détails de la création d'un trigger :
CREATE TRIGGER (1) 
(2) ON (3) 
FOR EACH ROW 
(4) 

1- Nom du trigger , doit être unique
2- Moment de déclenchement, par exemple AFTER INSERT , BEFORE UPDATE ....
3- Table « déclenchante »
4- Requête à exécuter pour chaque ligne

1 commentaire:

Curriculum Vitae a dit…

Salut, j'ai fait une banque de Curriculum Vitae en ligne en asp.net et j'ai utilisé une BD MySQL. J'ai utilisé la technique mentionnée plus haut et ça fonctionne vraiment bien! Merci!

Essayez la recherche full text, très rapide : http://www.cv-informatique-quebec.com