Modification au pointage des résultats de recherche...
J’ai apporté une modification au fichier recherche_to_array.php pour améliorer la pertinence des résultats de recherche pour un site et je me suis dis que cela pourrais être pertinent pour le moteur de recherche de spip en général…
Je ne suis pas sur que ce soit le code le plus optimal ou que l’ajustement apporté au scores soit tout-a-fait adéquat, mais si ça peut donner des idées a du monde plus qualifié, tant mieux ! ;)
Le code original :
foreach ($champs as $champ => $poids) { $champ = explode('.',$champ); $champ = end($champ); // translitteration_rapide uniquement si on est deja en utf-8 $value = ($GLOBALS['meta']['charset']=='utf-8' ? translitteration_rapide($t[$champ]) : translitteration($t[$champ])); if ($n = ($options['score'] || $options['matches']) ? preg_match_all($preg, $value, $regs, PREG_SET_ORDER) : preg_match($preg, $value) ) { $vu = true; if ($options['champs']) $champs_vus[$champ] = $t[$champ]; if ($options['score']) $score += $n * $poids; if ($options['matches']) $matches[$champ] = $regs; if (!$options['champs'] AND !$options['score'] AND !$options['matches']) break; } }
Que j’ai remplacé par :
foreach ($champs as $champ => $poids) { $champ = explode('.',$champ); $champ = end($champ); // translitteration_rapide uniquement si on est deja en utf-8 $value = ($GLOBALS['meta']['charset']=='utf-8' ? translitteration_rapide($t[$champ]) : translitteration($t[$champ])); if ($n = ($options['score'] || $options['matches']) ? preg_match_all($preg, $value, $regs, PREG_SET_ORDER) : preg_match($preg, $value) ) { $vu = true; if ($options['champs']) $champs_vus[$champ] = $t[$champ]; if ($options['score']) { // ICI, je vérifié au niveau du retour donné par pref_match_all si la chaine qui a été trouvé est une chaine de plusieurs mot… Si oui, alors au niveau du score, on augmente son score puisque cela signifie que la chaine complète a été trouvé… Et ça ne bloque pas la recherche sur les mots séparé… $recherche_mots = explode(' ', $regs[0][0]); if (count($recherche_mots) > 1) { $score += $n * $poids * 3; } else { // ICI, si on a un seul mot au niveau de la recherche et que ce mot est trouvé comme mot entier et non pas comme faisant parti d’un autre mot, il est pertinent d’augmenter le score la aussi selon moi ! $new_preg = '/\b('.$regs[0][0].')\b/UimsSu'; $string_entiere = preg_match($new_preg,$value); if ($string_entiere > 0) { $score += $n * $poids * 3; } else { $score += $n * $poids; } } }