requete SQL pour moteur de recherche

Cid
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 4
Inscription: 24 Juin 2007

requete SQL pour moteur de recherche

Message le Dim Juin 24, 2007 3:42

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

Code: Tout sélectionner
                $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 :p ya t'il une facon de plier ca en une seul requete pour aller piocher dans les 3 table s?

Merci ;)[/code]


f_trt
WRInaute impliqué
WRInaute impliqué
 
Messages: 927
Inscription: 17 Sep 2005

Message le Dim Juin 24, 2007 8:23

Si ta base produit n'est pas mise à jour toutes les minutes tu gagnerais a faire une table de recherche qui serait peuplé soit une fois par jour soit a chaque mise a jour produit ainsi tu ferais une requete simple dans une table dédié à cela qui te renverrai la liste des bons produits.
Le gros avantage, c'est simple et surtout te permettra de tenir de grosse charge visiteur.

Cid
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 4
Inscription: 24 Juin 2007

Message le Dim Juin 24, 2007 13:54

HUm merci de ta reponse ;)

En effet ce n'est pas bete du tout, c'est en quelque sorte un systeme de cache

Je vais m'y pencher mais comment oraganiser cette table "recherche"
jy met :
id_produit
name
description
keywords
name (press)
description (press)
name (artist)
description (artiste)

?
Tout ca en fulltext?
C'est vachement rendondant quand meme

ou alors je fais une table contenant :
-id_produit
-keywords
où je m'occupe moi meme de generer et ajouter des keywords a la creation d'un produit et à l'ajout d'un artiste/article de presse relatif a ce produit ? (ca me semble plus logique :p)

:hello:


f_trt
WRInaute impliqué
WRInaute impliqué
 
Messages: 927
Inscription: 17 Sep 2005

Message le Dim Juin 24, 2007 21:21

Oui je ferais id_produit + keyword mais en automatique c'est a dire que ce ne soit pas toi qui les saisissent mais qu'a chaque enregistrement ton script vire les mots de 2 lettres et garde que les mots, regarde phpdig tu télécharges et regarde les sources il y a de mémoire déjà des listes de mots qui ne servent pas a grand chose dans l'indexation.

C'est aussi une des possibilité aussi a laquelle je viens de penser c'est d'utiliser ton propre moteur en mettant par exemple phpdig c'est relativement interressant car c'est une recherche full page comme un vrai moteur c'est a dire que même tes conditions de ventes ou des fiches annexes répondraient dans les recherches.

Cid
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 4
Inscription: 24 Juin 2007

Message le Dim Juin 24, 2007 21:43

OK pour tout ca ;)

J'ai déja codé une fonction qui genere les keywords etelimine les mots de moins de 4 lettres en fonction du nom du produit de sa description et de son arborescence (categorie, sous cat 1, etc)

Par contre j'etais en train d'alimenter moi meme un dico de mots à bannir (avec, sans, pour, etc) Mais tu me dit qu'il ya une petit biblio deja crée? super !

Sinon je ne connais pas phpdig, mais vu que je touche au but avec mon propre moteur, autant continuer avec, on verra pour un prochain site ;)

A++


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google Images

  • Analyse du positionnement
    AgentWebRanking est un logiciel professionnel qui permet d'analyser le positionnement d'un ou plusieurs sites dans plus de 300 moteurs de recherche dans le monde. Vous pouvez ainsi analyser les performances du référencement pour de nombreux mots-clés.
  • Transformer des simples citations de votre site en liens
    Cet outil vous permet de trouver des pages citant votre site mais ne faisant pas (encore) de lien. Il suffira parfois d'un simple mail pour transformer cette simple citation en lien (backlink).


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités