requete SQL pour moteur de recherche

  • Auteur de la discussion Auteur de la discussion Cid
  • Date de début Date de début
Nouveau WRInaute
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:
                $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]
 
WRInaute impliqué
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.
 
Nouveau WRInaute
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:
 
WRInaute impliqué
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.
 
Nouveau WRInaute
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++
 
Discussions similaires
Haut