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

ASP Discussion :

Débutant : Aide pour un petit moteur de recherche


Sujet :

ASP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 200
    Points : 66
    Points
    66
    Par défaut Débutant : Aide pour un petit moteur de recherche
    Bonjour à tous,

    Je suis totalement débutant en ASP et je dois améliorer un moteur de recherche existant et déjà en ligne depuis pas mal de temps déjà.

    Ce moteur fonctionne plutôt bien mais seulement si on recherche sur un seul mot ou alors sur des mots qui se suivent dans le texte recherché.
    Les caractères non-accentués ne sont pas pris en compte non plus...
    Exemples :
    J'ai un article qui s'intitule "Ne répondez pas au message"
    Si je cherche "message", OK
    Si je cherche "répondez", OK
    Si je cherche "répondez pas au message", OK
    Si je cherche "repondez", PAS OK
    Si je cherche "répondez message", PAS OK

    L'idéal serait de pouvoir gérer les caractères accentués et non-accentués de la même manière et
    de ne pas être obligé de saisir l'expression exacte de l'article pour le trouver.
    J'espère que c'est pas trop fouillis ce que je dis...

    Qqn a déjà rencontré ce problème ou sait comment le gérer ?
    En attendant, voici le script qui est utilisé (je pense que tout y est)
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
      <%
    // remplacement espace vide,<,>...
    mot=Replace(mot1,"'","''")
    mot=Replace(mot,"<","&lt")
    mot=Replace(mot,">","&gt")
    %>
      <%
    // test mot pour voir si chaine recherche vide 
    if mot="" or mot=" " then
    %>
      <%
    // si pas vide
    else
    %>
      <%
    // connection bdd + requete sql  #1
    DSN_BASE = "DBQ=" & Server.Mappath("/admin/bddtests.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25"
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open DSN_BASE
    SQL = "SELECT  *  FROM pathologies WHERE titre LIKE '%"&mot&"%'  OR auteur LIKE '%"&mot&"%'  OR parution  LIKE '%"&mot&"%'  OR  motsclefs LIKE '%"&mot&"%' ;"
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open SQL , conn
    // si  RS vide
    if rs.eof=true then
    %>
      <span class="titre_cadrebleu"> Pas de r&eacute;sultat(s) dans &gt;&gt;pathologies&lt;&lt; 
      contenant l'expression :<%response.write "<br>"+mot1%></span> 
      <%
    // si RS pas vide debut affichage  resultats pathologies
    else
    %>
      <font face="Arial" size="2" color="#800000">Vous recherchez <B> 
      <% =mot1%>
      </B>sur ce site,</font></p>
    <p align="center">
    <BR>
    <b><font face="Arial" size="2">Voici les pages trouvées :</font></b></p>
    <div align="center"><span class="titre_cadre">Articles Pathologies</span><span class="lien1"><br>
      <br>
      </span> 
     
    <%
    // retour boucle affichage pathologies
    rs.MoveNext
    loop
    %>
    </table>
    </center>
    </div>
    <%
    end if
    %>
     
    <%
    rs.close
    set rs=nothing
    conn.close
    set conn=nothing 
    %>
    ...
    merci d'avance de votre aide.
    cdlt.

  2. #2
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Salut,

    Quelle base de données utilises-tu?

  3. #3
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    Apparemment, c'est de l'Access.

    As-tu essayé comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE ucase(titre) LIKE '%"& ucase(mot) & "%'

  4. #4
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Il y a plusieurs choses à faire (et ce n'est qu'une proposition):

    1) Supprime les mots de moins de 4 lettres dans l'expression recherchée. Si la personne tape "Ne répondez pas au message", la recherche dois se faire sur "r*pondez" et "message". Pour ça il faut faire un split sur le caractère espace et vérifier la taille de chaque chaîne dans le tableau retourné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabRecherche = split(request.form("recherche"), " ")
    2) Utilise like en remplaçant les caractères accentués par le caractère générique *te retournera comme résultat les textes contenant:
    "rapondez"
    "repondez"
    "répondez"
    "rasoiuypondez"
    "r8pondez"

    Le caractère ? ne retournera pas "rasoiuypondez", car plusieurs lettres comprises entre "r" et "pondez"


    3) Choisir la bonne clause: "ou" ou "et" selon le résultat que tu souhaites. Dans une boucle tu composes ta chaine sql.

    A vue de nez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sql = "select * from matable where"
    for i = 0 to ubound(tabRecherche)-1
        if len(tabRecherche(i)) >3 then
            sql = sql & " MACOL like '%"& tabRecherche(i) &"%' and"
        end if
    next
    sql = left(sql, len(sql)-3)
    J'ai pas fait la partie de remplacement, il faut utiliser les expressions régulières.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 200
    Points : 66
    Points
    66
    Par défaut
    C'est une base Access en effet.
    Franculo, merci de ta réponse mais je ne comprends pas tout...

    Pour le 1)
    Je crois comprendre qu'on crée un tableau où chaque élément contient les mots à rechercher. Mais où est-ce qu'on limite le nombre de caractères à 3 ?

    Pour le 2)
    like '%r*pondez%'
    Je crois que remplacer le caractère accentué ne me sert pas car il faudrait que je recense tous les mots susceptibles d'être demandés, et il y en a des centaines...!

    Pour le 3)
    Je comprends l'utilité de la boucle mais le "i" va être incrémenté à chaque passage sur la boucle ce qui veut dire qu'il effectuera la recherche que sur le dernier mot 'scanné'.... mais je peux me tromper non ?

    A quoi sert la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = left(sql, len(sql)-3)
    ?

    merci

  6. #6
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Citation Envoyé par miltonis Voir le message
    Mais où est-ce qu'on limite le nombre de caractères à 3 ?
    Je construis un tableau contenant tous les mots puis je fais juste une condition quand je le parcours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if len(tabRecherche(i)) >3 then
    Citation Envoyé par miltonis Voir le message
    Je crois que remplacer le caractère accentué ne me sert pas car il faudrait que je recense tous les mots susceptibles d'être demandés, et il y en a des centaines...!
    J'ai pas compris...
    Citation Envoyé par miltonis Voir le message
    Je comprends l'utilité de la boucle mais le "i" va être incrémenté à chaque passage sur la boucle ce qui veut dire qu'il effectuera la recherche que sur le dernier mot 'scanné'.... mais je peux me tromper non ?
    En effet, tu te trompes . Je compose la requête sql dans la boucle. Requête qui n'est en fait qu'une chaîne de caractères comme une autre. Puis il faut l'exécuter APRES la boucle et non pas l'exécuter dans la boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sql = "select * from matable where"
    for i = 0 to ubound(tabRecherche)-1
        if len(tabRecherche(i)) >3 then
            sql = sql & " MACOL like '%"& tabRecherche(i) &"%' and"
        end if
    next
    sql = left(sql, len(sql)-3)
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open SQL , conn
    Citation Envoyé par miltonis Voir le message
    A quoi sert la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = left(sql, len(sql)-3)
    La requête sql, comme je la compose, se finira par un truc du genre "MACOL like '%"& tabRecherche(i) &"%' and" ce qui est syntaxiquement faux. Je compose donc ma clause where en mettant quoiqu'il arrive "and" à la fin de la chaîne. Je sais donc que quoiqu'il arrive j'ai "and" à la fin et que c'est faux, donc quoiqu'il arrive je le supprime.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 200
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par franculo_caoulene Voir le message
    Je crois que remplacer le caractère accentué ne me sert pas car il faudrait que je recense tous les mots susceptibles d'être demandés, et il y en a des centaines...!
    J'ai pas compris...
    Je veux dire que si je dois utiliser like '%r*pondez%' il faut aussi que j'utilise la même chose pour éléphant, mémoire, forêt, etc. Et il y a beaucoup trop de mots accentués pour tous les recenser.
    En fait, il faudrait une sorte de fonction qui enlève tous les accents et que la requête ne tienne pas compte si un caractère est accentué ou non. je sais qu'en PHP il y a qqchose de semblable mais en ASP...

    A moins que je n'aie encore compris de travers...

  8. #8
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Citation Envoyé par franculo_caoulene Voir le message
    J'ai pas fait la partie de remplacement, il faut utiliser les expressions régulières.

Discussions similaires

  1. Aide pour réaliser un moteur de recherche en Vba Excel
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/01/2009, 13h12
  2. Réponses: 4
    Dernier message: 13/03/2008, 11h46
  3. Aide pour un petit script
    Par perldebutant dans le forum Langage
    Réponses: 4
    Dernier message: 28/03/2006, 22h27
  4. Réponses: 2
    Dernier message: 02/03/2006, 12h57
  5. [débutant] Aide pour mettre une FOREIGN KEY sur une table
    Par cauldron dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2004, 18h16

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