Schreiben von SOSL-Abfragen
Lernziele
- Beschreiben der Unterschiede zwischen SOSL und SOQL
- Suchen nach Feldern in mehreren Objekten mithilfe von SOSL-Abfragen
- Ausführen von SOSL-Abfragen mithilfe des Abfrage-Editors in der Entwicklerkonsole
Erste Schritte mit SOSL
List<List<SObject>> searchList = [FIND 'SFDC' IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName)];
Unterschiede und Gemeinsamkeiten zwischen SOQL und SOSL
Wie mit SOQL können Sie auch mit SOSL die Datensätze Ihrer Organisation nach bestimmten Informationen durchsuchen. Im Gegensatz zu SOQL, das nur jeweils ein Standardobjekt bzw. benutzerdefiniertes Objekt abfragen kann, kann eine einzelne SOSL-Abfrage alle Objekte durchsuchen.
Ein weiterer Unterschied besteht darin, dass SOSL Felder basierend auf Wortübereinstimmungen abgleicht, während SOQL standardmäßig nach genauen Treffern sucht (sofern keine Platzhalter verwendet werden). Die Suche nach "Digital" in SOSL beispielsweise gibt Datensätze zurück, deren Feldwerte "Digital" oder "The Digital Company" lauten, SOQL jedoch gibt nur Datensätze mit den Feldwerten "Digital" zurück.
SOQL und SOSL sind zwei eigenständige Sprachen mit unterschiedlicher Syntax. Jede Sprache hat ihren eigenen Anwendungsfall:
- Verwenden Sie SOQL zum Abrufen von Datensätzen für ein einzelnes Objekt.
- Verwenden Sie SOSL zum Durchsuchen von Feldern in mehreren Objekten. SOSL-Abfragen können die meisten Textfelder in einem Objekt durchsuchen.
Voraussetzungen
Einige Abfragen in diesem Abschnitt setzen voraus, dass die Organisation über Accounts und Kontakte verfügt. Wenn Sie im Abschnitt zu SOQL keine Beispieldaten erstellt haben, erstellen Sie sie in diesem Abschnitt. Ansonsten können Sie die Erstellung der Beispieldaten in diesem Abschnitt überspringen.
- Öffnen Sie in der Entwicklerkonsole über das Menü Debug das Fenster für die anonyme Ausführung.
- Fügen Sie den unten stehenden Codeauszug in das Fenster ein und klicken Sie auf Execute (Ausführen).
// Add account and related contact Account acct = new Account( Name='SFDC Computing', Phone='(415)555-1212', NumberOfEmployees=50, BillingCity='San Francisco'); insert acct; // Once the account is inserted, the sObject will be // populated with an ID. // Get this ID. ID acctID = acct.ID; // Add a contact to this account. Contact con = new Contact( FirstName='Carol', LastName='Ruiz', Phone='(415)555-1212', Department='Wingo', AccountId=acctID); insert con; // Add account with no contact Account acct2 = new Account( Name='The SFDC Query Man', Phone='(310)555-1213', NumberOfEmployees=50, BillingCity='Los Angeles', Description='Expert in wing technologies.'); insert acct2;
Verwenden des Abfrage-Editors
Die Entwicklerkonsole umfasst die Abfrage-Editor-Konsole, mit der Sie SOSL-Abfragen ausführen und die Ergebnisse anzeigen können. Der Abfrage-Editor bietet eine schnelle Möglichkeit zum Überprüfen der Datenbank. Dies ist eine gute Methode, Ihre SOSL-Abfragen zu testen, bevor Sie sie zu Ihrem Apex-Code hinzufügen. Wenn Sie den Abfrage-Editor verwenden, müssen Sie nur die SOSL-Anweisung ohne den umgebenden Apex-Code angeben.
Führen Sie folgendes SOSL-Beispiel aus:
- Klicken Sie in der Developer Console auf die Registerkarte Query Editor (Abfrage-Editor).
- Kopieren Sie den folgenden Code, fügen Sie ihn in das erste Feld unter "Query Editor" ein und klicken Sie dann auf Execute (Ausführen).
FIND {Wingo} IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName,Department)
Alle Account- und Kontaktdatensätze in Ihrer Organisation, die die Kriterien erfüllen, werden im Abschnitt "Query Results" (Abfrageergebnisse) als Zeilen mit Feldern angezeigt. Die Ergebnisse werden für jedes Objekt (Account oder Kontakt) in Registerkarten zusammengefasst. Die SOSL-Abfrage gibt Datensätze mit Feldern zurück, deren Werte mit "Wingo" übereinstimmen. Basierend auf unseren Beispieldaten weist nur ein Kontakt ein Feld mit dem Wert "Wingo" auf, daher wird dieser Kontakt zurückgegeben.
Grundlegende SOSL-Syntax
- Textausdruck (einzelnes Wort oder Wortgruppe), nach dem gesucht werden soll
- Umfang der zu durchsuchenden Felder
- Liste der abzurufenden Objekte und Felder
- Bedingungen zum Auswählen von Zeilen in den Quellobjekten
Dies ist die Syntax einer grundlegenden SOSL-Abfrage in Apex:
FIND 'SearchQuery' [IN SearchGroup] [RETURNING ObjectsAndFields]
Denken Sie daran, dass die Syntax im Abfrage-Editor und in der API geringfügig unterschiedlich ist:
FIND {SearchQuery} [IN SearchGroup] [RETURNING ObjectsAndFields]
SearchQuery ist der Text, nach dem gesucht werden soll (ein einzelnes Wort oder eine Wortgruppe). Suchbegriffe können mithilfe von logischen Operatoren (AND, OR) und Klammern gruppiert werden. Suchbegriffe können auch Platzhalterzeichen (*, ?) enthalten. Der Platzhalter "*" gleicht null oder mehrere Zeichen in der Mitte oder am Ende des Suchbegriffs ab. Der Platzhalter "?" gleicht nur ein Zeichen in der Mitte oder am Ende des Suchbegriffs ab.
Bei Textsuchvorgängen wird nicht zwischen Groß- und Kleinschreibung unterschieden. Die Suche nach "Customer
", "customer
" oder "CUSTOMER
" beispielsweise gibt jeweils dieselben Ergebnisse zurück.
SearchGroup ist optional. Dies ist der Umfang der zu durchsuchenden Felder. Falls keine Angabe erfolgt, umfasst der Standard-Suchumfang alle Felder. Für SearchGroup kann einer der folgenden Werte verwendet werden:
ALL FIELDS
NAME FIELDS
EMAIL FIELDS
PHONE FIELDS
SIDEBAR FIELDS
ObjectsAndFields ist optional. Dies sind die im Suchergebnis zurückzugebenden Informationen – eine Liste mit einem oder mehr sObjects und, innerhalb jedes sObject, eine Liste mit einem oder mehr Feldern mit optionalen Werten, nach denen gefiltert werden kann. Falls keine Angabe erfolgt, enthalten die Suchergebnisse die IDs aller gefundenen Objekte.
Einzelne Wörter und Wortgruppen
Eine SearchQuery enthält zwei Typen von Text:
-
Einzelnes Wort: einzelnes Wort, z. B. "
test
" oder "hello
". Wörter in der "SearchQuery
" werden durch Leerzeichen, Satzzeichen oder Wechsel von Buchstaben zu Ziffern (und umgekehrt) getrennt. Bei Wörtern wird nie zwischen Groß- und Kleinschreibung unterschieden. -
Wortgruppe: Sammlung von Wörtern und Leerzeichen, umgeben von doppelten Anführungszeichen, z. B.
"john smith"
. Mehrere Wörter können mithilfe von logischen Operatoren und Gruppierungsoperatoren zu einer komplexeren Abfrage kombiniert werden.
Suchbeispiele
Um herauszufinden, wie die Suche mit SOSL funktioniert, probieren wir verschiedene Suchzeichenfolgen aus, um zu sehen, was basierend auf unseren Beispieldaten ausgegeben wird. In unten stehender Tabelle werden verschiedene Beispiel-Suchzeichenfolgen und die SOSL-Suchergebnisse aufgelistet.
Suche in allen Feldern nach: | Beschreibung des Suchvorgangs | Abgeglichene Datensätze und Felder |
---|---|---|
The Query | Diese Suche gibt alle Datensätze zurück, deren Felder beide Wörter, "The" und "Query", an einer beliebigen Stelle im Text enthalten. Die Reihenfolge der Wörter im Suchbegriff spielt keine Rolle. | Account: The SFDC Query Man (Namensfeld abgeglichen) |
Wingo OR Man | Bei dieser Suche wird der logische Operator OR verwendet. Sie gibt Datensätze mit Feldern, die das Wort "Wingo" enthalten, und Datensätze mit Feldern, die das Word "SFDC" enthalten, zurück. | Kontakt: Carol Ruiz, Abteilung: 'Wingo' Account: The SFDC Query Man (Namensfeld abgeglichen) |
1212 | Diese Suche gibt alle Datensätze zurück, deren Felder das Wort "1212" enthalten. Telefonfelder, die auf "-1212" enden, werden als Treffer zurückgegeben, da "1212" bei Abtrennung durch den Bindestrich als Wort angesehen wird. | Account: The SFDC Query Man, Telefon: '(415) 555-1212' Kontakt: Carol Ruiz, Telefon: '(415) 555-1212' |
wing* | Dies ist eine Platzhaltersuche. Diese Suche gibt alle Datensätze mit einem Feldwert zurück, der mit "wing" beginnt. | Kontakt: Maria Ruiz, Abteilung: 'Wingo' Account: The SFDC Query Man, Beschreibung: 'Expert in wing technologies.' |
Beispiel für SOSL in Apex
Das folgende Beispiel zeigt, wie eine SOSL-Abfrage in Apex ausgeführt wird. Zunächst wird der Variablen soslFindClause
die Suchanfrage zugewiesen, die aus zwei Begriffen (Wingo und SFDC) besteht, welche mittels des logischen Operators OR kombiniert werden. Die SOSL-Abfrage verweist auf diese lokale Variable, indem sie ihr einen Doppelpunkt voranstellt, was auch als Bindung bezeichnet wird. Die resultierende SOSL-Abfrage sucht in allen Feldern nach "Wingo" oder "SFDC". Mit diesem Beispiel werden alle Beispielaccounts zurückgegeben, da sie alle ein Feld aufweisen, das eines der Wörter enthält. Die SOSL-Suchergebnisse werden in einer Liste von Listen zurückgegeben. Jede Liste enthält ein Array der zurückgegebenen Datensätze. In diesem Fall verfügt die Liste über zwei Elemente. Bei Index 0 enthält die Liste das Array mit Accounts. Bei Index 1 enthält die Liste das Array mit Kontakten.
Führen Sie diesen Codeauszug im Fenster für die anonyme Ausführung der Entwicklerkonsole aus. Überprüfen Sie anschließend im Debug-Protokoll, dass alle Datensätze zurückgegeben wurden.
String soslFindClause = 'Wingo OR SFDC'; List<List<sObject>> searchList = [FIND :soslFindClause IN ALL FIELDS RETURNING Account(Name),Contact(FirstName,LastName,Department)]; Account[] searchAccounts = (Account[])searchList[0]; Contact[] searchContacts = (Contact[])searchList[1]; System.debug('Found the following accounts.'); for (Account a : searchAccounts) { System.debug(a.Name); } System.debug('Found the following contacts.'); for (Contact c : searchContacts) { System.debug(c.LastName + ', ' + c.FirstName); }
Weitere Infos
Sie können die zurückgegebenen Ergebnisse einer SOSL-Abfrage filtern, neu anordnen und begrenzen. Da SOSL-Abfragen mehrere sObjects zurückgeben können, werden diese Filter in jedem sObject innerhalb der RETURNING-Klausel angewendet.
SOSL-Ergebnisse können durch Hinzufügen von Bedingungen in der WHERE-Klausel für ein Objekt gefiltert werden. Folgendes Beispiel etwa gibt nur Accounts zurück, deren Branche "Apparel" lautet: RETURNING Account(Name, Industry WHERE Industry='Apparel')
.
Entsprechend können Ergebnisse für ein sObject durch Hinzufügen von ORDER BY für ein Objekt angeordnet werden. Mit folgendem Beispiel etwa werden die zurückgegebenen Accounts nach dem Namensfeld angeordnet: RETURNING Account(Name, Industry ORDER BY Name)
.
Die Anzahl der zurückgegebenen Datensätze kann auf einen Teil der Datensätze begrenzt werden. Mit diesem Beispiel werden die zurückgegebenen Accounts auf nur 10 begrenzt: RETURNING Account(Name, Industry LIMIT 10)
.