8791 sujets

Développement web côté serveur, CMS

Bonjour Tout le monde,

Voila j'aimerai améliorer mon moteur de recherche sur mon site.

Exemple:

Entrée1:
Titre: Voiture bleu
Description: Une grande voiture bleu

Entrée2:
Titre: Voiture rouge
Description: Une grande voiture rouge

Si je recherche "voiture", mon moteur me trouve les deux entrée c'est très bien. Si je recherche "voiture bleu", mon moteur me trouve les deux entrée également or je voudrais dans ce cas qu'il n'affiche que l'expression exacte. C'est à dire uniquement entrée1.
Voila j'ai essayé quelques modifications sur le code mais ça ne fonctionne pas. Pourriez-vous m'aider s'il vous plaît?
Voici le code:
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';

}


Merci d'avance
Salut,
a écrit :
Si je recherche "voiture bleu", mon moteur me trouve les deux entrée également
Oui, c'est normal, tu splittes tes mots-clés sur les virgules ET les espaces :
$keywords = preg_split("/[\s,]+/", $text_search);
Donc tu finis par faire une recherche sur "voiture" (ce qui te sort tes deux résultats) ou "bleue", mais pas "voiture bleue".

En passant, je pense que ton code serait plus clair ainsi :
if (preg_match('/[^\s,]/', $text_search)) {

    $keywords = array_unique(explode(',', $text_search));

    for ($i=0; $i<count($keywords); $i++) {
        $kw = trim($keywords[$i]);
        $search .= ($i == 0 ? ' AND (' : ' OR ')
                . "a.ad_headline LIKE '%" . $kw . "%'"
                . " OR a.ad_text LIKE '%" . $kw . "%'";
    }

    $search .= ')';
}

$search .= ' AND a.published = 1';
Bonjour Marcv,

Tout d'abord merci beaucoup pour ton aide. J'ai essayé ton code ça fonctionne. Mais si tu as encore un peu de temps à me consacrer il y a encore deux choses que j'aimerais régler. J'aimerais que l'ordre des mots ne soit pas important. C'est à dire dans mon cas si je cherche "rouge voiture" ou "bleue voiture" je voudrais qu'il me trouve les entrées respectives...

J'aimerais aussi pouvoir faire une recherche de mots différents se trouvant dans le titre et dans la description.
Ex:
Titre: Voiture verte
Description: Bolide de courses

Dans mon cas si je cherche "voiture bolide" ça ne me trouve rien...

J'espère que mon explication est claire.
Si tu as une idée.

Merci beaucoup encore pour ton aide!

A plus
a écrit :
J'aimerais que l'ordre des mots ne soit pas important
[...]
J'aimerais aussi pouvoir faire une recherche de mots différents se trouvant dans le titre et dans la description
Je pense que ce serait plus dans l'ordre des choses que tu tentes d'abord d'y arriver tout seul, puis que tu nous montres ton code ici en cas de blocage/échec, qu'en penses-tu ? Smiley cligne
Salut,

J'ai testé ce code pour mon moteur de recherche et ca marche bien. Mais comment faire pour que, dans le cadre d'une recherche "A or B", les resultats qui incluent a la fois A et B soient les premiers dans la selection SQL (et seulement apres eux, les resultats qui ont A ou bien B) ?
Personne ne saurait? Je veux savoir comment on dit en SQL : "Cherche tout ce qui contient A ou B en commencant par ce qui contient les deux a la fois".
Pour ceux qui tomberaient sur le meme probleme, j'ai finalement fait comme ca :

SELECT foo
, CASE WHEN foo like 'A%' THEN 1 ELSE 0 END +
CASE WHEN foo like 'B%' THEN 1 ELSE 0 END +
CASE WHEN foo like 'C%' THEN 1 ELSE 0 END AS score
FROM daTable
ORDER
BY score
, foo