Moteur de recherche

Mammouth du PHP | 19672 Messages

17 oct. 2005, 16:22

Bon, la première chose à faire de toutes façon, c'est de mettre au point ta requête SQL : manipule-la de façon à obtenir le résultat souhaité en l'exécutant directement dans phpMyAdmin avec une valeur en dur. Quand tu obtiendras le résultat normal attentdu au lieu d'un message d'erreur, alors tu pourra songer à la partie récupération et affichage. Le message d'erreur vient de ce que ta requête pose problème. Ajuste d'abord ça en tenant compte des sules éléments que tu veux obtenir, donc pas de SLECT suivi de 12 champs si c'est pour en afficher 2 ou 4 ou 6.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

17 oct. 2005, 17:13

Bon, la première chose à faire de toutes façon, c'est de mettre au point ta requête SQL : manipule-la de façon à obtenir le résultat souhaité en l'exécutant directement dans phpMyAdmin avec une valeur en dur.
J'ai effectué la requête suivante où $MotRech a été remplacé par "collecter":
SELECT IdGroupe, NomGroupe, AutreNomGroupe, g.Presentation, g.InfCompl, 
				IdSociete, NomSociete, AutreNomSociete, s.Presentation, s.InfCompl, 
				IdProduit, NomProduit, p.Presentation
				FROM groupes AS g, societes AS s, produits AS p
				WHERE MATCH (g.NomGroupe, g.AutreNomGroupe, g.Presentation, g.InfCompl,
            	s.NomSociete, s.AutreNomSociete, s.Presentation, s.InfCompl,
            	p.NomProduit, p.Presentation)
				AGAINST ('".$MotRech."' IN BOOLEAN MODE)
				AND IdGroupe = RefGroupe
				AND IdSociete = RefSociete
Dans my admin il m'affiche deux fois la même réponse (ce que je ne comprends pas).
Le mot "collecter" se trouve dans le champ "Présentation" de la fiche société"CAS". Il me donne également tous les champs de la société ainsi que les champs qui concernent le groupe auquel elle est affiliée et les champs qui concernent les produits qu'elle fabrique (donc tous les champs des trois tables).

Mais je voudrais qu'il ne me donne que le champ dans lequel se trouve le mot recherché (ici Présentation) associé à la table qui m'intéresse (ici la table société).

Ajuste d'abord ça en tenant compte des sules éléments que tu veux obtenir, donc pas de SLECT suivi de 12 champs si c'est pour en afficher 2 ou 4 ou 6.
Mais c'est variable puisque je veux le nom de la fiche (ce qui correspond à NomGroupe, NomSociete et NomProduit) et le champ dans lequel se trouve la réponse (c'est-à-dire l'ensemble des champs sélectionnés pour ma recherche même si au final, je n'aurai que ceux où se trouve le mot recherché).
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

17 oct. 2005, 17:31

Mais c'est variable puisque je veux le nom de la fiche (ce qui correspond à NomGroupe, NomSociete et NomProduit) et le champ dans lequel se trouve la réponse (c'est-à-dire l'ensemble des champs sélectionnés pour ma recherche même si au final, je n'aurai que ceux où se trouve le mot recherché).
J'entends bien, mais en fin de compte, tu vas créer une liste de liens vers des fichers détaillées si j'ai bien compris. Tu n'as donc pour l'instant pas besoin des détails mais des seuls éléments nécessaires à la construction de ces liens: pour afficher la page correspondant ensuite à chaque lien, tu auras là besoin des informations, mais il sera toujours temps de faire une requête spécifique détaillée.

Ne vas pas plus vite que la musique, chaque chose en son temps. Dans l'immédiat, on veut savoir quoi ? L'identifiant du groupe et son nom, comme tu as trois types de groupes; groupe, société et produit, tu as 6 champs à extraire. Après tu verras pour l'affichage des détails, mais pour créer les liens, on a besoin de rien d'autre.

Est-ce que ça te semble cohérent comme raisonnement de départ ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

17 oct. 2005, 18:25

:mrgreen: Tout ce qu'il y a de plus cohérent!

Bon alors reprenons depuis le début. Dis-moi si je fais une erreur de logique. Je suis le tuto suivant: http://omiossec.developpez.com/mysql/fulltext/methodes/

Je veux extraire l'id et le titre de la fiche dans laquelle la réponse est susceptible d'apparaître:
SELECT IdGroupe, NomGroupe, IdSociete, NomSociete, IdProduit, NomProduit,
Je sélectionne les champs dans lesquels, je fais ma recherche:
MATCH (g.NomGroupe, g.AutreNomGroupe, g.Presentation, g.InfCompl,
                s.NomSociete, s.AutreNomSociete, s.Presentation, s.InfCompl,
                p.NomProduit, p.Presentation)
J'"argumente" avec le mot recherché $MotRech en mode booléen:
AGAINST ('".$MotRech."' IN BOOLEAN MODE)
Je lui dis dans quel table il doit trouver tout ça:
 FROM groupes AS g, societes AS s, produits AS p
Et je rajoute un filtrage pour virer toutes les valeurs égales à 0 et garder celles supérieures à 0 selon le degré de pertinence:
WHERE MATCH (g.NomGroupe, g.AutreNomGroupe, g.Presentation, g.InfCompl,
                s.NomSociete, s.AutreNomSociete, s.Presentation, s.InfCompl,
                p.NomProduit, p.Presentation) AGAINST  ('".$MotRech."' IN BOOLEAN MODE)
En résumé ça nous donnerait:
SELECT IdGroupe, NomGroupe, IdSociete, NomSociete, IdProduit, NomProduit,
MATCH (g.NomGroupe, g.AutreNomGroupe, g.Presentation, g.InfCompl,
                s.NomSociete, s.AutreNomSociete, s.Presentation, s.InfCompl,
                p.NomProduit, p.Presentation)
AGAINST ('".$MotRech."' IN BOOLEAN MODE)
FROM groupes AS g, societes AS s, produits AS p
WHERE MATCH (g.NomGroupe, g.AutreNomGroupe, g.Presentation, g.InfCompl,
                s.NomSociete, s.AutreNomSociete, s.Presentation, s.InfCompl,
                p.NomProduit, p.Presentation) AGAINST  ('".$MotRech."' IN BOOLEAN MODE)
Testé en dur sous MyAdmin, ça me donne qq chose de très étrange que j'ai du mal à décrire. C'est comme s'il avait tenté des combinaisons d'id qui n'ont pas de rapport entre eux.

Le tableau de réponses comprend septs colonnes ainsi nommées:
IdGroupe

NomGroupe

IdSociete

NomSociete

IdProduit

NomProduit
MATCH (g.NomGroupe, g.AutreNomGroupe, g.Presentation, g.InfCompl, s.NomSociete, s.AutreNomSociete, s.Presentation, s.InfCompl, p.NomProduit, p.Presentation) AGAINST ('collecter' IN BOOLEAN
MODE)
Là je ne comprends plus rien. Juste une remarque: dans la colonne "MATCH etc.", il m'affiche '1'.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

17 oct. 2005, 18:30

Pour la septieme colonne, tu peux ajouter un alias, ça simplifiera : MATCH(...) AS un_nom_significatif et ce mot sera l'intitulé de la colonne en même temps que ce que tu pourras amnipuler lors de la récupération.
Bien, ceci posé, est-ce que ce résultat lors de l'exécution te satisfait ? Tu m'indiques les colonnes affichées, mais y a-t-il un résultat dans les colonnes à part le nom ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

18 oct. 2005, 08:55

Bonjour,

Si je comprends bien, cette septième colonne correspond au nombre de réponses trouvées?

Concrètement je ne devrais avoir qu'une réponse mais j'en ai 600 lignes minimum. Il y a donc un problème.

Je n'arrive pas à comprendre comment les réponses sont trouvées.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Eléphant du PHP | 179 Messages

18 oct. 2005, 09:57

J'ai une question. Lorsque je suis sous MyAdmin, je suis censée créer une table index. Je travaille actuellement sur la dernière version. On peut sélectionner les champs dans lesquels on veut effectuer la recherche pour les mettre en FULLTEXT. C'est bien ainsi que la table est créée, n'est-ce pas? Ou bien faut-il que je crée la table manuellement comme mes trois autres tables?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

18 oct. 2005, 10:15

Petite question subsidiaire : je viens de faire quelques tests en local avec la technique du MATCH/AGAINST : les colonnes mentionnées dans le MATCH sont-elles indexées en FULLTEXT ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

18 oct. 2005, 10:32

Oui toutes. Seule les id dans le select ne le sont pas. Tous les autres champs sont en fulltext.

J'ai essayé la requête avec des tables séparées: c'est carrément plus lisible et pertinent. Je pense que ce qui pose problème, c'est le croisement des tables. Je pensais ne faire qu'une seule requête mais ça m'a l'air plus compliqué que si je les sépare. (Finalement ce dont on a parlé il y a deux jours :wink: ).

Je me demande même si je ne vais pas faire trois tableaux de réponses différents pour une meilleure lisibilité. :-k
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

18 oct. 2005, 10:38

Dans la mesure où tu n'as pas de jointures, ça me semble en effet plus approprié, à toi de voir, fais des tests. Je te signale en outre un autre détail: dans la mesure où tu veux une sortie par pertinence, il ne faut pas utiliser "IN BOOLEAN MODE" dans le AGAINST.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

18 oct. 2005, 11:00

Dans la mesure où tu n'as pas de jointures, ça me semble en effet plus approprié, à toi de voir, fais des tests. Je te signale en outre un autre détail: dans la mesure où tu veux une sortie par pertinence, il ne faut pas utiliser "IN BOOLEAN MODE" dans le AGAINST.
L'avantage du "boolean mode" (outre qu'il permet de faire une recherche booléenne) est qu'il ne tient pas compte du seuil des 50% ni de la casse. Or ma base n'est pas très grande pour le moment: si je lui colle un seuil, je risque de ne pas avoir beaucoup de réponses, non?

Par ailleurs, si je comprends bien ce que tu dis, je dois soit écrire une requete du type:
SELECT...MATCH...AGAINST...IN BOOLEAN MODE... FROM...

soit du type:
SELECT... MATCH... AGAINST...FROM... WHERE MATCH... AGAINST...

En gros je ne peux pas mélanger : BOOLEAN MODE et WHERE MATCH?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

18 oct. 2005, 11:06

Si je me fie à la doc, tu as raison sur ce point. Mais l'ajout du MATCH dans le select ajoute une colonne de pertinence dont tu n'as au fond peut-être pas un besoin impératif: auquel cas, tu laisses le second MATCH dans la clause WHERE ce qui te permettra d'utiliser le BOOLEAN MODE.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 179 Messages

18 oct. 2005, 11:12

Donc, je devrais faire trois requêtes de type: SELECT...MATCH...WHERE...AGAINST... IN BOOLEAN MODE ?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Mammouth du PHP | 19672 Messages

18 oct. 2005, 11:19

Soit une requête avec jointure, soit une requête par groupe oui, enfin c'est ce que je vois à priori. C'est un peu difficile pour moi car un peu abstrait de te conseiller sur ce point précis: il faudrait que je comprenne très précisément les caractéristiques du type de recherche à faire pour quel résultat obtenu et éventuellement que je dispose de la structure de la base et d'un jeu d'essai assez large pour faire des tests... que tu feras aussi bien que moi ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
pjl
ViPHP | 2119 Messages

18 oct. 2005, 11:25

Tu fais une requête sur 3 tables sans condition de jointure.