DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Gestion des bases de données / HFSQL
  • Présentation
  • Comment faire une recherche "full-text" ?
  • Comment créer un index full-text ?
  • Remarques
  • Définition des mots creux
  • Définition des synonymes
  • Comment créer une requête pour effectuer une recherche full-text ?
  • Recherche full-text : Éditeur de requêtes
  • Recherche full-text : Requête en code SQL
  • Syntaxe de la valeur de recherche
  • Cas particuliers des mots composés séparés par un tiret
  • Analyser le résultat d'une requête "full-text"
  • Gérer les index full-text par programmation
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Présentation
HFSQL propose une recherche des chaînes de caractères très rapide dans les données. Cette recherche (appelée "full-text") permet de rechercher un mot ou un ensemble de mots.
Il devient possible d'indexer sans programmation les textes présents dans une base de données HFSQL. Ces textes peuvent être contenus dans des rubriques de type "Texte" ou de type "Mémo texte".
Un index peut indexer une ou plusieurs rubriques différentes. La création de l'index peut prendre en compte les textes enrichis (RTF, HTML) : les balises de ces formats seront ignorées lors de l'indexation. Il est ainsi possible d'effectuer des recherches de mots stockés dans des documents RTF ou HTML.
Les résultats de l'indexation full-text sont proposés selon un ordre de pertinence ("ranking").
Attention : la recherche "Full-text" n'est pas une simple recherche du type "contient" : la ponctuation n'est pas prise en compte.
Comment faire une recherche "full-text" ?
Pour effectuer une recherche "full-text", il est nécessaire de :
  1. Créer un index full-text dans le fichier de données concerné par cette recherche.
  2. Créer une requête pour effectuer la recherche full-text.
  3. Analyser et afficher le résultat de la requête.
Comment créer un index full-text ?
La création d'un index full-text est réalisée sous l'éditeur d'analyses.
Pour créer un index full-text :
  1. Dans l'éditeur d'analyses, affichez la description des rubriques du fichier concerné (option "Description des rubriques" du menu contextuel).
  2. Cliquez sur l'icône Index full-text. La fenêtre de définition de l'index full-text apparaît. Sélectionnez les rubriques intervenant dans la composition de l'index full-text. Seules les rubriques de type "Texte" et "Mémo Texte" présentes dans la description du fichier sont proposées. Validez.
  3. La rubrique de type "Index full-text" apparaît dans la liste des rubriques.
  4. Sélectionnez la rubrique et si nécessaire modifiez ses caractéristiques :
    • dans la liste des rubriques, il est possible de modifier directement le nom de l'index full-text.
    • dans la partie droite de la fenêtre, sélectionnez les paramètres de l'index full-text :
      • taille minimale des mots indexés (option "Ne pas indexer les mots de taille inférieure ou égale à") : seuls les mots supérieurs à cette taille seront indexés. Par défaut, cette taille est de 2 caractères.
      • gestion des balises RTF : l'option "Mon texte peut contenir du RTF (ne pas indexer les balises RTF)" permet de spécifier si le texte contient du RTF. Dans ce cas, les balises RTF ne seront pas prises en compte lors de l'indexation.
      • gestion des balises HTML : l'option "Mon texte peut contenir du HTML (ne pas indexer les balises HTML)" permet de spécifier si le texte contient du HTML. Dans ce cas, les balises HTML ne seront pas prises en compte lors de l'indexation.
      • Gestion de la ponctuation Unicode : cette option permet de spécifier si le texte contient des caractères de ponctuation spécifiques à Unicode (guillemets incurvés, ...).
      • gestion de la casse : Si l'option "Sensible à la casse" est cochée, la casse des mots (majuscule/minuscule) sera prise en compte lors de l'indexation.
      • gestion de l'accentuation : Si l'option "Sensible à l'accentuation" est cochée, l'accentuation sera prise en compte lors de l'indexation. Cette option est nécessaire si la racinisation est demandée.
      • gestion des mots creux : La gestion des mots creux permet de définir les mots creux qui ne doivent pas être pris en compte par l'indexation. Les mots creux sont le plus souvent les articles, les mots de liaison, ... Le bouton "Éditer les mots creux" permet de définir les mots creux à prendre en compte. Pour plus de détails, consultez le paragraphe Définition des mots creux.
      • gestion des synonymes : La gestion des synonymes permet de définir les mots qui devront être considérés comme synonymes. Pour plus de détails, consultez le paragraphe Définition des synonymes.
      • gestion de la racinisation : Si la gestion des synonymes n'est pas activée, il est possible d'activer la racinisation. La racinisation permet d'effectuer des recherches sur un index full-text en tenant compte des variantes d'un mot donné. Cette fonctionnalité est intéressante pour les bases de connaissance et permet de rechercher indifféremment les mots au singulier ou au pluriel. La racinisation dépend de la langue utilisée.
        Si vous activez cette option, sélectionnez la langue utilisée.
  5. Validez la fenêtre de description des rubriques.
  6. Enregistrez et générez l'analyse. Lors de la génération de l'analyse, la description des fichiers de données est modifiée et l'index full-text est créé (fichier d'extension ".FTX").

Remarques

  • Pour créer directement un index full-text à partir d'une rubrique texte ou mémo texte, il suffit de sélectionner la rubrique dans la fenêtre de description des rubriques et de cliquer sur le lien "Créer un index full-text sur la rubrique".
  • WINDEVWEBDEV - Code ServeuriPhone/iPad Il est possible de gérer les index full-text dans les fichiers de données décrits par programmation : il suffit d'utiliser une variable de type Description d'IndexFullText pour décrire l'index, puis la fonction HDécritIndexFullText pour valider la création de l'index.
  • A tout moment, il est possible de modifier la composition d'un index full-text existant : il suffit de cliquer sur le bouton "Editer l'index" dans la partie gauche de la description de la rubrique sous l'éditeur d'analyses.
  • Pour créer une rubrique de type Index full-text, une génération de l'analyse et une modification automatique des données sont obligatoires.
  • Racinisation : A cause de certaines irrégularités grammaticales (verbes du 3ème groupe en français, verbes irréguliers en anglais, ...), certaines conjugaisons peuvent ne pas être regroupées (par exemple, une recherche de "peux" ne donnera pas les enregistrements contenant "pouvons") ou certains pluriels peuvent ne pas être regroupés avec leur singulier (exemple feux/feu).

Définition des mots creux

Si l'option "Mots creux" est sélectionnée, il suffit de cliquer sur le bouton "Éditer les mots creux" pour définir les mots creux.
  1. Cliquez sur le bouton "Éditer les mots creux".
  2. Une liste de mots creux utilisés par défaut est affichée.
  3. Vous pouvez :
    • Ajouter des mots creux : cliquez sur le bouton "Ajouter". Dans la fenêtre qui s'affiche, saisissez la liste des mots creux à ajouter. Ces mots peuvent être séparés par des espaces, des tabulations, des retours chariots ou les caractères ",", ";" et ":".
    • Supprimer un ou plusieurs mots creux : sélectionnez le ou les mots creux à supprimer dans la liste et cliquez sur le bouton "Supprimer".
    • Importer des mots creux : cliquez sur le bouton "Importer" et sélectionnez le fichier texte contenant les mots creux. Ces mots peuvent être séparés par des espaces, des tabulations, des retours chariots ou les caractères ",", ";" et ":".
    • Coller des mots creux : pour coller des mots creux disponibles dans le presse-papiers (et séparés par des espaces, des tabulations, des retours chariots ou les caractères ",", ";" et ":"), copiez les mots dans le presse-papiers (Ctrl + C) et cliquez sur le bouton "Coller".
  4. Validez.

Définition des synonymes

Si l'option "Synonymes" est sélectionnée, il suffit de cliquer sur le bouton "Éditer les synonymes" pour définir les synonymes.
  1. Cliquez sur le bouton "Éditer les synonymes".
  2. Dans la fenêtre qui s'affiche, indiquez ligne par ligne les synonymes à prendre en compte. Par exemple :
    maison chalet pavillon villa batiment
  3. Validez.
Comment créer une requête pour effectuer une recherche full-text ?
Les recherches full-text sont effectuées grâce aux requêtes : requêtes créées sous l'éditeur de requêtes ou requêtes créées en code SQL. La condition de la recherche est saisie lors de la création de la requête.

Recherche full-text : Éditeur de requêtes

Pour créer une requête réalisant une recherche full-text, il suffit d'ajouter à la requête une rubrique de type "Index full-text". Automatiquement, la fenêtre de description d'une recherche full-text s'affiche.
Cette fenêtre permet d'indiquer :
  • La valeur de recherche. Cette valeur peut être saisie directement (un assistant permet de construire la chaîne à rechercher) ou correspondre à un paramètre. Pour plus de détails sur les caractéristiques de la chaîne à rechercher, consultez le paragraphe "Syntaxe de la valeur de recherche".
  • Les options de tri du résultat.
A la validation de cette fenêtre, la rubrique de type "full-text" est automatiquement ajoutée dans les éléments de la requête. Cette rubrique correspond à la pertinence du résultat de la recherche. Une condition a été automatiquement définie : seuls les enregistrements dont la pertinence est supérieure à 0 seront affichés dans le résultat de la requête.

Recherche full-text : Requête en code SQL

Pour créer une requête réalisant une recherche full-text en code SQL, il suffit d'utiliser la syntaxe :
MATCH (<Index>) AGAINST <Condition>
où :
  • <Index> correspond à la liste des rubriques de l'index séparées par des virgules (l'ordre des rubriques n'est pas important).
  • <Condition> correspond à la chaîne à rechercher. Pour plus de détails sur les caractéristiques de la chaîne à rechercher, consultez le paragraphe "Syntaxe de la valeur de recherche".
Exemple : Dans cet exemple, SAI_Rechercher est un champ de saisie et IdUserConnecté est une variable.
REQ_Rech est une Source de Données
 
 
MaRequête est une chaîne = [
SELECT * FROM Contacts
WHERE MATCH(Contacts.Nom, Contacts.Prenom, Contacts.CommentaireHTML,
Contacts.CommentaireTexteBrut, Contacts.Commentaires,
Contacts.Telephone, Contacts.Bureau,
Contacts.Portable, Contacts.Mail, Contacts.MSN, Contacts.Site_internet,
Contacts.Pays, Contacts.NumFax, Contacts.Ville)
AGAINST ('
]
MaRequête = MaRequête + SAI_Rechercher + [
')  
AND Contacts.IDUtilisateur =  
]
MaRequête = MaRequête + IDUserConnecté + [
ORDER BY Nom DESC
]
 
HExécuteRequêteSQL(REQ_Rech, hRequêteDéfaut, MaRequête)
POUR TOUT REQ_Rech
TableAjouteLigne(TABLE_Contact_par_catégorie, ...
REQ_Rech.IDContact, REQ_Rech.IDCategorie, IDUserConnecté, ...
REQ_Rech.Nom, REQ_Rech.Prenom)
FIN
CAS ERREUR:
Erreur(HErreurInfo())
Remarque : Requête avec un paramètre sur un index full-text : comment ignorer le paramètre ?
Pour ignorer le paramètre, il faut que le "MATCH" de la requête ne soit pas dans le résultat de la requête, mais dans le WHERE. En effet, si le résultat doit inclure la pertinence, il faut que le paramètre soit renseigné pour évaluer le résultat.
Pour qu'une requête créée avec l'éditeur de requêtes ait le MATCH dans le WHERE, il faut que la pertinence ne soit pas affichée dans le résultat.
Exemple avec pertinence :
SELECT
MATCH(XX, YY, ZZ) AGAINST({ParamFullText}) AS PertinenceFullText
FROM
TABLE
WHERE
<Paramètres>
AND
PertinenceFullText > 0
ORDER BY
PertinenceFullText DESC
Exemple sans pertinence :
SELECT *
FROM
TABLE
WHERE
<Paramètres>
AND MATCH(XXX, YYY, ZZZ) AGAINST({ParamFullText}) > 0

Syntaxe de la valeur de recherche

La valeur de recherche peut contenir les éléments suivants :
ElémentSignification
Un mot tout seulLe mot indiqué sera recherché. La pertinence sera augmentée si le texte contient ce mot.
Exemple : "WINDEV" recherche le mot "WINDEV".
Deux mots séparés par un espaceRecherche l'un ou l'autre des mots.
Exemple : "WINDEV WEBDEV" recherche les textes contenant soit "WINDEV" soit "WEBDEV".
Un mot précédé du signe "+"Le mot indiqué est obligatoire.
Exemple : "+WINDEV" recherche les textes contenant obligatoirement "WINDEV".
Un mot précédé du signe "-"Le mot indiqué ne doit pas être présent dans le texte.
Exemple : "-Index" recherche les textes ne contenant pas "Index".
Un mot précédé du signe "~"Si le texte contient le mot indiqué, la pertinence sera diminuée.
Un ou plusieurs mots entourés de guillemetsLes mots indiqués sont recherchés groupés et dans l'ordre.
Attention : si l'option "Ignorer les mots inférieurs à " est différente de 0, les mots entre les guillemets inférieurs à la taille précisée ne seront pas recherchés.
Un mot suivi du signe "*"La recherche est une recherche du type "Commence par" le mot indiqué.
Attention : La recherche full-text ne renvoie aucun résultat si le paramètre passé est vide ou null.

Cas particuliers des mots composés séparés par un tiret

Si le texte contient des mots séparés par un tiret ('-'), chaque partie du mot est indexée de façon indépendante dans un index full-text.
Exemple :
  • Le texte contient "multiplateforme" : les deux mots "multi" et "plateforme" seront indexés de façon indépendante.
  • Lors de la recherche, les documents contenant "multi" et/ou "plateforme" seront trouvés.
  • Pour rechercher "multiplateforme", il est nécessaire de rechercher le mot entre guillemets : "multiplateforme".
    Attention : la recherche renverra tous les documents qui contiennent consécutivement les deux mots "multi" et "plateforme". Le séparateur des deux mots pourra ne pas être le tiret : il pourra s'agir de n'importe quel séparateur (espace, +, point, virgule, retour chariot, tabulation, ...).
Analyser le résultat d'une requête "full-text"
Le résultat d'une requête full-text donne pour chaque enregistrement du fichier de données concerné la pertinence de l'enregistrement par rapport à la valeur de recherche.
Cette pertinence dépend de plusieurs facteurs :
  • le nombre de fois où le mot recherché est présent dans l'enregistrement.
  • le nombre de mots dans l'enregistrement et leur nombre de répétitions.
  • le rapport entre les enregistrements qui contiennent les mots recherchés et ceux qui ne contiennent pas les mots recherchés. En effet, plus le mot recherché est présent dans tous les enregistrements, et moins la pertinence sera importante.
  • ...
Le résultat d'une requête "full-text" peut ensuite être traité comme tout résultat d'une requête : il est par exemple possible d'afficher le résultat dans une table, en triant selon la pertinence, ...
Gérer les index full-text par programmation
Le WLangage propose plusieurs fonctions WLangage permettant de gérer les index full-text :
HDécritIndexFullTextDécrit un index full-text d'un fichier de données créé par programmation.
HListeIndexFullTextRenvoie la liste des index full-text d'un fichier de données (d'une requête ou d'une vue) reconnus par le moteur HFSQL.
HListeMotVideRenvoie la liste des mots vides utilisés par un index full-text.
HListeSynonymeRenvoie la liste des synonymes utilisés par un index full-text.
Remarques :
  • WINDEVWEBDEV - Code ServeuriPhone/iPad La création d'un index full-text dans un fichier de données créé par programmation peut être réalisée grâce à une variable de type Description d'IndexFullText.
  • La fonction HRéindexe permet de ré-indexer les index full-text.
Version minimum requise
  • Version 14
Documentation également disponible pour…
Commentaires
Pouvoir ignorer un paramètre d'index fullText


Lorsqu'on souhaite pouvoir ignorer un paramètre d'index fullText dans une requête créée avec l'éditeur de requête (pouvoir lui affecter la valeur "null" dans le code), vous fournissez bien une explication ci-dessus, mais la phrase suivante est difficile à interpréter :
"Pour qu'une requête créée avec l'éditeur de requêtes ait le MATCH dans le WHERE, il faut que la pertinence ne soit pas affichée dans le résultat."

Voici quelques explications :
il faut en fait désactiver l'affichage de la rubrique dans la requête, c'est à dire cliquer sur le petit "œil" dans la liste des rubriques de l'éditeur de la requête et choisir "ne pas afficher".
quentin
25 mar. 2021

Dernière modification : 13/06/2023

Signaler une erreur ou faire une suggestion | Aide en ligne locale