Écriture de requêtes SOSL
Objectifs de formation
Une fois cette unité terminée, vous pourrez :
- Comprendre ce qui différencie SOSL des alternatives de recherche en texte intégral.
- Identifier la syntaxe SOSL de base.
- Décrire les différences entre SOSL et SOQL.
- Créer une requête SOSL qui recherche dans plusieurs sObjects.
Qu'est-ce que SOSL ?
Dans l'unité précédente, nous avons présenté SOQL, et vous avez appris comment l'utiliser pour interroger des données dans des sObjects et dans leurs tableaux associés. Pour exécuter des requêtes de texte à travers plusieurs sObjects, vous pouvez utiliser SOSL (Salesforce Object Search Language), l'option Salesforce de recherche de texte intégral.
En tant développeur .NET, vous connaissez probablement les capacités de la recherche de texte intégral disponibles avec Microsoft SQL Server (MS FTS). Vous connaissez peut-être la bibliothèque de moteur de recherche populaire appelée Lucene.Net, qui a été portée depuis la version Java d'origine vers C#.
La bonne et mauvaise nouvelle est que SOSL est différente de ces alternatives de recherche de texte intégral. La principale différence se rapporte à la configuration requise et à la maintenance des index. Salesforce utilise le moteur de recherche et d'indexation ouvert de Lucene pour SOSL, mais il a été configuré pour vous dispenser de toute installation et configuration. Vous n'avez pas non plus à gérer les index. En réalité, votre contrôle de l'utilisation des index de recherche est limité, ce qui est une bonne nouvelle, car l'écriture de requêtes SOSL est simple.
Cependant, en tant que développeur .NET, vous aimez apporter de petites modifications à votre code pour l’ajuster. L'idée de perdre le contrôle de la configuration et des index peut vous gêner. Rassurez-vous, même si votre contrôle diminue, vous pouvez toujours améliorer les performances des requêtes, aussi bien SOSL que SOQL. Nous allons bientôt explorer en détail ces méthodes, mais pour le moment, examinons ce qui différencie la syntaxe SOSL.
Création d'une requête SOSL
Si vous connaissez MS FTS, vous savez que vous devez écrire des requêtes SELECT qui utilisent une instruction CONTAINS ou FREETEXT. La recherche CONTAINS puissante, qui présente de nombreuses variations, permet de rechercher des correspondances parfaites ou approximatives, ainsi que des termes proches.
La syntaxe de recherche SOSL est plus simple et n'utilise pas le mot-clé SOQL SELECT. Elle utilise à la place le mot-clé FIND. La requête de base se présente comme suit :
FIND {"grand*"} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName, Email)
Si nous la décomposons, elle comprend trois parties.
Clause FIND avec Search Term
La clause FIND est requise. La recherche SOSL est unique. FIND est suivie du terme que vous recherchez, que ce soit un mot unique ou une phrase. Dans le cas présent, il s'agit du mot « grand ». Comme dans notre exemple, nous pouvons également inclure des caractères génériques, par exemple :
* matches zero or more characters at the middle or end of the search term
?matches only one character at the middle or end of the search term
Nous reviendrons sur les caractères génériques dans l'unité suivante. Pour le moment, notez que si vous pouvez utiliser un caractère générique au milieu et à la fin du terme de recherche, ce n'est pas obligatoire. En réalité, il est préférable de ne pas utiliser de caractère générique, qui peut détériorer les performances d'une requête.
Clause IN
Utilisez la clause IN pour spécifier un groupe de recherche. Elle indique à Salesforce les champs à rechercher. Cependant, vous devez tenir compte d'un élément très important.
Dans l'exemple ci-dessus, nous avons spécifié ALL FIELDS. Littéralement, cela signifie que la recherche s'applique à tous les champs, mais selon l'objet que vous spécifiez dans la clause RETURNING, seuls certains champs de texte sont inclus. Vous avez dit ?
Explications. Si l'objet que vous renvoyez est un article, un document, un commentaire de fil, un élément de fil, un fichier, un produit ou une solution, la recherche s'applique à tous les champs, car vous souhaitez rechercher dans tous les champs de ces types d'objet.
Cependant, si vous recherchez dans la majorité des objets standard ou personnalisés, qui comprennent toutes sortes de champs non texte, il est préférable de rechercher uniquement dans les champs de nom, d'e-mail, de téléphone et du menu latéral. Cela correspond au comportement par défaut.
Supposons qu'au lieu de spécifier ALL FIELDS, vous souhaitez rechercher uniquement dans les champs de nom. Vous utilisez ainsi NAME FIELDS. Pour rechercher uniquement dans les champs de téléphone, vous utilisez PHONE FIELDS. Vous comprenez maintenant le fonctionnement ?
Clause RETURNING
Vous utilisez la clause RETURNING pour spécifier les données à renvoyer et les objets dans lesquels rechercher. Dans l'exemple ci-dessus, nous avons renvoyé le champ Name de l'objet Account, et les champs Lastname, FirstName et Email de l'objet Contact. Tous les champs qui peuvent être recherchés dans les deux objets étaient inclus dans la recherche, mais les résultats renvoyés comprenaient uniquement les champs indiqués entre parenthèses.
Si vous spécifiez un nom d'objet sans indiquer de nom de champ entre parenthèses, la recherche renvoie uniquement l'ID de cet objet si une correspondance est trouvée.
La syntaxe SOSL contient d'autres clauses facultatives qui peuvent vous intéresser. Pour plus d'informations, reportez-vous aux documents officiels.
Nous allons maintenant examiner comment SOSL gère les correspondances approximatives par rapport aux autres moteurs de recherche de texte intégral. Outre le mot-clé LIKE que vous pouvez utiliser dans une requête SOQL et les caractères génériques que vous pouvez utiliser dans la requête SOSL, Salesforce fournit uniquement une recherche de synonymes pour les surnoms.
SOQL ou SOSL ?
Laquelle utiliser ? La réponse ne va pas vous surprendre : tout dépend de votre objectif.
Si vous recherchez les données d’un seul objet et que vous connaissez les critères de cet objet, vous allez probablement utiliser le SOQL. La plupart de vos requêtes seront probablement en SOQL.
SOSL est plus utile lorsque vous ne savez pas exactement dans quels champs et objets vos données résident, et lorsque vous devez effectuer une recherche dans plusieurs objets. Cela est particulièrement vrai lorsque ces objets ne sont pas associés, car SOQL fonctionne uniquement avec des objets associés.
Exécution d'une recherche SOSL
Vous savez désormais pourquoi et comment utiliser une recherche SOSL. Nous allons maintenant en créer une.
Il existe plusieurs méthodes pour exécuter une recherche SOSL, mais nous allons nous intéresser ici à la plus simple, qui utilise l’éditeur de requête dans la Developer Console. Vous vous rappelez que nous l'avons utilisée dans l'unité précédente sur SOQL.
Prérequis
Avant d'exécuter la recherche SOSL, nous devons ajouter des données à l'organisation de développement. Nous allons d'abord créer un document exemple que nous pouvons charger dans notre organisation de développement.
- Dans le Bloc-notes ou dans n'importe quel éditeur de texte, créez un fichier, puis saisissez le texte suivant :
First quarter figures were better than expected for new employee Joseph Smith.
- Enregistrez le fichier sur votre ordinateur local, sous le nom TestDocument.txt.
- Dans votre organisation Developer Edition, sous l’onglet Fichiers, cliquez sur Charger des fichiers.
- Accédez à l'emplacement auquel vous avez enregistré le fichier TestDocument.txt, sélectionnez-le, puis cliquez sur Ouvrir.
- Cliquez sur Terminé.
Nous devons également ajouter des données à certains de nos objets standard.
- Dans le menu Configuration, sélectionnez Developer Console pour ouvrir la Developer Console.
- Dans la Developer Console, sélectionnez Débogage > Ouvrir la fenêtre d’exécution anonyme.
- Supprimez le code existant, puis insérez l’extrait suivant :
// Add Account and related Contact Account acct = new Account( Name='Test Account', Phone='(225)555-8989', NumberOfEmployees=10, BillingCity='Baton Rouge'); insert acct; // Get the Id of the Inserted Account ID acctID = acct.ID; // Add a contact to the Account.Contact con = new Contact( FirstName='Joseph', LastName='Smith', Phone='(225)555-8787', Email='jsmith@testaccount.com', AccountId=acctID); insert con;
- Cliquez sur Exécuter.
Utilisation de la Developer Console
Nous disposons maintenant de données exemple à rechercher. Nous pouvons utiliser Query Editor pour effectuer une nouvelle recherche SOSL.
- Dans la Developer Console, cliquez sur l'onglet Query Editor dans le volet inférieur.
- Supprimez le code existant, puis insérez l’extrait suivant :
FIND {joey} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName), ContentVersion(Title)
Vous remarquerez ici que les guillemets droits qui entouraient le terme de recherche dans notre exemple précédent ont été remplacés par des accolades. Nous devons les utiliser à la place des guillemets pour effectuer la recherche SOSL dans Query Editor. Si la recherche était effectuée dans un code Apex, vous pourriez utiliser des guillemets droits. Notez également que le terme de recherche est « joey », un surnom connu utilisé pour Joseph (le nom que nous recherchons est Joseph).
- Cliquez sur Exécuter. Les résultats de recherche affichent un seul onglet. Le Contact que vous avez inséré est répertorié sous l'onglet Contact, car une correspondance a été trouvée basée sur la fonctionnalité de surnom disponible dans Winter ’16. Le fichier TestDocument que vous avez chargé n'est pas répertorié, car la recherche de surnom s'applique uniquement aux objets Compte, Contact, Piste et Utilisateur. Révisons notre test et récupérons tous les résultats.
- Dans Query Editor, remplacez le code existant par :
FIND {jos*} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName), ContentVersion(Title)
- Cliquez sur Exécuter.
- Vos résultats de recherche affichent désormais deux onglets. L'onglet Document affiche le nom du document que vous avez chargé. Notez que nous avons utilisé une recherche de caractère générique pour récupérer tous les résultats voulus.
En savoir plus
Il se peut qu'une recherche SOSL ne renvoie pas tous les résultats correspondants en raison de limitations. Ne perdez pas de vue que Salesforce est un environnement mutualisé. Si chaque client était autorisé à utiliser toutes les ressources, le système tomberait rapidement en panne. Les recherches qui dépassent 20 000 caractères peuvent surcharger le système. Par conséquent, les recherches sont limitées en SOSL de la même façon qu'elles le sont en SOQL. Nous allons ensuite apprendre à optimiser nos requêtes de recherche.