IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Algorithme d'un moteur de recherche


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut Algorithme d'un moteur de recherche
    Bonjour,

    je cherche à optimiser la recherche sur mon site car ma base de donnée contient de plus en plus de données.

    Imaginons que je dois trouver l'information parmi 200.000 enregistrements et même plus par la suite.

    Pour le moment, l'algorithme est simple :

    > l'utilisateur tape une chaine de caractère "je cherche l'information"

    > découpage des mots clés considérés utiles [0]->"cherche", [1]->"information"

    > Ensuite recherche de tous les enregistrements avec ces deux mots clés. Création d'un premier tableau de résultat

    > Ensuite on attribue à chaque résultat un nombre de points suivant une formule simple :

    points = nombre mots clefs présent dans l'enregistrement * ponderance (fonction de l'importance du mot clef)

    > Tri décroissant en fonction du nombre de points

    > Affichage des résultats page par page.

    Cependant rechercher parmi tant d'information cela risque de prendre de plus en plus de temps. Je voulais savoir si vous connaissiez des informations concernant les algo de recherche ? J'ai cherché sur le net j'ai trouvé que des infos sur l'algo par dichotomie.

    A bientôt
    Adrien.

  2. #2
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut
    Dans ce que tu présentes, ce qui prend du temps, c'est la phase :

    > Ensuite recherche de tous les enregistrements avec ces deux mots clés. Création d'un premier tableau de résultat
    Une des idées que tu peux utiliser, c'est d'indexer le contenu de tes enregistrement. En gros, tu crée une table avec 4 champ (le 4eme est optionnel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mot_clef / id_enregistrement / nb_apparition / phrase de contexte
    Avec mot_clef + id_enregistrement en clef primaire.
    Phrase de contexte : un extrait de ton enregistrement, genre 30 caractères avant et 50 après, à régler à l'usage et suivant le contenu.
    Ensuite, tu vas parser tous tes enregistrements, et pour chaque mot, creer un enregistrement dans ta base qui indique où tu as trouvé ce mot, et combien de fois il apparait dans l'enregistrement en question.
    Cette étape là peut prendre pas mal de temps machine si ta base est grande, mais elle n'est faite que de temps en temps quand tu le décides.
    Après, quand quelqu'un rentre un mot, au lieu d'aller voir tes enregistrements, tu vas directement faire un select sur ta table d'indexation where 'mot_clef' like "tonmotderecherche" pour récuperer l'id des enregistrements qui t'interessent.
    Puis tu reprend à ton étape d'attribution de points et de pondération.

    L'intéret est que la partie chronophage du traitement est faite "avant", pour augmenter la rapidité à la lecture.

    La table d'indexation risque d'être franchement volumineuse (pour chaque enregistrement de ta table source tu as une ligne par mot unique) et longue à générer mais avec un index sur "mot_clef", tu as la garanties que les informations sont triées, donc recherche dichotomique. En 20 itérations max la base de donnée aura trouvé tes infos, autant dire, rien du tout par rapport au fait de parser à chaque fois tes 200 000 enregistrements.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    Effectivement ce serait pratique de créer une table parallèle qui reprend la table principale.

    Je testerai ton idée, mais d'avance c'est évidant qu'il y a un gros intérêt : la base principale se retrouve déchargé de toutes les requêtes...

    Le risque c'est de devoir mettre à jour les 100.000 infos chaque jour héhé

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Je ne sais plus quel moteur de recherche utilisait une technique de ce genre. Ce qui est certain c'est que ça améliore nettement la rapidité de recherche... Pour la soumission d'infos tu t'en fous, pour peu que tu lances des crons/robots qui s'occupent de le faire, à leur rythme mais presque en permanence, par exemple.

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Dans le cadre d'un serveur, la technique la plus performante est de créer l'index en mémoire au (re)démarrage du serveur et de le maintenir lors des mises à jour.

    Suivant la taille de l'index (nombre de mots différents et nombre d'enregistrements moyen par mot) , il pourra être totalement ou partiellement en mémoire.

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    La table d'indexation risque d'être franchement volumineuse (pour chaque enregistrement de ta table source tu as une ligne par mot unique)
    il sera plus performant de mettre un enregistrement par mot et de gérer des Blob contenant la liste des Id des enregistrements reférencés.
    Prévoir une allocation par blocs (Blobs partiellement remplis) pour ne pas agrandir les blobs à chaque ajout d'une reférence.

Discussions similaires

  1. Google doit-il publier l'algorithme de son moteur de recherche ?
    Par Gordon Fowler dans le forum Actualités
    Réponses: 94
    Dernier message: 31/07/2010, 10h44
  2. Algorithme d'indexation pour moteur de recherche
    Par caspertn dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 24/04/2006, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo