VinceA | Bonjour à tous =).
Je suis actuellement sur un projet scolaire qui consiste à dév. un moteur traitant une "Recherche multicritères".
Dans ces critères figurent : Nom, auteur, éditeur, parution.. (On parle ici de Livre/CD/DVD/Revue).
J'ai 4 tables (une pour chaque type de document [livre, cd..]) avec une structure qui est à quelques champs près, la même pour toutes.
J'en viens au fait :
Ma recherche MULTICRITERES contient un critère "mots-clés"... Le gars saisit des mots-clés et on va faire la recherche sur les champs nom(titre)/auteur/description, pour chaque mot avec un %LIKE%...
Seulement j'aimerais faire un tri par pertinence, et j'ai vu que l'engine MyIsam gérait ça avec MATCH/AGAINST en mode FULLTEXT.
J'ai donc indexé mes champs nom,auteur,description en FULLTEXT pour chaque table (livre, cd, dvd, revue).
Voilà la tête de ma requête, quand la personne qui effectue la recherche ne précise pas le type de documents :
Avant de découvrir Match/Against
Code :
- SELECT * from (SELECT livre.id, livre.nom, livre.auteur, livre.description, livre.type_document FROM livre UNION SELECT cd.id, cd.nom, cd.auteur, cd.description, cd.type_document FROM cd UNION SELECT dvd.id, dvd.nom, dvd.auteur, dvd.description, dvd.type_document FROM dvd UNION SELECT revue.id, revue.nom, revue.auteur, revue.description, revue.type_document FROM revue) AS data WHERE (data.nom LIKE '%fourmis%' OR data.nom LIKE '%werber%' OR data.auteur LIKE '%fourmis%' OR data.auteur LIKE '%werber%' OR data.description LIKE '%fourmis%' OR data.description LIKE '%werber%');
|
Je suis obligé de chercher dans livre ET cd ET dvd ET revue, puis faire un groupe de 3 OR (3 champs, logique) pour chaque mot-clé saisi (ici, "fourmis" et "werber" ).
Avec Match et Against, voici à quoi c'est censé ressembler :
Code :
- SELECT * from (SELECT livre.id, livre.nom, livre.auteur, livre.description, livre.type_document FROM livre UNION SELECT cd.id, cd.nom, cd.auteur, cd.description, cd.type_document FROM cd UNION SELECT dvd.id, dvd.nom, dvd.auteur, dvd.description, dvd.type_document FROM dvd UNION SELECT revue.id, revue.nom, revue.auteur, revue.description, revue.type_document FROM revue) AS data WHERE MATCH(data.nom, data.auteur, data.description) AGAINST('fourmis lune rouge');
|
Et en plus j'ai un tri par pertinence (le + d'occurences en premier), la classe.
Seulement voilà :
ERROR 1191 (HY000) : Can't find FULLTEXT index matching the column list.
Quand je fais quelque chose comme
Code :
- SELECT * from livre WHERE MATCH(livre.nom, livre.auteur, livre.description) AGAINST('fourmis werber');
|
Il n'y a pas de soucis.
Je pense que MySQL cherche à fouiner dans "data.nom" alors que ce n'est que l'assemblage du champ Nom de mes 4 tables, et donc dit que "data.nom" n'est pas indexé en FULLTEXT (normal 'data' est un alias et non une table...).
J'ai bien essayé le "IN BOOLEAN MODE" dans Against, qui permet de faire ça sans FULLTEXT, mais ici la pertinence n'est plus .
Désolé pour le pavé j'ai essayé de détailler un maximum...
Merci d'avance.
Amicalement,
Vincent.
EDIT solution trouvée ^^
Code :
- SELECT * FROM
- (SELECT nom, auteur, description, MATCH(nom, auteur, description) AGAINST('astronomie soleil étoile') AS score FROM livre WHERE MATCH(nom, auteur, description)AGAINST('astronomie soleil étoile')
- UNION
- SELECT nom, auteur, description, MATCH(nom, auteur, description) AGAINST('astronomie soleil étoile') AS score FROM dvd WHERE MATCH(nom, auteur, description) AGAINST('astronomie soleil étoile')
- UNION
- SELECT nom, auteur, description, MATCH(nom, auteur, description) AGAINST('astronomie soleil étoile') AS score FROM cd WHERE MATCH(nom, auteur, description) AGAINST('astronomie soleil étoile')
- UNION
- SELECT nom, auteur, description, MATCH(nom, auteur, description) AGAINST('astronomie soleil étoile') AS score FROM revue WHERE MATCH(nom, auteur, description) AGAINST('astronomie soleil étoile')
- ) a ORDER BY score DESC;
|
Merci à flo850 pour son aide =) ! Message édité par VinceA le 27-04-2010 à 15:12:38
|