Schreiben von SOSL-Abfragen
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Verstehen, inwiefern sich SOSL von anderen Volltext-Suchen unterscheidet
- Erkennen der grundlegenden SOSL-Syntax
- Beschreiben der Unterschiede zwischen SOSL und SOQL
- Erstellen einer SOSL-Abfrage, die in mehreren sObjects sucht
Was ist SOSL?
In der letzten Lektion haben wir Ihnen SOQL vorgestellt und Sie haben gelernt, wie Sie es nutzen, um Daten in sObjects und den damit verbundenen Tabellen abfragen. Für textbasierte Abfragen in mehreren sObjects können Sie die Salesforce-Option für die Volltextsuche, nämlich SOSL (Salesforce Object Search Language), verwenden.
Als .NET-Entwickler kennen Sie möglicherweise die Volltext-Suchfunktionen, die in Microsoft SQL Server (MS FTS) zur Verfügung stehen. Außerdem kennen Sie möglicherweise die bekannte Suchmaschinenbibliothek Lucene.Net, die aus der ursprünglichen Java-Version in C# portiert wurde.
Der Umstand, dass SOSL sich von diesen Volltext-Suchalternativen unterscheidet, ist Vor- und Nachteil zugleich. Die größten Unterschiede haben damit zu tun, was zum Einrichten und Verwalten der Indizes benötigt wird. Salesforce verwendet zum Antreiben von SOSL die Open-Source-Such- und Indizierungsmaschine Lucene, die jedoch so eingerichtet wurde, dass Sie sich keine Gedanken um Installations- und Konfigurationstätigkeiten machen müssen. Außerdem müssen Sie keine Indizes verwalten. Im Grunde genommen haben Sie nicht wirklich viel Kontrolle darüber, wie Suchindizes verwendet werden, was gut ist, da es heißt, dass das Schreiben von SOSL-Abfragen einfach ist.
Als .NET-Entwickler möchten Sie aber gerne Ihren Code optimieren. Zu hören, dass Sie wenig Kontrolle über die Konfiguration und die Indizes haben, könnte also dazu führen, dass Sie sich ein klein wenig unwohl fühlen. Wir möchten Ihnen versichern, dass Sie, auch wenn Sie weniger Kontrolle haben, immer noch daran arbeiten können, die Abfrageleistung zu verbessern, und zwar sowohl bei SOSL- als auch bei SOQL-Abfragen. In Kürze werden wir uns eingehend mit diesen Methoden beschäftigen, aber jetzt wenden wir uns erst einmal den Besonderheiten der SOSL-Syntax zu.
Erstellen einer SOSL-Abfrage
Wenn Sie MS FTS kennen, wissen Sie, dass Sie SELECT-Abfragen schreiben müssen, die eine CONTAINS- oder eine FREETEXT-Anweisung verwenden. Mit der leistungsstarken CONTAINS-Suche, die viele Varianten hat, können Sie nach exakten oder Fuzzy-Abgleichen sowie nach Worten suchen, die einem anderen Wort ähnlich sind.
SOSL verwendet eine einfachere Suchsyntax, die nicht das SOQL-Schlüsselwort SELECT verwendet. Stattdessen verwendet sie das Schlüsselwort FIND. Eine grundlegende Abfrage sieht wie folgt aus:
FIND {"grand*"} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName, Email)
Wenn wir sie uns im Detail anschauen, sehen wir, dass sie drei Teile hat.
FIND-Klausel mit Suchbegriff
Die FIND-Klausel ist erforderlich. Durch sie wird die SOSL-Suche eindeutig. FIND wird gefolgt von dem Begriff, nach dem Sie suchen, ganz gleich, ob es sich um ein einzelnes Wort oder um eine Phrase handelt. In diesem Fall ist das Wort 'grand'. Sie können außerdem, wie in unserem Beispiel, Platzhalterzeichen wie diese beiden verwenden:
* 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
In der nächsten Lektion werden wir uns noch weiter mit Platzhaltern beschäftigen. In der Zwischenzeit müssen Sie aber wissen, dass Sie nur, weil Sie Platzhalter sowohl in der Mitte als auch am Ende des Suchbegriffs verwenden können, dies nicht auch unbedingt tun sollten. Am besten tun Sie das nicht, da es die Abfrageleistung stark beeinträchtigen kann.
IN-Klausel
Mit der IN-Klausel können Sie eine Suchgruppe festlegen. Durch sie weiß Salesforce, welche Felder durchsucht werden sollen. Es kommt aber noch etwas wirklich Großes, dass Sie hier kennenlernen werden, also haben Sie noch ein wenig Geduld.
Im Beispiel oben haben wir ALL FIELDS angegeben. Man könnte dies wörtlich nehmen und meinen, dass alle Felder durchsucht werden, aber je nachdem, welches Objekt Sie in der RETURNING-Klausel angeben, werden nur bestimmte textbasierte Felder einbezogen. Wie bitte?
Wie schon gesagt, haben Sie noch ein wenig Geduld. Sie sehen, dass ALLE Felder durchsucht werden, wenn das Objekt, das Sie zurückgeben, ein Artikel, ein Dokument, ein Feedkommentar, ein Feedeintrag, eine Datei, ein Produkt oder eine Lösung ist, da es sich dabei um die Objekttypen handelt, bei denen Sie möchten, dass alle Felder durchsucht werden.
Wenn Sie aber die meisten Standard- oder benutzerdefinierten Objekte durchsuchen, die alle möglichen verrückten nicht textbasierten Felder enthalten, macht es Sinn, nur die Namens-, E-Mail-, Telefon- und Randleistenfelder zu durchsuchen. Das ist, nebenbei bemerkt, das Standardverhalten.
Nehmen wir einmal an, dass Sie nicht ALL FIELDS angeben, sondern nur die Namensfelder durchsuchen wollen. In dem Fall würden Sie NAME FIELDS verwenden. Um nur Telefonfelder zu durchsuchen, verwenden Sie PHONE FIELDS. Sehen Sie, wie das funktioniert?
RETURNING-Klausel
Mit der RETURNING-Klausel geben Sie an, welche Daten zurückgegeben werden und welche Objekte durchsucht werden sollen. In dem Beispiel oben haben wir das Feld 'Name' aus dem Bereich 'Account' und die Felder 'Lastname', 'Firstname' und 'Email' aus dem Bereich 'Contact' zurückgegeben. Bei der Suche wurden in beiden Objekten alle durchsuchbaren Felder durchsucht, aber die zurückgegebenen Ergebnisse enthalten nur die in Klammern aufgeführten Felder.
Wenn Sie einen Objektnamen ohne einen Feldnamen in Klammern angeben, gibt die Suche nur die ID zu diesem Objekt zurück, wenn ein passendes Ergebnis gefunden wird.
Die SOSL-Syntax hat andere optionale Klauseln, die Sie vielleicht interessieren; um mehr darüber zu erfahren, schauen Sie sich am besten die offiziellen Unterlagen an.
Jetzt fragen Sie sich bestimmt, wie sich SOSL mit anderen Volltext-Suchmaschinen vergleichen lässt, wenn es um Fuzzy-Abgleiche geht. Anders als beim Schlüsselwort LIKE, das Sie in einer SOQL-Abfrage verwenden können, und bei den Platzhaltern, die Sie in der SOSL-Abfrage verwenden können, bietet Salesforce lediglich eine Synonymsuche, bei der Sie nach Nicknames suchen können.
SOQL oder SOSL?
Welche von beiden verwenden Sie? Ganz sicher ist die Antwort keine Überraschung für Sie: Das hängt davon ab, was Sie erreichen möchten.
Wenn Sie Daten aus einem einzelnen Objekt benötigen und die Kriterien dieses Objekts genau kennen, werden Sie sich höchstwahrscheinlich für SOQL entscheiden. Tatsächlich werden die meisten Ihrer Abfragen wahrscheinlich in SOQL durchgeführt.
SOSL ist am hilfreichsten, wenn Sie die exakten Felder und Objekte, in denen sich Ihre Daten befinden, nicht kennen und mehrere Objekte durchsuchen müssen. Das gilt insbesondere dann, wenn diese Objekte nicht verwandt sind, da SOQL nur bei verwandten Objekten funktioniert.
Ausführen von SOSL-Suchen
Jetzt, da Sie wissen, warum und wie Sie eine SOSL-Suche durchführen, gehen wir doch einen Schritt weiter und versuchen, eine SOQL-Suche zu erstellen.
Sie können SOSL-Suchen auf verschiedene Arten und Weisen ausführen, aber jetzt konzentrieren wir uns erst einmal auf die einfachste, bei der der Query Editor in der Entwicklerkonsole verwendet wird Daran werden Sie sich wahrscheinlich noch aus der letzten Lektion über SOQL erinnern.
Voraussetzungen
Bevor wir die SOSL-Suche ausführen, müssen wir der Entwicklungsorganisation Daten hinzufügen. Zunächst erstellen wir ein Beispieldokument, das wir in unsere Entwicklungsorganisation hochladen können.
- Erstellen Sie in Notepad oder einem beliebigen textbasierten Editor eine Datei und geben Sie den folgenden Text ein:
First quarter figures were better than expected for new employee Joseph Smith.
- Speichern Sie die Datei auf Ihrem lokalen Rechner unter dem Namen TestDocument.txt.
- Klicken Sie in Ihrer Developer Edition-Organisation in der Registerkarte "Dateien" auf Dateien hochladen.
- Gehen Sie an den Ort, an dem Sie die Datei TestDocument.txt gespeichert haben und klicken Sie auf Open.
- Klicken Sie auf Fertig.
Außerdem müssen wir einigen unserer Standardobjekte Daten hinzufügen.
- Wählen Sie im Menü "Setup" Developer Console aus, um die Entwicklerkonsole zu öffnen.
- Wählen Sie in der Entwicklerkonsole Debug > Open Execute Anonymous Window aus.
- Löschen Sie den vorhandenen Code und fügen Sie den folgenden Ausschnitt ein:
// 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;
- Klicken Sie auf Execute (Ausführen).
Verwenden der Entwicklerkonsole
Jetzt haben wir Beispieldaten, nach denen wir suchen können, sodass wir mithilfe des Query Editor eine neue SOSL-Suche ausführen können.
- Klicken Sie in der Entwicklerkonsole im unteren Bereich auf die Registerkarte Query Editor.
- Löschen Sie den vorhandenen Code und fügen Sie den folgenden Ausschnitt ein:
FIND {joey} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName), ContentVersion(Title)
Zunächst werden Sie feststellen, dass die einfachen Anführungszeichen, die den Suchbegriff in unserem Beispiel vorhin umgaben, durch geschweifte Klammern ersetzt wurden. Diese müssen wir anstelle von Anführungszeichen verwenden, wenn die SOSL-Suche im Query Editor durchgeführt wird. Wenn die Suche im Apex-Code durchgeführt würde, würden Sie einfache Anführungszeichen verwenden. Bitte beachten Sie auch, dass der Suchbegriff 'Joey' lautet, was häufig als Nickname für Joseph verwendet wird (tatsächlich suchen wir nach Joseph).
- Klicken Sie auf Execute (Ausführen). Als Suchergebnis wird lediglich eine Registerkarte angezeigt. Der Kontakt, den Sie eingegeben haben, ist auf der Registerkarte 'Contact' aufgeführt, da auf der Grundlage der Nickname-Funktion, die im Winter ’16 zur Verfügung gestellt wurde, ein passendes Ergebnis gefunden werden konnte. Das TestDocument, das Sie hochgeladen haben, ist jedoch nicht aufgeführt, da die Nickname-Suche nur auf die Objekte 'Account', 'Contact', 'Lead' und 'User' Anwendung findet. Überarbeiten wir also unseren Test, damit alle Ergebnisse angezeigt werden.
- Ersetzen Sie den vorhandenen Code im Query Editor durch Folgendes:
FIND {jos*} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName), ContentVersion(Title)
- Klicken Sie auf Execute (Ausführen).
- Als Suchergebnis werden jetzt zwei Registerkarten angezeigt. Auf der Registerkarte 'Document' wird der Name des Dokuments angezeigt, das Sie hoch geladen haben. Bitte beachten Sie, dass wir eine Platzhaltersuche durchgeführt haben, damit alle Ergebnisse angezeigt werden, die wir uns gewünscht haben.
Weitere Infos
Es kann passieren, dass bei einer SOSL-Suche aufgrund bestimmter Grenzen NICHT alle passenden Ergebnisse gefunden werden. Zur Erinnerung: Salesforce ist eine mandantenfähige Umgebung. Wenn jeder Kunde die Ressourcen maximal ausnutzen könnte, würde das ganze System im Nu zusammenbrechen. Suchen mit mehr als 20.000 Zeichen können das System belasten. Daher sind Suchen in SOSL genau wie in SOQL begrenzt. Als Nächstes erfahren Sie, wie Sie Ihre Suchabfragen optimieren.