Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Langages serveur > ASP
ASP Forum sur la programmation ASP. Avant de poster : Cours ASP, FAQ ASP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/02/2008, 11h55   #1
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 180
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 180
Points : 29
Points : 29
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 :
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.
miltonis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 12h33   #2
Expert Confirmé
 
Avatar de franculo_caoulene
 
Inscription : octobre 2003
Messages : 2 886
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 886
Points : 2 559
Points : 2 559
Salut,

Quelle base de données utilises-tu?
__________________
Penser à la recherche et au bouton
franculo_caoulene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 13h37   #3
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 810
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 810
Points : 3 011
Points : 3 011
Bonjour,

Apparemment, c'est de l'Access.

As-tu essayé comme ça ?

Code :
1
2
 
WHERE ucase(titre) LIKE '%"& ucase(mot) & "%'
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 14h16   #4
Expert Confirmé
 
Avatar de franculo_caoulene
 
Inscription : octobre 2003
Messages : 2 886
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 886
Points : 2 559
Points : 2 559
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 :
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 :
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.
__________________
Penser à la recherche et au bouton
franculo_caoulene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 16h36   #5
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 180
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 180
Points : 29
Points : 29
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)
Citation:
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 :
sql = left(sql, len(sql)-3)
?

merci
miltonis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 17h01   #6
Expert Confirmé
 
Avatar de franculo_caoulene
 
Inscription : octobre 2003
Messages : 2 886
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 886
Points : 2 559
Points : 2 559
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 :
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 :
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 :
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.
__________________
Penser à la recherche et au bouton
franculo_caoulene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 17h33   #7
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 180
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 180
Points : 29
Points : 29
Citation:
Envoyé par franculo_caoulene Voir le message
Citation:
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...
miltonis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2008, 14h10   #8
Expert Confirmé
 
Avatar de franculo_caoulene
 
Inscription : octobre 2003
Messages : 2 886
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 886
Points : 2 559
Points : 2 559
Citation:
Envoyé par franculo_caoulene Voir le message
J'ai pas fait la partie de remplacement, il faut utiliser les expressions régulières.
__________________
Penser à la recherche et au bouton
franculo_caoulene est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h25.


 
 
 
 
Partenaires

Hébergement Web