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

Langage SQL Discussion :

Recherche de mots clef


Sujet :

Langage SQL

  1. #1
    Membre à l'essai Avatar de davguez
    Homme Profil pro
    Chercheur
    Inscrit en
    Octobre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2009
    Messages : 21
    Points : 19
    Points
    19
    Par défaut Recherche de mots clef
    Bonjour,
    je suis actuellement en train de coder un logiciel de GED (Gestion Electronique de Documents)

    Le logiciel gère une liste de documents (avec le nom de fichier, sa date de création, etc...), une liste de tags et une liste de correspondance entre les tags et les documents:

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    table documents
    ============
    ID  FILENAME ....
    --  ------------
    1   fichier1.pdf
    2   fichier2.pdf
    3   fichier3.pdf
     
    table des tags
    ============
    ID_TAG        _TAG
    ----        -------
    1            facture
    2            electricite
    3            internet
     
    table de correspondance
    ==================
    ID_TAG   ID_DOC
    -------   -------
    1           1
    2           1
    1           2
    3           2
    3           3
    La derniere table signifiant donc que le fichier fichier1.pdf contient les tags facture et electricite, le fichier fichier2.pdf contient facture et internet et le fichier 3 seulement internet.

    Je voudrais à présent faire une requête qui me liste les fichiers contenant justement facture ET internet, et là je sèche.
    Donc
    1. soit il y a une erreur de conception dans mes tables SQL, ce qui est très envisageable (c'est la première fois que j'utilise un SGBD)
    2 soit il y a un moyen quelconque et là ce serait super... en encore plus si vous pouvez m'indiquer le moyen de parvenir à mes fins.

    Note : le SGBD en question, c'est sqlite3, si la précision est utile...

    Merci à ceux qui prendront le temps de lire ma question!

    A bienôt

    NB: A ce propos, un peu de pub, le programme est déjà utilisable, s'appelle MALODOS et se trouve ici : http://code.google.com/p/malodos/downloads/list
    Mais je ferais une vrai annonce quand j'aurais réglé (ou éludé) le problème de requete en question ici...

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Rassurez vous, il n'y a pas d'erreur de conception pour cette partie du modèle en tout cas.
    poru ce qui est de la requete, comme je suppose que voudrez par la suite éventuellement rechercher plus de deux tags, je pense que le mieux est de faire une jointure, de grouper, et de verifier le nombre d'occurences. Cela pourra par la suite aussi vous permettre de classer les documents par ordre de correspondances trouvées :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT d.FILENAME
    FROM documents d
    INNER JOIN correspondance c 
        ON c.ID_DOC = d.ID_DOC
    INNER JOIN tags t 
        ON t.ID_TAG = c.ID_TAGS
    WHERE t.TAG IN ('facture', 'electricite')
    GROUP BY d.FILENAME
    HAVING COUNT(*) = 2

  3. #3
    Membre à l'essai Avatar de davguez
    Homme Profil pro
    Chercheur
    Inscrit en
    Octobre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2009
    Messages : 21
    Points : 19
    Points
    19
    Par défaut merci
    Merci pour cette réponse rapide!

    A vrai dire, dans le logiciel, je voudrais pouvoir autoriser des requetes du type TITLE:facture OR TITLE:bidule AND DESCRIPTION:un_truc ...

    et j'espérais en fait pouvoir parser ceci en remplaçant simplement chaque couple FIELD:VALEUR par une expression SQL équivalente, en conservant les AND/OR/NOT et parenthèses éventuelles (c'est ce que je fais pour l'instant).

    Je suppose que mon parser devra alors être un peu plus costaud que ça en fait.
    En tout cas je retiens la solution des inner join, ça me donnera au moins la direction où aller! Encore merci beaucoup...

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Je ne sais pas d'ou sortent vos colonnes title et description, mais le nom de cette dernière laisse penser que ce sera une saisie libre (et non plus une liste de tags prédéfinis)

    La recherche full text pourrait aussi être une solution...(elle pourra notamment permettre de faire le rapprochement entre facture et factures par exemple...)

  5. #5
    Membre à l'essai Avatar de davguez
    Homme Profil pro
    Chercheur
    Inscrit en
    Octobre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2009
    Messages : 21
    Points : 19
    Points
    19
    Par défaut effectivement
    oui, effectivement, pour simplifier la description de mon problème, je n'avais évoqué que le champs 'tags'. En fait, chaque document possède un nom de fichier, un titre, un description (ou commentaire) et une liste de tags.

    il y a une table keyword qui est remplie automatiquement par exemple, si j'ajoute un document fichier1.pdf avec comme titre 'facture electricite juillet 2008' et description = 'paye le 20/05/06' et enfin comme tags 'facture,maison' alors le logiciel découpe automatiquement chacun de ces champs pour éventuellement ajouter les mots electricite,facture,maison,paye,juillet dans la table des index.

    Par ailleurs, il met a jours une table de correspondances avec comme champ ID_DOC ID_KEYWORD ID_FIELD

    - d'ailleurs, pour être précis, la table tags contient également une version transformée avec un algo de phonex pour une recherche soundlike -

    pour l'instant une requête comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TITRE=toto AND date>20/05/75
    est transformée en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT docID,sum(count) FROM fullDoc WHERE  or ( soundex_word='toto') or ( documentDate > '25/05/75') GROUP BY docID
    où fullDoc est une vue cree comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create view if not exists fullDoc
    as
    select D.title, D.description, D.filename, D.documentDate,
             D.tags, D.RowID docID,K.keyword,
             K.soundex_word,DW.field,DW.count
     
    FROM keywords K,documents D,docWords DW
     
    WHERE DW.keyID = K.rowID AND DW.docID = D.RowID
    Si je fais un mélange entre un champ texte et un champ date comme dans l'exemple ci dessus, ça marche très bien. Mais je voudrais également faire plusieurs conditions sur différents champs de texte, d'où mon problème.

    Mais là je rentre vraiment dans les détails, je ne sais pas si ça apporte beaucoup d'information pertinente.

Discussions similaires

  1. Recherche par mot clef dans une feuille excel.
    Par takamo dans le forum Excel
    Réponses: 12
    Dernier message: 18/06/2008, 14h35
  2. [MySQL] Recherche de mots clefs
    Par _cheval_ dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/05/2007, 23h33
  3. Comment réaliser une recherche par mot clef ?
    Par mouchkar dans le forum ASP.NET
    Réponses: 2
    Dernier message: 06/09/2006, 11h48
  4. pblm recherche par mot-clef - mysql_db_query
    Par carelha dans le forum Langage
    Réponses: 8
    Dernier message: 21/06/2006, 17h20
  5. [MySQL] SQL et résultat de recherche par mot clef
    Par carelha dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/04/2006, 15h40

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