Bonjour.
Je suis actuellement en train de coder un site web embarquant en interne un moteur de recherche. J'indexe actuellement une base de donnée de document possédants plusieurs champs indexés (titre, tags, description, texte contenu).
Voici le schema de mes tables :
Table documents :
Table mots :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CREATE TABLE `documents` ( `id` int(11) unsigned NOT NULL auto_increment, `nom` varchar(64) default NULL, `titre` varchar(128) default NULL, `tags` varchar(256) default NULL, `contenu` longtext, `texte` longtext, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
Et quatre tables (titre tags description et texte ou docs) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE TABLE `mots` ( `id` int(11) unsigned NOT NULL auto_increment, `mot` varchar(32) default NULL, PRIMARY KEY (`id`), KEY `mots_idx` (`mot`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
Actuellement j'ai une requête qui me permet de récupérer les documents contenant l'occurrence d'un ou plusieurs mots comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE TABLE `index_docs` ( `id` int(11) unsigned NOT NULL auto_increment, `id_documents` int(11) unsigned default NULL, `id_mots` int(11) unsigned default NULL, `count` int(11) unsigned default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
Celle-ci fonctionne parfaitement et me retourne la liste des documents classé par nombre d'occurrences.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT documents.nom,SUM(index_docs.count) AS count FROM documents, index_docs, mots WHERE mots.id = index_docs.id_mots AND documents.id = index_docs.id_documents AND (mots.mot = "TOTO" OR mots.mot = "TATA") GROUP BY documents.nom ORDER BY count DESC ;
Maintenant j'aimerais bien faire la même chose mais avec les 4 tables (titre tags description et texte).
Cependant je ne m'en sors pas… Je ne sais pas trop comment construire ma requête.
J'ai essayé quelque chose comme :
Mais c'est un échec … des idées ? des critiques des conseils? Je suis un grand débutant en SQL alors aidez moi a progresser : critiquez moi ^^
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 SELECT documents.nom, SUM(index_docs.count) AS count_docs, SUM(index_resumes.count) AS count_resumes, SUM(index_tags.count) AS count_tags, SUM(index_titles.count) AS count_titles FROM documents, index_docs, index_resumes, index_tags, index_titles, mots WHERE ((mots.id = index_docs.id_mots AND documents.id = index_docs.id_documents) OR (mots.id = index_resumes.id_mots AND documents.id = index_resumes.id_documents) OR (mots.id = index_tags.id_mots AND documents.id = index_tags.id_documents) OR (mots.id = index_titles.id_mots AND documents.id = index_titles.id_documents)) AND ( mots.mot = "APOSTROPHE" ) GROUP BY documents.nom ;
Partager