Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/04/2011, 09h23   #1
Invité de passage
 
David GUEZ
Inscription : octobre 2009
Messages : 14
Détails du profil
Informations personnelles :
Nom : David GUEZ
Âge : 37

Informations forums :
Inscription : octobre 2009
Messages : 14
Points : 4
Points : 4
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 :
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...
davguez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h23   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 11h55   #3
Invité de passage
 
David GUEZ
Inscription : octobre 2009
Messages : 14
Détails du profil
Informations personnelles :
Nom : David GUEZ
Âge : 37

Informations forums :
Inscription : octobre 2009
Messages : 14
Points : 4
Points : 4
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...
davguez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 12h03   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 12h30   #5
Invité de passage
 
David GUEZ
Inscription : octobre 2009
Messages : 14
Détails du profil
Informations personnelles :
Nom : David GUEZ
Âge : 37

Informations forums :
Inscription : octobre 2009
Messages : 14
Points : 4
Points : 4
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 :
 TITRE=toto AND date>20/05/75
est transformée en
Code :
 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 :
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.
davguez est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h25.


 
 
 
 
Partenaires

Hébergement Web