SOSL クエリの作成
学習の目的
SOSL 入門
List<List<SObject>> searchList = [FIND 'SFDC' IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName)];
SOQL と SOSL の相違点と類似点
SOQL と同様、SOSL では組織のレコードから特定の情報を検索できます。一度に 1 つの標準またはカスタムオブジェクトしか照会できない SOQL とは異なり、1 つの SOSL クエリですべてのオブジェクトを検索できます。
もう 1 つの相違点として、SOSL が単語の一致に基づいて項目を検索するのに対し、SOQL はデフォルトで完全一致検索を実行します (ワイルドカードを使用しない場合)。たとえば、SOSL で「Digital」を検索すると、項目値が「Digital」や「The Digital Company」のレコードが返されますが、SOQL では項目値が「Digital」のレコードのみが返されます。
SOQL と SOSL は、2 つの別個の言語であり、構文が異なります。各言語でユースケースも異なります。
- 1 つのオブジェクトのレコードを取得する場合は、SOQL を使用します。
- 複数のオブジェクトを対象に項目を検索する場合は、SOSL を使用します。SOSL クエリは、オブジェクトのほとんどのテキスト項目を検索できます。
前提条件
この単元の一部のクエリでは、組織に取引先と取引先責任者があることを前提としています。SOQL の単元でサンプルデータを作成しなかった場合は、この単元でサンプルデータを作成します。すでに作成している場合は、このセクションのサンプルデータの作成をスキップできます。
- 開発者コンソールの [Debug (デバッグ)] メニューから [Execute Anonymous (匿名実行)] ウィンドウを開きます。
- ウィンドウに次のスニペットを入力し、[Execute (実行)] をクリックします。
// 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;
クエリエディターを使用する
開発者コンソールのクエリエディターコンソールでは、SOSL クエリを実行して結果を表示できます。クエリエディターを使用して、すばやくデータベースを調査できます。そのため、SOSL クエリを Apex コードに追加する前にテストするのに適しています。クエリエディターを使用するときは、前後の Apex コードなしで SOSL ステートメントのみを入力する必要があります。
次の SOSL の例を実行してみましょう。
- 開発者コンソールで [Query Editor (クエリエディター)] タブをクリックします。
- 次のコードをコピーしてクエリエディターの下の最初のボックスに貼り付け、[Execute (実行)] をクリックします。
FIND {Wingo} IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName,Department)
条件を満たす組織のすべての取引先レコードと取引先責任者レコードが [Query Results (クエリ結果)] セクションに項目のある行として表示されます。結果は、オブジェクト (取引先または取引先責任者) ごとにタブでグループ化されます。この SOSL クエリは、値が Wingo と一致する項目を持つレコードを返します。サンプルデータでは、値が Wingo の項目を持つのは 1 つの取引先責任者のみであるため、この取引先責任者が返されます。
基本的な SOSL 構文
- 検索するテキスト式 (単語または語句)
- 検索する項目範囲
- 取得するオブジェクトと項目のリスト
- ソースオブジェクトの行の選択条件
Apex の基本的な SOSL クエリの構文を次に示します。
FIND 'SearchQuery' [IN SearchGroup] [RETURNING ObjectsAndFields]
クエリエディターと API で構文がわずかに異なります。
FIND {SearchQuery} [IN SearchGroup] [RETURNING ObjectsAndFields]
SearchQuery は、検索するテキスト (単語または語句) です。検索語は、論理演算子 (AND、OR) と括弧でグループ化できます。また、検索語にはワイルドカード文字 (*、?) を含めることができます。* ワイルドカードは検索語の途中または末尾にある 0 個以上の文字と一致します。? ワイルドカードは検索語の途中または末尾にある 1 文字のみと一致します。
テキスト検索は大文字と小文字を区別しません。たとえば、Customer
、customer
、CUSTOMER
の検索はすべて同じ結果を返します。
SearchGroup は省略可能です。これは検索する項目範囲です。指定しない場合、デフォルトの検索範囲は全項目です。SearchGroup は、次のいずれか値を取ります。
ALL FIELDS
NAME FIELDS
EMAIL FIELDS
PHONE FIELDS
SIDEBAR FIELDS
ObjectsAndFields は省略可能です。これは検索結果で返す情報です。1 つ以上の sObject のリストに加え、各 sObject 内の 1 つ以上の項目のリストと省略可能な絞り込み基準項目です。指定されていない場合、検索結果には見つかったすべてのオブジェクトの ID が含まれます。
単語と語句
SearchQuery には、2 種類のテキストが含まれます。
-
単語 —
test
やhello
などの 1 語。SearchQuery
内の単語は、スペース、句読点、および文字から数字 (またはその逆) への変更によって区切られます。単語では常に大文字と小文字は区別されません。 -
語句 — 二重引用符で囲まれた単語とスペースのコレクション (
"john smith"
など)。複数の単語を論理演算子およびグルーピング演算子と組み合わせて、より複雑なクエリを作成できます。
検索の例
SOSL の検索のしくみを知るために、さまざまな検索文字列を試し、サンプルデータに応じて出力がどのように変わるかを確認してみましょう。次の表は、さまざまな検索文字列の例とその SOSL 検索結果の一覧です。
すべての項目で検索: | 検索の説明 | 一致レコードおよび項目 |
---|---|---|
The Query | この検索では、テキストの任意の位置に The と Query の両方が含まれる項目を持つすべてのレコードが返されます。検索語での単語の順序は考慮されません。 | 取引先: SFDC Query Man (名前項目が一致) |
Wingo OR Man | この検索では OR 論理演算子を使用します。単語 Wingo が含まれる項目を持つレコードまたは単語 Man が含まれる項目を持つレコードが返されます。 | 取引先責任者: Carol Ruiz、部署: 'Wingo' 取引先: SFDC Query Man (名前項目が一致) |
1212 | この検索では、項目に単語 1212 が含まれる項目を持つすべてのレコードが返されます。1212 は、ダッシュで区切られている場合は単語と見なされるため、-1212 で終わる電話項目は一致します。 | 取引先: The SFDC Query Man、電話: '(415)555-1212' 取引先責任者: Carol Ruiz、電話: '(415)555-1212' |
wing* | これはワイルドカード検索です。この検索では、値が wing で始まる項目を持つすべてのレコードが返されます。 | 取引先責任者: Maria Ruiz、部署: 'Wingo' 取引先: The SFDC Query Man、説明: 'Expert in wing technologies.' |
SOSL Apex の例
次の例は、Apex で SOSL クエリを実行する方法を示します。まず、変数 soslFindClause
に、OR 論理演算子で組み合わされた 2 つの単語 (Wingo と SFDC) で構成されている検索クエリが割り当てられます。SOSL クエリでは、このローカル変数は先頭にコロンを付けて (バインドとも呼ばれる) 参照されます。結果の SOSL クエリでは、任意の項目内にある Wingo または SFDC が検索されます。サンプルのすべての取引先にいずれかの語が含まれる項目があるため、この例ではすべてのサンプル取引先が返されます。SOSL 検索結果はリストのリストで返されます。各リストには、返されたレコードの配列が含まれます。この場合、リストには 2 つの要素があります。インデックス 0 のリストには取引先の配列が含まれます。インデックス 1 のリストには取引先責任者の配列が含まれます。
開発者コンソールの [Execute Anonymous (匿名実行)] ウィンドウで、次のスニペットを実行します。次に、デバッグログを調査してすべてのレコードが返されたことを確認します。
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); }
もうひとこと...
SOSL クエリで返された結果の絞り込み、並び替え、および制限ができます。SOSL クエリでは複数の sObject を返せるため、検索条件は RETURNING 句内部の各 sObject 内で適用されます。
オブジェクトの WHERE 句に条件を追加して、SOSL の結果を絞り込むことができます。たとえば、RETURNING Account(Name, Industry WHERE Industry='Apparel')
では、業種が Apparel の取引先のみが返されます。
同様に、オブジェクトの ORDER BY 句を追加することで、1 つの sObject について結果の並び替えがサポートされます。たとえば、RETURNING Account(Name, Industry ORDER BY Name)
句では、返された取引先が名前項目で並び替えられます。
返されるレコード数をレコードのサブセットに制限できます。たとえば、RETURNING Account(Name, Industry LIMIT 10)
では、返される取引先を 10 件のみに制限します。