PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Recherche full-text en fonction d'une rubrique
Recherche full-text en fonction d'une rubrique
Iniciado por Julien V, 29,may. 2020 11:34 - 3 respuestas
Miembro registrado
134 mensajes
Publicado el 29,mayo 2020 - 11:34
Bonjour,

Je rencontre actuellement des difficultés pour comparer des rubriques entre deux tables.

J'ai une table tiers contenant les champs Enseigne, NomFamille, NomUsage, Prenoms (avec un index full-text sur ces rubriques) et un champ d'identification Numero.

J'ai une deuxième table table2 contenant un champ Nom et également un champ Numero alimentée par des imports texte.
Cette table contient des informations mises à jour quotidiennement.

Mon souci est que le champ Numero n'est pas une clé unique, c'est un identifiant qui peut être réaffecté si un tiers n'est plus en activité; les champs de noms sont de la saisie libre, il peut y avoir des différences de casse, de ponctuation, d'ordre dans les mots etc.

J'aurai donc voulu faire une liaison de table sur le Numero et faire un calcul de pertinence entre les champs de tiers et table2.Nom :

SELECT tiers.Enseigne, tiers.NomComplet, table2.Nom,
MATCH (tiers.Enseigne, tiers.NomFamille, tiers.NomUsage, tiers.Prenoms) AGAINST ( table2.Nom ) AS Pertinence
FROM tiers, table2
WHERE tiers.Numero = table2.Numero

La requête ne fonctionne pas, il y a une erreur sur table2 qui est un mot inattendu.

Y a-t-il une syntaxe qui permettrait de faire une recherche full-text à partir d'une rubrique et non d'un paramètre texte ?
Miembro registrado
134 mensajes
Publicado el 02,junio 2020 - 16:21
Bonjour,

Je n'ai toujours pas trouvé la solution pour faire la recherche full-text en fonction d'une rubrique, du coup en attendant je boucle sur table2 et je lance une requête pour chaque enregistrement...

sql, recherche est une chaîne
resultat_ligne est une Source dede Données
resultat est un tableau de 0 Enregistrement

HLitPremier( table2 )
TANTQUE PAS HEnDehors( table2 )

sql = "SELECT %1 AS ID, '%2' AS Numero, '%3' AS Nom, tiers.Numero, tiers.Enseigne, tiers.NomComplet, "
sql += "MATCH ( tiers.Enseigne, tiers.NomFamille, tiers.NomUsage, tiers.Prenoms ) AGAINST ( '%4' ) AS Pertinence "
sql += "FROM tiers WHERE tiers.Numero = '%2' "

// Transforme PHARMACIE LOUIS-AUBERTIN en +PHARMACIE* +LOUIS-AUBERTIN*
recherche = COL_Outils.gproc_formater_recherche( Remplace( table2.Nom,"'","''") )

HExécuteRequêteSQL( resultat_ligne, ChaîneConstruit( sql, table2.ID, table2.Numero, Remplace( table2.Nom,"'","''") , recherche ) )
HLitPremier( resultat_ligne )
SI PAS HEnDehors( resultat_ligne ) ALORS

TableauAjoute( resultat, resultat_ligne )

FIN // SI PAS HEnDehors( resultat_ligne ) ALORS

HLitSuivant( table2 )
FIN // TANTQUE HTrouve( table2 )

Le système fonctionne, par contre je m'interroge sur l'algo du full-text :

- Un nom et prénom inversés n'ayant pas la même casse me renvoie une pertinence de 448 alors que
- PHARMACIE DE LA POSTE et Pharmacie de la Poste me renvoie 0,
- PHARMACIE LOUIS-AUBERTIN et Pharmacie LOUIS-AUBERTIN me renvoie également 0

Les propriétés de mon index full-text ne me semblent pas déconnant




Vous auriez une piste sur le pourquoi du comment ?
Miembro registrado
558 mensajes
Publicado el 02,junio 2020 - 16:59
Il faut gérer la séparation des mots. Tu as quelle version ?
Miembro registrado
134 mensajes
Publicado el 02,junio 2020 - 17:09
Je suis en 24

En faisant quelques tests avec tiers.enseigne renseigné avec 'Pharmacie de la Poste':

AGAINST ( '+PHARMACIE* +DE* +LA* +POSTE*' ) -> 0
AGAINST ( '+PHARMACIE +DE +LA +POSTE' ) -> 216.367233 (équivalent à AGAINST ALL('PHARMACIE DE LA POSTE') )
AGAINST ( 'PHARMACIE DE LA POSTE' ) -> 108,183617 (??)

PHARMACIE SAINTE-MARIE et Pharmacie Sainte-Marie ->0 (mais je pense qu'il y a une gestion spé du tiret)