IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Recherche par pertinence PostgreSQL


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 31
    Par défaut Recherche par pertinence PostgreSQL
    Bonsoir,

    Je fais mes débuts avec PostgreSQL et je dois réaliser un petit moteur de recherche pour les articles de mon site.
    Pour chercher le titre, j'ai pensé à utiliser la recherche plein texte.

    Voici ce que j'ai rapidement codé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?php
    if((isset($_POST['RechercherArticle'])) && (!empty($_POST['Titre']) || !empty($_POST['Categorie']) || !empty($_POST['Periode']) || !empty($_POST['Sexe']) || !empty($_POST['Age']) || !empty($_POST['Licence'])))
    {
    	$sql	=	"SELECT membre.id_membre, article.id_article, titre_article, SUBSTR(contenu_article, 0, 400) AS contenu, 
    						parution_article, vignette_article, pseudo_membre, COALESCE(com.nbcommentaire, 0) AS nbcom, COALESCE(note.nbavis, 0) AS nbav
    				FROM	article
    				JOIN	membre ON membre.id_membre = article.id_membre
    				LEFT OUTER JOIN(
    					SELECT COUNT(*) AS nbcommentaire, id_article FROM commentaire GROUP BY id_article 
    				) AS com
    				ON com.id_article = article.id_article
    				LEFT OUTER JOIN(
    					SELECT COUNT(*) AS nbavis, id_article FROM note_article GROUP BY id_article
    				) AS note
    				ON note.id_article = article.id_article
    				WHERE ";
     
    	if(!empty($_POST['Titre']) || !empty($_POST['Categorie']) || !empty($_POST['Periode']) || !empty($_POST['Sexe']) || !empty($_POST['Age']) || !empty($_POST['Licence']))
    	{
    		if(!empty($_POST['Titre'])){ 				$sql .= "to_tsvector('french', titre_article) @@ to_tsquery('french', '".SecuBDD($_POST['Titre'])."')"; }
    		if(!empty($_POST['Categorie'])){		 	$sql .= "categorie_article = ".SecuBDD($_POST['Categorie'])." AND "; }
    		if(!empty($_POST['Periode'])){ 				$sql .= "periode_article = ".SecuBDD($_POST['Periode'])." AND "; }
    		if(!empty($_POST['Sexe'])){ 				$sql .= "sexe_article = ".SecuBDD($_POST['Sexe'])." AND "; }
    		if(!empty($_POST['tranche_age_article'])){ 	        $sql .= "sexe_article = ".SecuBDD($_POST['Age'])." AND "; }
    		if(!empty($_POST['Licence'])){ 				$sql .= "licence_article = ".SecuBDD($_POST['Licence'])." AND "; }
     
    		$sql					=	substr($sql, 0, -5);
    		// $RechercheArticle		=	pg_query($sql);
    		echo $sql;
    	}
    }
    Je test avec le mot "Premier" :

    Voici la requête générée :

    SELECT membre.id_membre, article.id_article, titre_article, SUBSTR(contenu_article, 0, 400) AS contenu, parution_article, vignette_article, pseudo_membre, COALESCE(com.nbcommentaire, 0) AS nbcom, COALESCE(note.nbavis, 0) AS nbav
    FROM article
    JOIN membre ON membre.id_membre = article.id_membre
    LEFT OUTER JOIN( SELECT COUNT(*) AS nbcommentaire, id_article FROM commentaire GROUP BY id_article ) AS com ON com.id_article = article.id_article
    LEFT OUTER JOIN( SELECT COUNT(*) AS nbavis, id_article FROM note_article GROUP BY id_article ) AS note ON note.id_article = article.id_article
    WHERE to_tsvector('french', titre_article) @@ to_tsquery('french', 'Prem
    Voici le message d'erreur :

    Warning: pg_query() [function.pg-query]: Query failed: ERREUR: chaîne entre guillemets non terminée sur ou près de « 'Prem » LINE 13: ...ector('french', titre_article) @@ to_tsquery('french', 'Prem ^ in E:\EasyPHP\www\ExposePG\articles.php on line 321
    J'ai du mal à comprendre pourquoi le mot recherché, n'est pas affiché en entier et comme résoudre l'erreur.

    Merci à vous.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    C'est plus une question php que postgres mais cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $sql					=	substr($sql, 0, -5);
    supprimant les 5 derniers caractères de la phrase SQL, on peut imaginer que la phrase SQL résultante est invalide. Ce qu'on imagine moins c'est à quoi ce code peut servir?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 31
    Par défaut
    Bonjour,

    Effectivement l'erreur vient de là, j'avais complétement oublié le substr.
    Pour information, ce bout de code permet de supprimer le AND à la fin de la requête.

    Ce script permet de sélectionner les articles selon plusieurs critères au choix.

    Affaire résolu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql .= "to_tsvector('french', titre_article) @@ to_tsquery('french', '".SecuBDD($_POST['Titre'])."') AND ";
    Merci de m'avoir aider !

    Le moteur de recherche, fonctionne avec un seul terme.
    Quand je test avec deux termes, j'ai cette erreur :

    Warning: pg_query() [function.pg-query]: Query failed: ERREUR: erreur de syntaxe dans tsquery : « Premier article » in E:\EasyPHP\www\ExposePG\articles.php on line 323

  4. #4
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Le moteur de recherche, fonctionne avec un seul terme.
    Quand je test avec deux termes, j'ai cette erreur :

    Postez votre requête générée avec deux critères que nous puissions vous aider...

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Il faut utiliser plainto_tsquery() au lieu de to_tsquery() si c'est pour lui passer une chaine qui ne soit pas déjà préformatée.
    Concrètement, plainto_tsquery('french', 'terme1 terme2') devrait être équivalent à to_tsquery('french', 'terme1 & terme2')

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 31
    Par défaut
    Merci, problème résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche par ordre de pertinence
    Par marcandre dans le forum Développement
    Réponses: 2
    Dernier message: 05/11/2008, 11h50
  2. Classement par pertinence par mot clés (Recherche)
    Par Zenooo dans le forum VBA Word
    Réponses: 4
    Dernier message: 13/01/2008, 19h50
  3. Moteur de recherche : comment trier les résultats par pertinence
    Par aucunIDdeLibre dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/12/2007, 13h42
  4. Classement des résultats de recherches par pertinence
    Par marcandre dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/12/2007, 16h35
  5. Classer les résultats d'une recherche par "pertinence"
    Par echataig dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/04/2007, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo