|
Requete avec IndexFullText |
Iniciado por Jean TURCOTTE, mar., 21 2019 11:36 PM - 8 respostas |
| |
| | | |
|
| |
Membro registado 1.120 mensagems Popularité : +8 (8 votes) |
|
Publicado em março, 21 2019 - 11:36 PM |
Bonjour,
J'ai une base de données avec laquelle j'ai créé un IndexFullText pour faciliter les recherches. J'ai configuré une requête avec un paramètre pour que je puisse rechercher du texte à l'intérieur du fichier IndexFullText.
Le problème que j'ai, c'est que si dans ma base de IndexFullText, j'ai le Mot "Chevreuil", ma requête ne fonctionne que si je recherche le mot entier alors que j'aimerais rechercher n'importe quel portion du mot. Voici la requete en SQL
SELECT CONTACT_PERSONNEL.Prenom AS Prenom, CONTACT_PERSONNEL.Nom AS Nom, CONTACT_PERSONNEL.Courriel AS Courriel, CONTACT_PERSONNEL.Adresse AS Adresse, CONTACT_PERSONNEL.Ville AS Ville, CONTACT_PERSONNEL.Arrondissement AS Arrondissement, MATCH(CONTACT_PERSONNEL.NoEmploye, CONTACT_PERSONNEL.Nom, CONTACT_PERSONNEL.Adresse, CONTACT_PERSONNEL.Ville, CONTACT_PERSONNEL.Arrondissement, CONTACT_PERSONNEL.Telephone1, CONTACT_PERSONNEL.Telephone2, CONTACT_PERSONNEL.PosteOccupe, CONTACT_PERSONNEL.Departement, CONTACT_PERSONNEL.Notes, CONTACT_PERSONNEL.AssurancesSociale) AGAINST({ParamIndex_FullText}) AS PertinenceFullText1 FROM CONTACT_PERSONNEL WHERE PertinenceFullText1 LIKE %{ParamPertinenceFullText1}% ORDER by PertinenceFullText1 DESC
Ça ne fonctionne malheureusement pas.
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Membro registado 2.571 mensagems Popularité : +222 (260 votes) |
|
Publicado em março, 22 2019 - 8:24 AM |
Bonjour,
Si tu mets un like à l'intérieur de ta requête full-text, tu vas à l'encontre de la philosophie full-text. Le full-text n'est pas fait pour rechercher une partie d'un mot, mais un mot en fonction d'un lexème.
Si tu veux faire un like, le full-text ne sert à rien. Par contre si tu veux retrouver chevreuil en tapant "chevr", il faut écrire dans le paramètre 'chevr*'
SELECT CONTACT_PERSONNEL.Prenom AS Prenom, CONTACT_PERSONNEL.Nom AS Nom, CONTACT_PERSONNEL.Courriel AS Courriel, CONTACT_PERSONNEL.Adresse AS Adresse, CONTACT_PERSONNEL.Ville AS Ville, CONTACT_PERSONNEL.Arrondissement AS Arrondissement, MATCH(CONTACT_PERSONNEL.NoEmploye, CONTACT_PERSONNEL.Nom, CONTACT_PERSONNEL.Adresse, CONTACT_PERSONNEL.Ville, CONTACT_PERSONNEL.Arrondissement, CONTACT_PERSONNEL.Telephone1, CONTACT_PERSONNEL.Telephone2, CONTACT_PERSONNEL.PosteOccupe, CONTACT_PERSONNEL.Departement, CONTACT_PERSONNEL.Notes, CONTACT_PERSONNEL.AssurancesSociale) AGAINST('chevr*') AS PertinenceFullText1 FROM CONTACT_PERSONNEL WHERE PertinenceFullText1 > 0 ORDER by PertinenceFullText1 DESC
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Membro registado 1.120 mensagems Popularité : +8 (8 votes) |
|
Publicado em março, 22 2019 - 1:02 PM |
Bonjour Philippe, merci d'avoir répondu.
Ma BD est une liste de contact qui contient une 30e de rubriques. La recherches de ma requêtes doit rechercher à l'intérieur de plusieurs rubriques simultanément justement pour éviter de faire des recherches séparées dans chaque rubrique.
Dans la formule que tu m'as envoyée, tu utilise ('chevr*'). Je l'ai testé avec du txt cohérent et ça n'a sorti aucun résultat.
Je vais alors utiliser comme il se doit mais j'aurais bien aimé pouvoir l'utiliser comme je te l'ai décris. Merci !
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Membro registado 129 mensagems Popularité : +20 (20 votes) |
|
Publicado em março, 22 2019 - 1:18 PM |
Bonjour Jean,
J'utilise cette procédure pour formater mon paramètre avant de l'envoyer dans une requête en Fulltext
Procedure gproc_formater_recherche( _recherche est une chaîne )
recherche est une chaîne mots est un tableau de 0 chaîne
SI _recherche <> "" ALORS ChaîneVersTableau( _recherche, mots, " " ) SI TableauOccurrence( mots ) > 1 ALORS recherche = "+" + TableauVersChaîne( mots, "* +" ) + "*" SINON recherche = mots[ 1 ] + "*" FIN FIN
RENVOYER ( recherche <> "" ? recherche SINON Null )
|
| |
| |
| | | |
|
| | |
| |
Membro registado 1.120 mensagems Popularité : +8 (8 votes) |
|
Publicado em março, 22 2019 - 3:41 PM |
Merci pour le code Julien,
Ça fonctionne très bien. La seule chose qui me reste à corriger, c'est de faire apparaître tous les enregistrements lorsque la case recherche est vide, as-tu une idée?
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Membro registado 129 mensagems Popularité : +20 (20 votes) |
|
Publicado em março, 22 2019 - 4:01 PM |
Normalement le fait d'affecter un paramètre Null fait que la condition n'est pas prise en compte.
Par contre dans mes requêtes les MATCH( .. ) AGAINST({_recherche}) > 0 sont dans la clause WHERE, je pense que ça doit jouer |
| |
| |
| | | |
|
| | |
| |
Membro registado 129 mensagems Popularité : +20 (20 votes) |
|
Publicado em março, 22 2019 - 4:09 PM |
Ex.
Une requête SQL :
SELECT assure.IDAssure AS IDAssure, assure.Identifiant AS Identifiant, assure.NomFamille AS NomFamille, assure.NomUsage AS NomUsage, assure.Prenoms AS Prenoms, assure.DateNaissance AS DateNaissance, assure.Voie AS Voie, assure.CodePostal AS CodePostal, assure.Commune AS Commune, assure.TelephoneFixe AS Telephone, assure.Email AS Email FROM assure WHERE assure.Identifiant = {_identifiant} AND MATCH(assure.NomFamille, assure.NomUsage, assure.Prenoms) AGAINST({_recherche}) > 0 AND assure.CodePostal = {_codePostal} AND assure.Commune = {_commune} AND ( assure.TelephoneFixe = {_telephone} OR assure.TelephonePortable = {_telephone} ) AND assure.Email = {_email}
Un appel avec des champs de saisie avec NULL si vide
RQT_recherche_assure._identifiant = SAI_identifiant recherche = SAI_recherche RQT_recherche_assure._recherche = COL_Outils.gproc_formater_recherche( recherche ) RQT_recherche_assure._codePostal = SAI_codePostal RQT_recherche_assure._commune = SAI_commune RQT_recherche_assure._telephone = SAI_telephone RQT_recherche_assure._email = SAI_email HExécuteRequête( RQT_recherche_assure ) Si SAI_recherche est vide mais qu'un autre critère est rempli ça passe.
Par contre si tous mes critères de recherche sont vides je remplace la requête utilisée dans ..FichierParcouru pour pointer directement vers la table. |
| |
| |
| | | |
|
| | |
| |
Membro registado 129 mensagems Popularité : +20 (20 votes) |
|
Publicado em março, 22 2019 - 4:14 PM |
Pour être tout à fait complet, un exemple d'alimentation de table :
Procedure lproc_rechercher()
i est un entier champ, recherche est une chaîne avecRecherche est un booléen
i = 1 champ = EnumèreChamp( GR_filtres_assure, i ) TANTQUE champ <> "" i++ SI SansEspace( { champ, indChamp } ) <> "" ALORS avecRecherche = Vrai champ = EnumèreChamp( GR_filtres_assure, i ) FIN
SI avecRecherche ALORS RQT_recherche_assure._identifiant = SAI_identifiant recherche = SAI_recherche RQT_recherche_assure._recherche = COL_Outils.gproc_formater_recherche( recherche ) RQT_recherche_assure._codePostal = SAI_codePostal RQT_recherche_assure._commune = SAI_commune RQT_recherche_assure._telephone = SAI_telephone RQT_recherche_assure._email = SAI_email HExécuteRequête( RQT_recherche_assure ) HLitPremier( RQT_recherche_assure ) SI PAS HEnDehors( RQT_recherche_assure ) ALORS TABLE_assure..FichierParcouru = RQT_recherche_assure TableAffiche( TABLE_assure, taInit ) SINON ToastAffiche( "Aucun résultat trouvé", toastCourt, cvMilieu, chCentre ) FIN SINON TABLE_assure..FichierParcouru = assure TableAffiche( TABLE_assure, taInit ) FIN |
| |
| |
| | | |
|
| | |
| |
Membro registado 1.120 mensagems Popularité : +8 (8 votes) |
|
Publicado em março, 22 2019 - 5:17 PM |
Merci Julien,
Ton code est excellent. Je me doutais bien que c'était possible. Je vais approfondir ton code pour le maîtriser.
Merci encore!
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | | | |
| | |
|