8796 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un soucis, mon moteur de recherche ne trouve que des expressions exactes. Par exemple si un utilisateur à posté une annonce comme ceci:
"petite voiture verte diesel"

Si j'entre "petite voiture" dans mon moteur, c'est bon il trouve l'annonce. Par contre si j'entre "petite verte", il ne me trouve rien.

Savez-vous comment je pourrais modifier ce code pour que mon moteur trouve l'annonce en tapant deux mots contenus dans l'annonce mais qui ne se suivent pas forcément?

if ($text_search <> "") {
		$search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') AND a.published = 1";
	}
	else
		$search .= " AND a.published = 1";


Merci d'avance
Modifié par hazmoon (27 Mar 2009 - 12:36)
Un LIKE "%petite%verte%" devrait répondre à la question.
D'où une première possibilité d'extension des recherhes en remplaçant, au préalable, les espaces par des % :
$text_search=str_replace(" ","%",$text_search);

Mais, l'on pourrait aller plus loin en changeant, par exemple, l'ordre des mots avec une ou plusieurs expressions régulières... Voir aussi l'interclassement des données qui peut modifier les résultats obtenus avec des traitements différenciés des majuscules et des accents.
Salut,

Julien de Prabere a écrit :
Un LIKE "%petite%verte%" devrait répondre à la question.
Hmm... pas très utile puisque LIKE "%verte%petite%" ne ramènera pas l'enregistrement. Smiley murf

Tu pourrais faire quelque chose comme ça :
if(trim(preg_replace("/[\s,]+/", '', $text_search)) != '') {
	$keywords = preg_split("/[\s,]+/", $text_search);
	$keywords = array_unique($keywords);
	$search .= ' AND (';
	$prefix = '';
	for($i = 0; $i < count($keywords); $i++) {
		$search .= $prefix."a.ad_text LIKE '%".$keywords[$i]."%' ";
		$prefix = 'OR ';
	}
	$search .= ') AND a.published = 1';
} else {
	$search .= ' AND a.published = 1';
}

Sinon, et c'est fait pour ça, tu pourrais regarder du côté des index de type FULLTEXT (je te laisse faire une recherche)...
Modifié par Heyoan (04 Aug 2009 - 20:08)
Whaouh!!! C'est beau! Ca marche!

Merci mille fois Julien de Prabere! C'est vraiment excellent!

Sinon tu parle du fulltext, comment ça marche? Qu'est ce que ça apporte en plus?

Merci encore
Si, Si ! Même s’il peut être préférable de rechercher les mots indépendamment les uns des autres, le signe % remplace toute chaîne de caractère et la solution proposée fonctionne parfaitement, malgré les doutes et affirmations péremptoires du modérateur !
Oups! Smiley confused

Je me suis trompé de pseudo! En fait Julien de Prabere ta solution marche, mais c'est celle de Heyoan que j'ai utilisé.

Merci beaucoup à vous deux.

Et je réitère ma question à Heyoan. Quel est l'avantage du fulltext par rapport à ce que j'utilise?
Fulltext permet d'indexer, un ou plusieurs champs, texte de manière à faire des recherches plus larges en classant les résultats par valeur de pertinence...etc.
Voir Mysql et fulltext sur Google pour aboutir à cette page
Julien de Prabere a écrit :
la solution proposée fonctionne parfaitement, malgré les doutes et affirmations péremptoires du modérateur !
Euh... Paix sur la terre Julien ! Smiley hippy

Il m'arrive bien sûr de me gourrer et dans ces cas là il suffit de me le faire (gentiment ?) remarquer.

En l'occurrence j'avais effectué un test avant de répondre et pour un enregistrement contenant "petite voiture verte diesel" :
...LIKE "%petite%verte%" va fonctionner.
...LIKE "%verte%petite%" ne va pas fonctionner.

Comme je suis actuellement au taf je ne peux pas refaire le test tout de suite mais bon, dans le doute tu peux toujours le faire de ton côté, et si je me suis effectivement gourré tu n'auras qu'à me le faire (gentiment ?) remarquer.
Bonjour Heyoan,

Ca marche parfaitement merci beaucoup!

Puis-je encore abuser de tes services. Toujours pour ce même moteur de recherche: quand je fais une recherche sur un ou plusieurs mots, après avoir validé ma requête les mots restent dans la zone de recherche à éditer. Ca c'est bon, c'est ce que je veux.

Mon soucis c'est si je veux modifier un de ces mots, si je clique dans la zone d'édition des mots-clés, tous disparait! Or je voudrais que ça reste en place pour pouvoir modifier un mot ou une faute d'orthographe.

Comment faire? Une idée?

Voici ce que j'ai dans le cache activation:
$text_search = mosGetParam($_GET,'text_search','');


Merci d'avance
Julien de Prabere a écrit :
Fulltext permet d'indexer, un ou plusieurs champs, texte de manière à faire des recherches plus larges en classant les résultats par valeur de pertinence...etc.
Voir Mysql et fulltext sur Google pour aboutir à cette page


Merci je vais regarder ça de plus prêt!
Hello,

hazmoon a écrit :
Mon soucis c'est si je veux modifier un de ces mots, si je clique dans la zone d'édition des mots-clés, tous disparait!
Cela ressemble à priori à du JavaScript (genre onfocus="this.value='';"). Si c'est bien ça c'est à supprimer AMHA puisque, comme tu as pu t'en rendre compte, c'est anti-ergonomique au possible.

PS : je confirme que la solution ... LIKE "%mot1%mot2%" ne retourne l'enregistrement que si mot1 est placé avant mot2 dans la chaîne.
Whaou! Je suis époustouflé! Tu as de nouveau raison!

J'avais ça:
<input class="inputbox" type="text" name="text_search" value="<?php echo $text_search; ?>" onblur="if(this.value=='') this.value='<?php echo $text_search; ?>';" onfocus="if(this.value=='<?php echo $text_search; ?>') this.value='';"/>


J'ai viré le js, pour avoir ça:
<input class="inputbox" type="text" name="text_search" value="<?php echo $text_search; ?>" />


Ca marche nickel!!!

Un grand MERCI!!!
hazmoon a écrit :
Whaou! Je suis époustouflé! Tu as de nouveau raison!
Smiley wingol

hazmoon a écrit :
Ca marche nickel!!!

Un grand MERCI!!!
Tu es le bienvenu.

Si tu considères que ce sujet est [Résolu] merci de l'indiquer en éditant ton premier post et en modifiant le titre. Smiley cligne
Salut Heyoan,

j'ai encore un soucis. Je crois que dans le code que tu m'as donné tu as oublié le champ ad_headline. Du coup le moteur ne recherche que dans la description (ad_text).

Pourrais-tu s'il te plait me dire comment faire pour rectifier cela?

Merci d'avance
Modifié par hazmoon (26 Mar 2009 - 15:35)
Bon je crois que j'ai trouvé, j'ai inséré le champ ad_headline et ça à l'air de marcher!

if(trim(preg_replace("/[\s,]+/", '', $text_search)) != '') {

	$keywords = preg_split("/[\s,]+/", $text_search);

	$keywords = array_unique($keywords);

	$search .= ' AND (';

	$prefix = '';

	for($i = 0; $i < count($keywords); $i++) {

		$search .= $prefix."a.ad_headline LIKE '%".$keywords[$i]."%' ";

		$prefix = 'OR ';

	}
	
		for($i = 0; $i < count($keywords); $i++) {

		$search .= $prefix."a.ad_text LIKE '%".$keywords[$i]."%' ";

		$prefix = 'OR ';

	}

	$search .= ') AND a.published = 1';

} else {

	$search .= ' AND a.published = 1';

}
Smiley langue
Bonjour,

Juste pour faire une petite suggestion : ne pourrait-on pas concaténer ad_text et ad_headline ?

if(trim(preg_replace("/[\s,]+/", '', $text_search)) != '') {

	$keywords = preg_split("/[\s,]+/", $text_search);

	$keywords = array_unique($keywords);

	$search .= ' AND (';

	$prefix = '';
        $ad_text_headline = a.ad_text . a.ad_headline;
	for($i = 0; $i < count($keywords); $i++) {

		$search .= $prefix."$ad_text_headline LIKE '%".$keywords[$i]."%' ";

		$prefix = 'OR ';

	}
	
		for($i = 0; $i < count($keywords); $i++) {

		$search .= $prefix."a.ad_text LIKE '%".$keywords[$i]."%' ";

		$prefix = 'OR ';

	}

	$search .= ') AND a.published = 1';

} else {

	$search .= ' AND a.published = 1';

}

Fred
Modifié par Heyoan (30 Mar 2009 - 19:34)