|
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
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 |
| |
| |
| | | |
|
| | | | |
| | |
|