Salut
J'ai un petit probleme pour l'implementation d'un moteur de recherche.
En gros la, mon moteur de recherche doit me renvoyer en sortie une liste de produit, plus ou moins pertinente se basant sur ces tables la :
table produits:
-id_produit
-name VARCHAR 100
-keywords FULLTEXT index
-description FULLTEXT index
table press
-id_press
-id_produit clef etrangere
-name VARCHAR 100
-description FULLTEXT index
table artistes
-id_artist
-id_produit clef etrangere
-name VARCHAR 100
-description FULLTEXT index
Je dois rechercher dans ces tables les occurences de ce que l'utilisateur saisie dans le champs (peut etre un mot, 2 ou plus !)
Je commence tout juste à mettre le nez dedans et apres pas mal de recherches (qui ne traite que de recherches dans une seul table) voici où j'en suis, attention c'est crade
Ca m'affiche des pertinences de 0, 1 ou 2, des entiers quoi.. ca me parait vraiment pas super.. surtout que c'est surement à cause du MODE BOOLEAN je m'en doute..
Mais je suis obligé de m'en servir la car dans ma recherche j'inclu des champs qui ne sont pas indexé, pas en full text( les name) donc comment faire mieu ?
Sinon mon systeme de 3requets me parait barbare ya t'il une facon de plier ca en une seul requete pour aller piocher dans les 3 table s?
Merci [/code]
J'ai un petit probleme pour l'implementation d'un moteur de recherche.
En gros la, mon moteur de recherche doit me renvoyer en sortie une liste de produit, plus ou moins pertinente se basant sur ces tables la :
table produits:
-id_produit
-name VARCHAR 100
-keywords FULLTEXT index
-description FULLTEXT index
table press
-id_press
-id_produit clef etrangere
-name VARCHAR 100
-description FULLTEXT index
table artistes
-id_artist
-id_produit clef etrangere
-name VARCHAR 100
-description FULLTEXT index
Je dois rechercher dans ces tables les occurences de ce que l'utilisateur saisie dans le champs (peut etre un mot, 2 ou plus !)
Je commence tout juste à mettre le nez dedans et apres pas mal de recherches (qui ne traite que de recherches dans une seul table) voici où j'en suis, attention c'est crade
Code:
$search = htmlentities(strip_tags($_POST["search_input"]),ENT_QUOTES,'UTF-8');
$array_score = array();
$req1 = "SELECT id_product, MATCH (name, description, keywords) AGAINST ('".$search."' IN BOOLEAN MODE) AS score
FROM product
WHERE MATCH (name, description, keywords) AGAINST ('".$search."' IN BOOLEAN MODE)
";
$req2 = "SELECT id_product, MATCH (name, description) AGAINST ('".$search."' IN BOOLEAN MODE) AS score
FROM press
WHERE MATCH (name, description) AGAINST ('".$search."' IN BOOLEAN MODE)
";
$req3 = "SELECT id_product, MATCH (name, description) AGAINST ('".$search."' IN BOOLEAN MODE) AS score
FROM product_feature
WHERE MATCH (name, description) AGAINST ('".$search."' IN BOOLEAN MODE)
";
//éxécution de la recherche
$res_array[] = $db->query($req1);
$res_array[] = $db->query($req2);
$res_array[] = $db->query($req3);
//récupération et addition des score de chaques produits
//TODO: on pourrait d'ailleurs pondérer le score de chaque requete en fonction de son importance ? score du req1 (product)
// semble par exemple plus importante que le score de req2 (press)
foreach($res_array as $res){
if ($res !== FALSE){
foreach ($res as $result){
$array_score[$result->id_product] += $result->score;
}
}
}
//on trie les produits selon leur pertinence
arsort($array_score);
//a ce stade on a un array de score dont chaque entrée identifié par l'id du product
//on va donc maintenant relier ce tableau à un nom et une description de produit
if(count($array_score) > 0){
foreach ($array_score as $key=>$value){
$oProduct = new Product($key);
$oProduct = $oProduct->get();
$html .= "<h3>".$oProduct->id_product."-".$oProduct->name."</h3>";
$html .= "<p>Pertinence : ".$value."</p>";
}
}
else $html .= "pas de résultats";
$page->BODY = $html;
Ca m'affiche des pertinences de 0, 1 ou 2, des entiers quoi.. ca me parait vraiment pas super.. surtout que c'est surement à cause du MODE BOOLEAN je m'en doute..
Mais je suis obligé de m'en servir la car dans ma recherche j'inclu des champs qui ne sont pas indexé, pas en full text( les name) donc comment faire mieu ?
Sinon mon systeme de 3requets me parait barbare ya t'il une facon de plier ca en une seul requete pour aller piocher dans les 3 table s?
Merci [/code]