IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

[MySQL] Moteur de recherche MATCH


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut [MySQL] Moteur de recherche MATCH
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    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.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    laisse tomber le GROUP BY et le HAVING, et utilise juste ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MATCH(valeur) AGAINST('voiture* automobile ' IN BOOLEAN MODE) >=2
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci pour ton aide mais ça ne peut pas fonctionner comme tu le proposes car ma table motscles ne contient que des mots uniques. Ce que tu proposes fonctionnerait si dans le même mot clé on pouvait avoir "voiture" et "rouge" mais ce n'est pas le cas. (ou alors je n'ai pas compris comment utiliser ta proposition...)
    Une entreprise va être associée à plusieurs mots clés via la table "entr_mots" qui fait l'intermédiaire entre les deux.

    Une autre idée ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    si ta table motcles ne contient que des mots uniques, pourquoi diable utilises-tu un MATCH ? MATCH est fait pour une indexation FULLTEXT.

    Il te faut deux instances de la table motcles (si je suppose que valeur est le libellé de ton mot-clé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT num_entr 
    FROM entreprise E
      INNER JOIN entr_mots EM ON EM.id_entr = E.num_entr
      INNER JOIN motscle M ON EM.id_motcle = M.num_motcle
      INNER JOIN entr_mots EM2 ON EM2.id_entr = E.num_entr
      INNER JOIN motscle M2 ON EM2.id_motcle = M2.num_motcle
    WHERE M.valeur LIKE 'voiture%'
      AND M2.valeur = 'rouge' ;
    En termes de performance, il faut évidemment indexer valeur ainsi que l'ensemble des num_ et id_.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Moteur de recherche dans base MySQL
    Par frost80500 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/04/2008, 17h07
  2. Réponses: 4
    Dernier message: 13/03/2008, 10h46
  3. [MySQL] créer un moteur de recherche en php/mysql
    Par belakhdarbts10 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/05/2007, 12h52
  4. [MySQL] Moteur de recherche
    Par carmelaurel dans le forum Langage SQL
    Réponses: 1
    Dernier message: 08/06/2006, 21h38
  5. [MySQL] Un moteur de recherche... plus rapide
    Par groupejtt dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/03/2006, 21h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo