Comment programmer un moteur de recherche efficace ?

  • Auteur de la discussion Auteur de la discussion beenie
  • Date de début Date de début
Nouveau WRInaute
Bonjour,


J'essaie de mettre en place un moteur de recherche et je me trouve face à deux difficultés :

-comment faire si les personnes tapent les mots sans accents alors que dans la base de donnée les accents sont représentés sous la forme : é = & eacute; par exemple

-comment faire pour gagner en pertinence car pour l'instant je construit une requête avec les différents mot trouvés: select * from maTable where description like %mot1% OR description like %mot2%, etc....
Si j'utilise AND, alors il n'y pas assez de résultat
SI j'utilise OR j'ai trop de resultat

Voilà donc je recherche les pistes pour améliorer le moteur, comment les programmez-vous pour qu'ils soient efficaces?
merci.
 
WRInaute passionné
Salut,

beenie a dit:
-comment faire si les personnes tapent les mots sans accents alors que dans la base de donnée les accents sont représentés sous la forme : é = & eacute; par exemple
La franchement ça va être compliqué et surtout très lourd. Il vaut mieux avoir les accents directement.

beenie a dit:
-comment faire pour gagner en pertinence car pour l'instant je construit une requête avec les différents mot trouvés: select * from maTable where description like %mot1% OR description like %mot2%, etc....
Si j'utilise AND, alors il n'y pas assez de résultat
SI j'utilise OR j'ai trop de resultat
Pour récupérer une liste de résultats pertinente comme un moteur de recherche il existe des fonctions propres au SGBD.
Par exemple, si tu utilises MySQL, il faut que tu indexes ton champ en fulltext et utilise la fonction MATCH / AGAINST.

http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html
 
Nouveau WRInaute
Salut ,

dorian53 a dit:
Salut,

beenie a dit:
-comment faire si les personnes tapent les mots sans accents alors que dans la base de donnée les accents sont représentés sous la forme : é = & eacute; par exemple
La franchement ça va être compliqué et surtout très lourd. Il vaut mieux avoir les accents directement.

Pour la gestion des accents , il te suffit d'utiliser des tables avec des champs encodés en "utf8_general_ci" , mysql ne tiendra plus compte des accents pour tes recherches .

Ch.
 
WRInaute occasionnel
Sinon autre solution si tu as un peux de place dans tes base de donnée et beaucoup de pages c'est de faire un prêt traitement.

Tu crée 2 table

motcle
id
mot

liaison
idmc
idpage
score

- tu récupère le texte de ta pages
- tu fait un htmldecode
- puis tu remplace les accents par leur équivalent sans
- tu découpe en mots
- tu supprime les mots non significatif (pour alléger et simplifier)
- tu met tout les mot nouveaux que tu trouve dans la table motcle
- puis pour chaque mots tu met une entré dans la table liaison. Le score tu peux mettre par exemple le nombre de fois ou le mots aparais dans la pages (a affiner en fonction des besoin)

Ensuite quand tu fait une recherche, tu fait la même chose :
- htmldecode
- remplacer les accents
- découper en mots
- supprimer les mots non significatif
- enfin une recherche avec un = (plus léger qu'un like ou match)

inconvénient
- plus lourd à mettre en œuvre
- obligation de faire un pré-traitement
- peux retourner mois de résultat
- consomme de l'espace base

avantage
- requette plus légère, surtout si beaucoup de texte à analyser
- plus grand maitrise de l'algorithme et possibilité d'affiner les score
- traitement d'autres chose que du texte en base possible.
 
WRInaute accro
dorian53 a dit:
http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html
je n'ai jamais trouvé fulltext performant.
Pour un "bon" moteur de recherches, j'ai vu passer sur wri il y a 2-3 semaines, un post sur sphinx. visiblement il a l'air d'être puissant, mais pas évident à paramétrer
 
WRInaute passionné
Et pourquoi pas ré encoder la recherche de l'utilisateur avec une petite fonction qui échangerait les é par & eacute; et compagnie .. puis effectuer la recherche en utilisant REGEXP au lieu de LIKE ?
Bon, c'est juste une idée et peut être pas la meilleurs :wink:
 
WRInaute accro
tryan a dit:
Et pourquoi pas ré encoder la recherche de l'utilisateur avec une petite fonction qui échangerait les é par & eacute; et compagnie .. puis effectuer la recherche en utilisant REGEXP au lieu de LIKE ?
Bon, c'est juste une idée et peut être pas la meilleurs :wink:
sauf que dans la BDD, c'est quand même mieux d'avoir directement les caractères accentués et pas sour forme d'entité
 
WRInaute passionné
Je suis daccord et je partais juste de l'hypothèse qu'il a déjà pas mal contenu et qu'il voulait "greffer" un moteur de recherche interne à son site sans avoir besoin de se retaper les corrections ^^.
 
WRInaute passionné
Sinon utiliser un outils fait pour comme sphinx (open source et très bien fait). Bon c'est pas aussi simple que faire une requête mais c'est extrêmement efficace.
 
Discussions similaires
Haut