Bonjour,
J'ai fais appel à ce forum il y a quelques jours et je reviens avec un nouveau problème sur le même projet.
Le principe est de faire un moteur de recherche associant des entreprises à des mots clés.
Je travaille sur une base MySQL.
Voici ma base :
3 tables :
entreprise (id_entr, nom, adresse... )
motcle (id_mot, valeur)
entr_mot (num_entr, num_mot)
Mon jeu de test comporte 100 000 entreprises, 50 000 mots clés et 1 700 000 tuples dans la table "entr_mot" liant les entreprises et les mots clés.
A cette structure très simple viennent s'ajouter quelques index :
table "entreprise" :
- une clé primaire sur id_entr
table "motcle" :
- une clé primaire sur id_mot
- un index fulltext sur valeur (utilisé pour les recherche de type MATCH... AGAINST...)
table "entr_mot" :
- un index sur num_entr
- un index sur num_mot
Voici la requête que je réalise sur cette base :
Code :
- SELECT num_entr
- FROM motscle
- INNER JOIN entr_mots ON (id_motcle=num_motcle)
- INNER JOIN entreprise ON (id_entr=num_entr)
- WHERE MATCH(valeur) AGAINST('voiture rouge' IN BOOLEAN MODE)
- GROUP BY num_entr
- HAVING COUNT( num_entr ) = 2
- LIMIT 0 , 30
|
C'est à dire que je recherche toutes les entreprises qui sont liées à la fois au mot "voiture" et au mot "rouge".
Cette requête fonctionne à merveille mais j'aimerais maintenant pouvoir trouver des variantes des mots saisis comme les pluriels. Par exemple si une entreprise est associée au mot "voitures" elle devra apparaître avec la requête ci-dessus.
Pour cela le match... against... dispose de * qui permet cette tolérance.
Malheureusement si je conserve la même requête en ajoutant simplement * je vais avoir des résultats faux. En effet si une entreprise est associée à la fois aux mots "voiture" et "voitures" alors elle apparaîtra dans les résultats même si elle n'est pas associée au mot "rouge". (le having count = 2 sera satisfait)
J'ai essayé de modifier complètement le principe de la requête en traitant les mots clés un par un avec des IN par exemple mais le fait de répéter plusieurs fois le "match" rend la requete horriblement longue.
Voila, je pense que le problème est posé. Comment puis-je faire ?
N'hésitez pas à me faire partager vos connaissances. Merci pour votre aide.