Mais comment puis-je faire correspondre TST-DFS si l'utilisateur a tapé TST DFS ?
J'aimerais que cette UGS ait une pertinence de disons 8, au lieu des 10
Si j'ai bien compris la question, la réponse est en fait facile.
Eh bien, si vous forgez votre requête un peu avant de l'envoyer à mysql.
Ok, disons que nous avons $query
et il contient TST-DFS
.
Est-ce qu'on va se concentrer sur portées des mots ? Je suppose que nous devrions, comme le font la plupart des moteurs de recherche donc :
$ok=preg_match_all('#\w+#',$query,$m);
Maintenant si ce modèle correspondait ... $m[0]
contient le liste de mots en $query
.
Vous pouvez l'adapter à votre UGS, mais la correspondance avec les mots complets de manière ET est à peu près ce que l'utilisateur présume. (comme cela se passe sur google et yahoo)
Ensuite, nous devons préparer un $expr
expression qui sera injecté dans notre requête finale.
if(!$ok) { // the search string is non-alphanumeric
$expr="false";
} else { // the search contains words that are no in $m[0]
$expr='';
foreach($m[0] as $word) {
if($expr)
$expr.=" AND "; // put an AND inbetween "LIKE" subexpressions
$s_word=addslashes($word); // I put a s_ to remind me the variable
// is safe to include in a SQL statement, that's me
$expr.="word LIKE '%$s_word%'";
}
}
Maintenant $expr
devrait ressembler à "words LIKE '%TST%' AND words LIKE '%DFS%'"
Avec cette valeur, nous pouvons construire la requête finale :
$s_expr="($expr)";
$s_query=addslashes($query);
$s_fullquery=
"SELECT (Product,word,if((word LIKE '$s_query'),relevancy,relevancy-2) as relevancy) ".
"FROM some_index ".
"WHERE word LIKE '$s_query' OR $s_expr";
Qui se lit, pour "TST-DFS" :
SELECT (Product,word,if((word LIKE 'TST-DFS'),relevancy,relevancy-2) as relevancy)
FROM some_index
WHERE word LIKE 'TST-DFS' OR (word LIKE '%TST%' AND word LIKE '%DFS%')
Comme vous pouvez le voir, dans le premier SELECT
ligne, si la correspondance est partielle, mysql retournera relevancy-2
Dans le troisième, le WHERE
clause, si la correspondance complète échoue, $s_expr
, la requête de correspondance partielle que nous avons préparée à l'avance est essayé à la place.