Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2203 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Moteur de recherche MATCH

 


 

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] Moteur de recherche MATCH

n°1593445
syl20_44
Posté le 30-07-2007 à 16:59:55  profilanswer
 

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 :
  1. SELECT num_entr
  2. FROM motscle
  3. INNER JOIN entr_mots ON (id_motcle=num_motcle)
  4. INNER JOIN entreprise ON (id_entr=num_entr)
  5. WHERE MATCH(valeur) AGAINST('voiture rouge' IN BOOLEAN MODE)
  6. GROUP BY num_entr
  7. HAVING COUNT( num_entr ) = 2
  8. 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.
 

mood
Publicité
Posté le 30-07-2007 à 16:59:55  profilanswer
 

n°1593459
anapajari
s/travail/glanding on hfr/gs;
Posté le 30-07-2007 à 17:34:34  profilanswer
 

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 :
  1. MATCH(valeur) AGAINST('+(voiture voitures) +(rouge rouges)' IN BOOLEAN MODE)


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 ;)


Message édité par anapajari le 30-07-2007 à 17:35:03
n°1593482
syl20_44
Posté le 30-07-2007 à 18:55:00  profilanswer
 

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 ?

n°1593717
anapajari
s/travail/glanding on hfr/gs;
Posté le 31-07-2007 à 13:01:53  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Moteur de recherche MATCH

 

Sujets relatifs
Moteur ne pointant pas sur l'indexProblème de comparaison de mots de passe MySQL
MySQL - Optimisation d'une requête avec plusieurs JOIN[MYSQL] Requete complexe
[MySQL] Un sort un peu spécial[Résolu] MySql : Dernière entrée qui apparait en premier?
[MySQL] Insert + sous requeteSynchroniser table access et serveur Mysql
Comparaison de mot de passe mysql/php[RESOLU] MySQL jointure sur clé primaire LENTE
Plus de sujets relatifs à : [MySQL] Moteur de recherche MATCH


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR