Moteur de recherche par tags

Résolu
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 - 1 août 2007 à 18:31
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 - 1 août 2007 à 20:27
Hello,

je me demandais quelle était la meilleure technique pour construire un moteur de recherche par tags.

Chaque article créé possède trois tags. Quelle est la meilleure façon de faire une recherche dessus ? Si on laisse tomber les problématiques de singulier/pluriel/faute d'orthographe/synonymes, que vaut-il mieux :
- mettre les trois tags dans la même table que l'article lui-même dans trois champs de bdd différents (recherche avec WHERE champ1 xx OR champ 2 xx OR champ3 = xx),
- idem mais dans un seul champ (recherche avec LIKE, ou plutôt MATCH avec FULLTEXT ?),
- créer une seule table qui contiendrait tous les tags (comme un dictionnaire), renverrait les id des articles qui contiennent ce mot en tag ?

Si vous avez des pistes là-dessus n'hésitez pas. Merci beaucoup !

4 réponses

J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
1 août 2007 à 20:11
Je ne pense pas qu'il faut te faire beaucoup de soucis concernant les performances d'une jointure. t le gros intérêt de faire une table uniquement pour les tags est que tu n'est alors plus limité à 3 tags par élement!!! Un plus évident

Ce que je te conseille même de faire :

Une table des tags
Tags
 id - PK, Int, autoincrement
 tag - Unique, VarChar(255)

insérer un(des) tag(s) :
insert ignore into Tags ('tag') values ('Bonjour'), ('salut'), ...

Une table de liaison entre Tags et les elements
Tagged
  tag_id
  object_id

...
Alors, pour trouver tous les tag de l'objet X

select tag
from Tags
cross join Tagged on (tag_id= id)
where object_id = 'X'

Trouver tous les objets avec le tag 'xyz'

select *
from objects
where objects in (
    select object_id
    from tagged
    cross join tags on (id = tag_id)
    where tag = 'xyz'
)

Et ainsi de suite...
3
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
1 août 2007 à 18:51
Salut,

"créer une seule table qui contiendrait tous les tags (comme un
dictionnaire), renverrait les id des articles qui contiennent ce mot en
tag ?" bien sûr...

Si ça te pose pb, demande

A+
0
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
1 août 2007 à 19:50
Bonsoir, et merci de ton aide

la réalisation en elle-même ne me pose pas de problème, je me pose plutôt des questions sur les performances. Par exemple, puisqu'on garde l'idée de l'index, vaut-il mieux faire :
- une table pour les mots et une table index pour leurs correspondances avec les articles, mais ça demande une jointure (consommation de ressources en plus ?)
ou plutôt
- une seule table les mots + les id des articles associés dans un autre champ (séparés par des virgules par exemple)

Parce que je me dis que c'est surement ce qui  prend le plus de ressources sur un site, vu qu'il faut balayer des milliers de lignes, alors est-ce une bonne idée de se débarasser de la jointure ? D'une manière générale, je manque complètement de repères sur les performances des différentes fonctions SQL, lesquelles sont rapides et lesquelles sont lentes.

Merci !
0
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
1 août 2007 à 20:27
Oui c'est vrai, je n'avais même pas pensé que le fait de ne faire qu'une table de mots rendaient la recherche inverse (chercher les tags d'un article en particulier) fort compliquée...
Et puis c'est vrai qu'ainsi il n'y a aucune raison de ne pas passer à 5 tags finalement :)

Merci pour le coup de main J_G !
à+
0
Rejoignez-nous