Moteur de recherche MATCH [MySQL] - SQL/NoSQL - Programmation
Marsh Posté le 30-07-2007 à 17:34:34
tu as plusieurs façons de faire, la première question etant: dois-tu prendre en compte les fautes d'orthographe? par exemple "voiture rouges" ou "voitures rouge".
Mais déjà j'éviterais l'utilisation du * qui peut t'amener des résultats bizarre genre "voiturette" ou "rougeaud".
Mais d'une façon générale je ferais quelque chose dans le genre:
Code :
|
Pense également à utiliser > et < pour donner de l'importance aux resultats.
Et je te promets que la doc mysql est pas mal faite sur l'utilisation de match en boolean
Marsh Posté le 30-07-2007 à 18:55:00
Merci pour ton aide mais ta solution n'est pas adaptée à ma requête. En effet ma table mot clé ne contient que des mots uniques. Je ne pourrai donc jamais, pour un tuple de la table motcle, avoir à la fois "rouge" et "voiture".
C'est la table entr_mots qui me permet d'associer plusieurs mots à une entreprise. Et c'est la clause group by... having count = <nb de mots clés saisis> qui permet de me retourner les entreprises associées à tous les mots clés recherchés.
Donc l'utilisation des + comme tu l'as fais ne résoud pas mon problème (ou alors je n'ai pas compris comment utiliser ce que tu m'as dis).
Et en effet la doc MySQL, que j'avais déjà lu attentivement, est pas mal faite même si elle ne répond pas à mon interrogation.
D'autres suggestions ?
Marsh Posté le 31-07-2007 à 13:01:53
sorry je n'avais point compris t'as problématique.
Donc si je résume tu as besoin de trouver parmi les entreprises celle qui ont un mot clé "rouge" et un mot clé "voiture".
Pas trente six solutions je ferais donc deux jointures strictes sur mot clé ( une pour rouge et une pour voiture) et une clause where pour chacune des deux jointures
Marsh Posté le 30-07-2007 à 16:59:55
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 :
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.