Recherche approximative dans powerapps Canvas [Spoiler : c’est possible !]

  • Recherche approximative dans powerapps Canvas [Spoiler : c’est possible !]

    Posté par Alexandre sur 21 janvier 2024 à 18h56

    Bonjour à tous

    Il arrive qu’on ait besoin de faire une recherche approximative sur nos données (aussi appelée recherche floue ou fuzzi search en anglais).
    Par exemple vous cherchez un client, vous vous souvenez qu’il s’appelle [DU-PON] mais vous ne savez plus si c’est un D ou un T ? Avec une recherche classique vous tapez l’orthographe exacte et vous avez une chance sur 2 d’avoir bon du premier coup. Et si c’est un nom encore plus compliqué ? …
    Bref la recherche flexible vous permet d’avoir une recherche qui trouve ce qui correspond “à peu prêt” au texte recherché.

    La solution

    Il suffit d’activer la recherche de dataverse dans votre environnement, puis de définir quelles tables et quels champs peuvent être cherchés, puis d’utiliser les actions dataverses depuis powerapps Canvas pour interroger le moteur de recherche 😉

    Pour activer et paramétrer la recherche dans l’environnement je vous renvois sur le mode opératoire officiel (attention à la subtilité que les champs cherchés doivent être ajoutés à la vue de recherche rapide) : https://learn.microsoft.com/en-us/power-platform/admin/configure-relevance-search-organization

    Ensuite depuis powerapps Canvas :

    • Ajouter la source de données ‘Environment’ pour avoir accès aux actions dataverse

    Utiliser dans une action comportementale l’action comme suit (*):

    <code class="language-plaintext"> Environment.searchsuggest(
            {
                entities:"[{""name"":""pref_matable"",""selectColumns"":[""name"",""pref_macolonne"",""pref_autrecolonne""],""searchColumns"":[""name"",""pref_macolonne"",""pref_autrecolonne""]}]";
                fuzzy:true;
                search:TextInput1.Text;
                options:"{'querytype': 'lucene', 'searchmode': 'all', 'besteffortsearchenabled': 'true', 'grouprankingenabled': 'true'}";
                top:10;
                orderby:"[""@search.score desc""]"
            }
        ).response

    Cela retournera un JSON que vous pourrez alors manipuler à l’aide de la fonction ParseJSON. Par exemple pour obtenir la liste des résultats dans une collection :

    <code class="language-plaintext">ClearCollect(
        colSearchResults2;
            ForAll(
                ParseJSON(
                    searchSuggest              
                ).Value;
                ThisRecord
            )
    );;

    A vous d’utiliser le reste à votre convenance.

    (*) Je reviens rapidement sur la fonction ‘searchSuggest’. Les paramètres n’ont pas été si simples que ca à trouver, et les résultats ne reflètent pas forcément ce qu’on attendrait. Par exemple, si vous supprimez le champs ‘name’ dans la table ‘searchColumns’ dans la propriété ‘entities’ vous n’obtenez plus aucun résultat… et d’autres mystères encore incompris pour ma part.

    Un problème également, c’est que quelque soit les champs qu’on met dans searchColumns, la recherche se fait dans tous les champs de recherche, et pire encore, la recherche se fait également dans la colonne de clé guid (ce qui peut être perturbant).

    Amusez vous bien, la recherche approximative c’est top pour éviter à vos utilisateurs de saisir un doublon par exemple, ou pour chercher dans des textes issus de saisies utilisateurs, en faisant abstraction d’éventuelles fautes d’orthographe.

    NB : il est en théorie possible aussi de faire une recherche flexible depuis power automate avec l’action en preview ‘Search Rows’ de dataverse, mais je n’ai jamais été fichu de le faire fonctionner….

    Alexandre a répondu Il y a 8 mois, 1 semaine 3 Membres · 3 Réponses
  • 3 Réponses
  • R3dKap

    Membre
    22 janvier 2024 à 12h10

    Super top ça ! Merci m’sieur ! 🙏

  • DavidZed

    Membre
    23 janvier 2024 à 9h30

    Génial 🙂 Merci pour le partage

  • Alexandre

    Membre
    25 janvier 2024 à 22h31

    Merci à tous les deux !
    Testez le, c’est top, mais c’est encore perfectible. En tous cas ca peut rendre de fiers services 😉

    Et merci aussi pour tout ce que vous faites pour tous les autres 😉

Connectez-vous pour répondre.