par
Hubert Roksor » 03 avr. 2005, 18:15
La vraie question est: existe-t'il une
relation entre les tables ? car jusqu'à présent je n'en vois pas dans ton code. Dans ce cas tu aurais mieux fait d'exécuter une requête par table, sinon il serait bon de poster la structure (simplifiée, inutile d'inclure tous les champs) des tables en questions et la vraie requête que tu utilises.
Quant à utiliser une table de recherche, je suis 100% pour. (d'ailleurs iclo, si tu voulais développer "ça devient très vite l'usine à gaz" ça m'intéresse) Pour indexer le texte contenu dans la table Machin la structure des tables pourrait ressembler à: (clés primaires en gras)
Table Machin
machin_id INT
machin_text TEXT
Table words
word_id INT
word_text VARCHAR(20)
Table match
machin_id INT (->Machin.machin_id)
word_id INT (->words.word_id)
Tu peux avoir une description de cette approche dans cet article de Frédéric Brouard [
Indexation documentaire & bases de données ].
Reste un problème: ce modèle ne peut servir qu'à indexer une seule table. Pour en indexer plusieurs tu dois avoir recours à une troisième table d'indexation (et modifier la seconde):
Table documents
doc_id INT
doc_type ENUM('Machin', 'Truc')
foreign_id INT (->Machin.machin_id, ->Truc.truc_id) (ce champs ne peut pas être une contrainte étant donné qu'il lie la table à plusieurs autres tables)
Table match
doc_id INT (->documents.doc_id)
word_id IN (->words.word_id)
Petit exemple, pour retrouver tous les documents (posts de ton forum, bio de tes utilisateurs, description d'un produit, etc...) comportant les mots 'flan' (word_id 8) ET 'caramel' (word_id 12) tu exécuteras:
Code : Tout sélectionner
SELECT word_id, word_text
FROM words
WHERE word_text IN ('flan', 'caramel')
Code : Tout sélectionner
SELECT d.doc_id, d.doc_type
FROM match m1, match m2, documents d
WHERE m1.word_id = 8
AND m2.word_id = 12
AND m2.doc_id = m1.doc_id
AND d.doc_id = m1.doc_id
Ensuite, grâce aux IDs et au type de document doc_type tu pourras récupérer les textes en question si tu souhaites les afficher. Le cadeau bonux de cette méthode c'est que si quelqu'un tape un mot qui n'existe pas tu le sais très rapidement car il n'est tout simplement pas indexé. Si tu as des questions spécifiques j'essaierai d'y répondre quand je repasserai.
La vraie question est: existe-t'il une [b]relation[/b] entre les tables ? car jusqu'à présent je n'en vois pas dans ton code. Dans ce cas tu aurais mieux fait d'exécuter une requête par table, sinon il serait bon de poster la structure (simplifiée, inutile d'inclure tous les champs) des tables en questions et la vraie requête que tu utilises.
Quant à utiliser une table de recherche, je suis 100% pour. (d'ailleurs iclo, si tu voulais développer "ça devient très vite l'usine à gaz" ça m'intéresse) Pour indexer le texte contenu dans la table Machin la structure des tables pourrait ressembler à: (clés primaires en gras)
[quote]Table Machin
[b]machin_id[/b] INT
machin_text TEXT
Table words
[b]word_id[/b] INT
word_text VARCHAR(20)
Table match
[b]machin_id[/b] INT (->Machin.machin_id)
word_id INT (->words.word_id)[/quote]
Tu peux avoir une description de cette approche dans cet article de Frédéric Brouard [ [url=http://sqlpro.developpez.com/cours/indextextuelle/]Indexation documentaire & bases de données[/url] ].
Reste un problème: ce modèle ne peut servir qu'à indexer une seule table. Pour en indexer plusieurs tu dois avoir recours à une troisième table d'indexation (et modifier la seconde):
[quote]Table documents
[b]doc_id[/b] INT
doc_type ENUM('Machin', 'Truc')
foreign_id INT (->Machin.machin_id, ->Truc.truc_id) (ce champs ne peut pas être une contrainte étant donné qu'il lie la table à plusieurs autres tables)
Table match
doc_id INT (->documents.doc_id)
word_id IN (->words.word_id)[/quote]
Petit exemple, pour retrouver tous les documents (posts de ton forum, bio de tes utilisateurs, description d'un produit, etc...) comportant les mots 'flan' (word_id 8) ET 'caramel' (word_id 12) tu exécuteras:
[code]SELECT word_id, word_text
FROM words
WHERE word_text IN ('flan', 'caramel')[/code]
[code]SELECT d.doc_id, d.doc_type
FROM match m1, match m2, documents d
WHERE m1.word_id = 8
AND m2.word_id = 12
AND m2.doc_id = m1.doc_id
AND d.doc_id = m1.doc_id[/code]
Ensuite, grâce aux IDs et au type de document doc_type tu pourras récupérer les textes en question si tu souhaites les afficher. Le cadeau bonux de cette méthode c'est que si quelqu'un tape un mot qui n'existe pas tu le sais très rapidement car il n'est tout simplement pas indexé. Si tu as des questions spécifiques j'essaierai d'y répondre quand je repasserai.