Page 1 sur 1

recherche boléenne / AND OR

Posté : 03 avr. 2006, 00:41
par mankind
salut,

pour mon moteur de recherche plein texte, j'utilise le code suivant.
$select = 'SELECT art_id,titre,MATCH (titre,texte) AGAINST ("'.$lesmotsclefs.'" IN BOOLEAN MODE) AS score FROM articles WHERE MATCH (titre,texte) AGAINST ("'.$lesmotsclefs.'" IN BOOLEAN MODE) ORDER by score DESC';
ça marche très bien.

apparemment, c'est l'opérateur OR qui est retenu par défaut dans une recherche booléenne de ce type.

comment faire pour donner à l'utilisateur la possibilité de faire une recherche sur tous les mots (opérateur AND) ?

(est-ce qu'il faut traiter '.$lesmotsclefs.' en découpant la chaine pour isoler chaque mot et rajouter le signe + devant chaque mot... ?)

merci de votre aide.

Posté : 03 avr. 2006, 08:57
par Cyrano
À priori, je serais tenté de dire qu'il faudrait une clause MATCH par mot clé, chaque clause séparée des autres par un AND :-k

Posté : 03 avr. 2006, 15:16
par mankind
voici la solution que j'ai trouvé :

dans le formulaire je rajoute une option de recherche "tous les mots", "n'importe quel mot":

Code : Tout sélectionner

echo '<input type=text name=motsclefs>'; echo '&nbsp;&nbsp;&nbsp;&nbsp;'; echo '<select name=optionrech>'; echo '<option selected>tous les mots</option>'; echo "<option>n'importe quel mot</option>"; echo '</select>';
si c'est une recherche sur tous les mots, je rajoute un + devant chaque mot clé entré par l'utilisateur. si c'est une recherche sur n'importe quel terme, il n'y a rien à faire, c'est le mode de recherche plein texte par défaut de mysql.
if ($optionrech == "tous les mots") {

$listemotsclefs = explode(" ", $motsclefs);
$listedef = '';
foreach ( $listemotsclefs as $liste ) {
$listedef .= '+'.$liste.' ';
}

} 
else { $listedef = $motsclefs; }

en je finis par la requete php
$select = 'SELECT *,MATCH (titre,texte) AGAINST ("'.$listedef.'" IN BOOLEAN MODE) AS score FROM articles WHERE visible = "oui" AND rubrique = "'.$rubrique.'" AND MATCH (titre,texte) AGAINST ("'.$listedef.'" IN BOOLEAN MODE) ORDER by score DESC LIMIT 50';
voilà. merci.