Recherche dans plusieurs tables/champs en fulltext et non full text :/

Recherche dans plusieurs tables/champs en fulltext et non full text :/ - SQL/NoSQL - Programmation

Marsh Posté le 22-06-2007 à 18:23:24    

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
-name  VARCHAR 100  
-description FULLTEXT index  
 
table artistes
-id_artist
-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 :
  1. $search = htmlentities(strip_tags($_POST["search_input"]),ENT_QUOTES,'UTF-8');
  2.  $array_score = array();
  3.  $req1 = "SELECT id_product, MATCH (name, description, keywords) AGAINST ('".$search."' IN BOOLEAN MODE) AS score
  4.       FROM product
  5.    WHERE MATCH (name, description, keywords) AGAINST ('".$search."' IN BOOLEAN MODE)
  6.    ";
  7.  $req2 = "SELECT id_product, MATCH (name, description) AGAINST ('".$search."' IN BOOLEAN MODE) AS score
  8.       FROM press
  9.    WHERE MATCH (name, description) AGAINST ('".$search."' IN BOOLEAN MODE)
  10.    ";
  11.  $req3 = "SELECT id_product, MATCH (name, description) AGAINST ('".$search."' IN BOOLEAN MODE) AS score
  12.       FROM product_feature
  13.    WHERE MATCH (name, description) AGAINST ('".$search."' IN BOOLEAN MODE)
  14.    ";
  15.  //éxécution de la recherche
  16.  $res_array[] = $db->query($req1);
  17.  $res_array[] = $db->query($req2);
  18.  $res_array[] = $db->query($req3);
  19.  //récupération et addition des score de chaques produits
  20.  //TODO: on pourrait d'ailleurs pondérer le score de chaque requete en fonction de son importance ? score du req1 (product)
  21.  // semble par exemple plus importante que le score de req2 (press)
  22.  foreach($res_array as $res){
  23.   if ($res !== FALSE){
  24.    foreach ($res as $result){
  25.     $array_score[$result->id_product] += $result->score;
  26.    }
  27.   }
  28.  }
  29.  //on trie les produits selon leur pertinence
  30.  arsort($array_score);
  31.  //a ce stade on a un array de score dont chaque entrée identifié par l'id du product
  32.  //on va donc maintenant relier ce tableau à un nom et une description de produit
  33.  if(count($array_score) > 0){
  34.   foreach ($array_score as $key=>$value){
  35.    $oProduct = new Product($key);
  36.    $oProduct = $oProduct->get();
  37.    $html .= "<h3>".$oProduct->id_product."-".$oProduct->name."</h3>";
  38.    $html .= "<p>Pertinence : ".$value."</p>";
  39.   }
  40.  }
  41.  else $html .= "pas de résultats";
  42.  $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 :p ya t'il une facon de plier ca en une seul requete pour aller piocher dans les 3 table s?
 
Merci ;)

Reply

Marsh Posté le 22-06-2007 à 18:23:24   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed