PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Recherche dans index fulltext
Recherche dans index fulltext
Débuté par Pascal BOULESTEIX, 30 mai 2023 09:50 - 4 réponses
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 30 mai 2023 - 09:50
Bonjour
J'utilise un index fulltext dans un de mes fichiers HFSQL
Pour faire des recherches, j'utilise les clauses MATCH AGAINST.
Ça fonctionne très bien sauf pour trouver des occurrences contenant des tirets.
Une requête avec un AGAINST('pie pie*') retourne plusieurs lignes ; par exemple, voici deux lignes retournées dans laquelle on trouve Pie (Pierregarin et Pie-grèche)
1597 3343 Sterna hirundo Linnaeus, 1758 Sterne pierregarin 18,490057
1411 4462 Lanius senator senator Linnaeus, 1758 Pie-grièche à tête rousse (ssp  senator) 68,625558


Si j'ajoute des tirets dans la clause AGAINST('pie- pie-*') pour ne cibler que les Pies-grièches aucun résultat n'est retourné.

Dans le fichier ESPECES, le champ NOMF pour ne prendre que celui-ci a l'attribut "Sensible au caractères spéciaux" et l'index fulltext a l'attribut "Gestion de la pontuation"

Question : comment tenir compte des tirets dans les recherches ? Y a-t-il un caractères d’échappement ?

SELECT ESPECES.IDESPECES AS IDESPECES,ESPECES.CODE AS CODE,ESPECES.NOMS AS NOMS,ESPECES.NOMF AS NOMF, MATCH(ESPECES.CODE, ESPECES.NOMS, ESPECES.NOMF) AGAINST('pie- pie-*') AS PertinenceFullText1 FROM ESPECES WHERE PertinenceFullText1 > 0 ORDER BY ESPECES.NOMS

--
Pascal Boulesteix
Applications Visiolittoral et WNat
Membre enregistré
950 messages
Popularité : +53 (63 votes)
Posté le 30 mai 2023 - 11:14
Bonjour,

vu que les Tiret sont des caractère de fonctionnement de la recherche fulltext je pense qu'on ne peut pas faire d'exception et que je n'ai jamais trouvé comment ajouter les tiret, du coup j'ai ajouté une seconde colonne de recherche fulltext, et je remplace les - par [Tiret], les + par [Plus], et pour rechercher dans les champs de saisie je remplace "-" par "[tiret]"

Jordan
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 31 mai 2023 - 10:28
Salut à tous et en particulier à Jordan
La piste de [tiret] était la bonne
Sans rien changé à la base, j'ai simplement codifié la requête en remplaçant les - (tiret) par [tiret] et ça fonctionne :merci:
SELECT ESPECES.IDESPECES AS IDESPECES,ESPECES.CODE AS CODE,ESPECES.NOMS AS NOMS,ESPECES.NOMF AS NOMF, MATCH(ESPECES.CODE, ESPECES.NOMS, ESPECES.NOMF) AGAINST('pie[tiret] pie[tiret]*') AS PertinenceFullText1 FROM ESPECES WHERE PertinenceFullText1 > 0 ORDER BY ESPECES.NOMS


Par contre, Jordan, où as-tu trouver l'info sur [tiret] ?

--
Pascal Boulesteix
Applications Visiolittoral et WNat
Membre enregistré
950 messages
Popularité : +53 (63 votes)
Posté le 31 mai 2023 - 12:45
@Pascal

Tu n'a rien changé dans ta base, tu as toujours les "-" dans tes chaines ? ca ne devrait pas fonctionné, ou alors vraiment coup de bol,

Parce que moi dans ma base j'ai une colonne d'affichage avec TT-TT et dans celle que je cherche TT[Tiret]TT,

Jordan
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 31 mai 2023 - 15:05
Dans la base j'ai toujours des chaines avec des -
Par contre dans la requête c'est assez vicelard !
Si je code AGAINST('Pie Pie*), ce que je faisais jusqu'à lors, toutes les lignes contenant Pie sont retournées.
Si je code AGAINST('Pie- Pie-*') aucune ligne n'est retournée.
Par contre si je code AGAINST('Pie[Tiret] Pie[Tiret]*') toutes les lignes contenant Pie sont retournées, mêmes celles qui n'ont pas de - !
Là où je me suis fais avoir par un excès d'optimisme en ne regardant que le contenu de la boite déroulante, c'est que cette dernière est remplie après l'exécution de la requête par un bout de code qui analyse la pertinence des résultats et le test
SI Position(Majuscule(sdReq.NOMS),Majuscule(SAI_FIND_ESPECE),1,DepuisDébut+SansCasse) > 0 ALORS

fait toute la différence ; en d'autres mots, une fois les résultats retournés je testes le champ avec la zone de saisie qui contient un tiret
Dans ma version 'historique', j'avais beau tester si la valeur contenait la chaine recherchée mais comme aucune ligne n'était retournée ....
Comment AGAINST interprète-t-il le coup du [tiret] ? Mystère, mais ça me va bien !
A suivre

--
Pascal Boulesteix
Applications Visiolittoral et WNat