fonction moteur de recherche

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : fonction moteur de recherche

Re: fonction moteur de recherche

par fabrice88250 » 22 sept. 2009, 20:51

ok merci.
pour la concatenation je comprend pas trop (en fait pas du tout) comment faire. du coup sa moblige a créé un champ suplementaire dans ma bdd ?
pouvez vous m'expliquer svp ?

sinon y'a til une autre solution que de faire un concatenation?

Re: fonction moteur de recherche

par Berzemus » 17 sept. 2009, 10:23

Pour la 3:
//(...)
$resultat=mysql_query("SELECT * FROM IWgalerie WHERE match(`type`,`ref`,`exemple`,`alt`) against ('$mot')");
$ligne=mysql_fetch_array($resultat); // <----------------- C'est quoi ça ?

   while($ligne = mysql_fetch_array($resultat))
          {
//(...)
   
Pour la 2: c'est normal. C'est pourquoi je propose d'utiliser une champ supplémentaire dans lequel tu concatène une version normalisée (sans majuscules, sans accents, sans ponctuation) de tout sur quoi tu veux chercher (type,ref, exemple et alt donc), beaucoup plus pratique pour faire une recherche dessus.

Pour la 1: il faut voir les paramètres de Mysql, d'origine la taille minimale des mots est de 3 lettres.
Dans le fichier de configuration de mysql, tu dois pouvoir trouver quelque chose qui ressemble à ceci:

Code : Tout sélectionner

[mysqld] ft_min_word_len=3
http://dev.mysql.com/doc/refman/5.1/en/ ... uning.html

Suffit de mettre 2 donc, et de refaire les index.

Re: fonction moteur de recherche

par fabrice88250 » 16 sept. 2009, 17:38

bon me revoilà car je m'apercoi que sa fonctionne pas si bien que ça finalement.

je me retrouve apres test face a 3 problemes :

1- lorsque je fait ma recherche par exemple sur le mot "lac" je n'ai pas de resultats alors que dans mes champs j'ai bien des données qui contiennent le mot lac en texte ex : "Photo aérienne de la tour de la merelle et le lac de gérardmer ".
me revoilà donc dans un nouveau probléme...

2- Dans ma recherche si je rentre "gerardmer" j'ai pas de résultat à cause de l'accent. y'a t'il un moyen pour ne pas tenire compte des accents lors de la recherche et ainsi si un internaute rentre "gerardmer" il obtiendra les resultats avec "gérardmer" et "gerardmer".?

3- si je fais une recherche avec mysql pour par exemple sur le mot "paysages" : j'ai 15 resultats qui ressortent. maintenant si je passe par mon moteur de recherche avec la meme recherche je n'ai que 14 résultats. J'ai donc un resulat qui se perd quelque par.... (j'ai testé avec d'autres mot c'est pareil, un resultat en moins sur toutes les recherches)


ma fonction de recherche est la suivante :
<?php
include("../admin/connexion-sql.php");

function search()
          {
$champ=$_POST['rechercherpar'];
$mot=$_POST['mot_cle'];

$resultat=mysql_query("SELECT * FROM IWgalerie WHERE match(`type`,`ref`,`exemple`,`alt`) against ('$mot')");
$ligne=mysql_fetch_array($resultat);

   while($ligne = mysql_fetch_array($resultat))
          {
   $ref=$ligne['ref'];
   $alt=$ligne['alt'];
   $type=$ligne['type'];
 echo $ligne['id'].' '.$type.' '.$ref.' '.$alt.'
<img src="../pages/mini-galerie.php?f='.$ligne['photoref'].'" alt="'.$ligne['alt'].'" border="0" width="168px" height="113px" class="reflect rheight31 ropacity33"/><br/>';
          }
          }
search();
?>

Re: fonction moteur de recherche

par fabrice88250 » 16 sept. 2009, 17:05

Bon ok j'ai vue... j'avais ecri 2 fois --> $ligne = mysql_fetch_array($resultat).
c'est bon sa fonctionne. merci pour votre patience et votre savoir.

Re: fonction moteur de recherche

par AB » 16 sept. 2009, 16:53

#-o #-o l'extrait de ton code que j'ai cité juste après devrait te mettre sur la bonne voie.

Re: fonction moteur de recherche

par fabrice88250 » 16 sept. 2009, 16:49

Berze vient de te dire que si ta requête fonctionne sous phpMyadmin c'est que l'erreur se situe ailleurs dans le code
ok j'ai bien compris et je ne voi toujours pas ou est mon erreur puisque j'ai bien des resultas mais pas complet..

Re: fonction moteur de recherche

par AB » 16 sept. 2009, 16:41

SELECT * FROM IWgalerie WHERE match(`type`,`ref`,`exemple`,`alt`) against ('corbeaux')");
Berze vient de te dire que si ta requête fonctionne sous phpMyadmin c'est que l'erreur se situe ailleurs dans le code :!: :wink:

$ligne=mysql_fetch_array($resultat);

   while($ligne = mysql_fetch_array($resultat))
          {//...

Re: fonction moteur de recherche

par fabrice88250 » 16 sept. 2009, 16:12

ah oui très bonne idée. j'ai donc fait le requette dans mysql et il me resort bien tous les enregistrement qui contiennent "corbeaux"
SELECT * FROM IWgalerie WHERE match(`type`,`ref`,`exemple`,`alt`) against ('corbeaux')");
mais je ne voi pas mon erreur dans mon code et pourquoi il ne me ressort qu'un seul enregistrement alors que mysql me les sort tous...

Re: fonction moteur de recherche

par Berzemus » 16 sept. 2009, 16:06

Le moyen le plus rapide pour voir d'ou peut venir le problème, c'est d'essayer la requête sous phpmyadmin. Si les résultats sont bon, c'est que le problème se situe dans le code.

Re: fonction moteur de recherche

par fabrice88250 » 16 sept. 2009, 15:57

bon j'avais aps mal avancé et j'avais modifié ma requette en fonction du fulltext. (question : si je laisse le nom sur fulltext est ce que sa change qqc ?)

par contre j'ai un probleme et je comprend pas pourquoi. dans mes champs j'ai pusieurs enregistrements qui contiennent le mot "corbeaux" et lorsque je lance ma recherche je n'ai qu'un seul enregistrement qui resort.

voilà ma fonction modifié :
<?php
include("../admin/connexion-sql.php");

function search()
          {
$champ=$_POST['rechercherpar'];
$mot=$_POST['mot_cle'];

$resultat=mysql_query("SELECT * FROM IWgalerie WHERE match(`type`,`ref`,`exemple`,`alt`) against ('$mot')");
$ligne=mysql_fetch_array($resultat);

   while($ligne = mysql_fetch_array($resultat))
          {
   $ref=$ligne['ref'];
   $alt=$ligne['alt'];
   $type=$ligne['type'];
 echo $ligne['id'].' '.$type.' '.$ref.' '.$alt.'
<img src="../pages/mini-galerie.php?f='.$ligne['photoref'].'" alt="'.$ligne['alt'].'" border="0" width="168px" height="113px"/><br/>';

          }
          }
search();
?>

Re: fonction moteur de recherche

par Berzemus » 16 sept. 2009, 15:39

Nul besoin de donner un nom à l'index fulltext, simplement définir quels champs seront utilisés suffit.
CREATE TABLE `IWgalerie` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `type` varchar(40) collate latin1_german2_ci default NULL,
  `ref` varchar(20) collate latin1_german2_ci default NULL,
  `exemple` varchar(20) collate latin1_german2_ci default NULL,
  `alt` text collate latin1_german2_ci,
  `photoref` varchar(255) collate latin1_german2_ci default NULL,
  `photoex` varchar(255) collate latin1_german2_ci default NULL,
  PRIMARY KEY  (`id`),
  FULLTEXT (`type`,`ref`,`exemple`,`alt`)
) ENGINE=MyISAM AUTO_INCREMENT=86 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=86 ;


Ensuite, une requête telle que celle-ci devrait fonctionner:
select * from IWgalerie where match(`type`,`ref`,`exemple`,`alt`) against ('mots')
select * from IWgalerie where match(`type`,`ref`,`exemple`,`alt`) against ('mots' IN NATURAL LANGUAGE MODE)
Et même avec un score:
select id, match(`type`,`ref`,`exemple`,`alt`)  from IWgalerie where match(`type`,`ref`,`exemple`,`alt`) against ('mots')
Et ainsi de suite, match() against() te donne une infinie suite de possibilité et d'optimisations.
Le mieux, ceci dit, est d'ajouter un champ TEXT à ta table dans laquelle tu concatène tous les champs qui t'intéressent, sous forme normalisée, pour rendre l'indexation et la recherche plus rapide.

Re: fonction moteur de recherche

par fabrice88250 » 16 sept. 2009, 14:48

voilà ma table actuel avec le fulltext:

CREATE TABLE `IWgalerie` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`type` varchar(40) collate latin1_german2_ci default NULL,
`ref` varchar(20) collate latin1_german2_ci default NULL,
`exemple` varchar(20) collate latin1_german2_ci default NULL,
`alt` text collate latin1_german2_ci,
`photoref` varchar(255) collate latin1_german2_ci default NULL,
`photoex` varchar(255) collate latin1_german2_ci default NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `recherche` (`type`,`ref`,`exemple`,`alt`)
) ENGINE=MyISAM AUTO_INCREMENT=86 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=86 ;

Re: fonction moteur de recherche

par Berzemus » 16 sept. 2009, 13:44

D'accord. Tu sais nous mettre un export de la structure de ta DB ? (export, create table et tout ça).

Re: fonction moteur de recherche

par fabrice88250 » 16 sept. 2009, 13:33

bon ok j'ecoute vos conseils alors je vais me tourné vers FULLTEXT.
j'ai donc crée un fulltext dans index en y mettant les champs important.

après je ne comprend pas bien comment refaire mon moteur de recherche.

Re: fonction moteur de recherche

par Berzemus » 16 sept. 2009, 13:05

Agité à raison, fulltext est le moteur de recherche intégré de mysql, like %% n'est pas une fonctionnalité de recherche, et l'utiliser comme tel est une erreur.

Il ne te faut pas créer de nouveaux champs, juste un nouvel index sur des champs existants (de type texte ou varchar, si je me souviens bien).

Et après tu auras une vrai fonctionnalité de recherche, plutôt qu'une comparaison bancale.