SOQL および SOSL の概要
SOQL および SOSL の概要
Salesforce Object Query Language (SOQL)
Salesforce Object Search Language (SOSL)
どちらを使用するかの決定
1 つのオブジェクトのレコードを取得する場合は、SOQL を使用します。
複数のオブジェクトを対象に項目を検索する場合は、SOSL を使用します。SOSL クエリは、オブジェクトのほとんどのテキスト項目(ロングテキストエリア、リッチテキストエリア)を検索できます。
SOQL クエリは SELECT SQL ステートメントに相当し、組織のデータベースを検索します。
SOSL は、検索インデックスに対してテキストベースの検索をプログラム的に実行する方法です。
SOSL を使用して、Salesforce の複数の標準およびカスタムオブジェクトレコードを対象に項目を検索できます。
データがどのオブジェクトに存在しているかを認識しており、次の操作を行う場合は、SOQL を使用します。
1 つのオブジェクト、または相互に関連する複数のオブジェクトからデータを取得する。
指定された条件を満たすレコードの数をカウントする。
クエリの一部として結果を並び替える。
数値、日付、またはチェックボックス項目からデータを取得する。
データがどのオブジェクトまたは項目に存在しているかを認識しておらず、次の操作を行う場合、SOSL を使用します。
項目内に存在することがわかっている、特定用語のデータを取得する。SOSL では項目内の複数の用語をトークン化して、
そこから検索インデックスを構築できるため、SOSL 検索でより速く、より多くの関連結果を返すことができます。
相互に関連している、または関連していない複数のオブジェクトおよび項目を効率的に取得する。
ディビジョン機能を使用して、組織の特定のディビジョンのデータを取得する。
中国語、日本語、韓国語、タイ語のデータを取得する。CJKT 用語の形態的トークン化によって、結果の正確性が確保されます。
SOSL では Big Object はサポートされません。
Apex に埋め込まれた SOSL は、インライン SOSL と呼ばれます。
「SFDC」という語を含む項目を持つ取引先と取引先責任者を検索します
List<List<SObject>> searchList = [FIND 'SFDC' IN ALL FIELDS
RETURNING Account(Name), Contact(FirstName,LastName)];
FIND {Wingo} IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName,Department)
クエリエディタと API の検索クエリは、中括弧で囲む必要があります ({Wingo})。これに対し、Apex では、検索クエリは単一引用符で囲みます ('Wingo')。
1 つの SOSL クエリですべてのオブジェクトを検索できます
SOSL が単語の一致に基づいて項目を検索するのに対し、SOQL はデフォルトで完全一致検索を実行します (ワイルドカードを使用しない場合)。
SOSL で「Digital」を検索すると、項目値が「Digital」や「The Digital Company」のレコードが返されます
基本的な SOSL クエリの構文を次に示します。
FIND 'SearchQuery' [IN SearchGroup] [RETURNING ObjectsAndFields]
検索するテキスト式 (単語または語句)
SearchQuery は、検索するテキスト (単語または語句) です。検索語は、論理演算子 (AND、OR) と括弧でグループ化できます。
FIND {Wingo OR Man} IN ALL FIELDS RETURNING Account(Name,Description), Contact(FirstName,LastName,Department)
検索語にはワイルドカード文字 (*、?) を含めることができます。
* ワイルドカードは検索語の途中または末尾にある 0 個以上の文字と一致します。
? ワイルドカードは検索語の途中または末尾にある 1 文字のみと一致します。
SearchQuery には、2 種類のテキストが含まれます
単語 — test や hello などの 1 語。SearchQuery 内の単語は、スペース、句読点、および文字から数字 (またはその逆) への変更によって区切られます。
単語では常に大文字と小文字は区別されません
語句 — 二重引用符で囲まれた単語とスペースのコレクション ("john smith" など)
複数の単語を論理演算子およびグルーピング演算子と組み合わせて、より複雑なクエリを作成できます。
検索する項目範囲
SearchGroup は省略可能です。これは検索する項目範囲です。指定しない場合、デフォルトの検索範囲は全項目です。
ALL FIELDS
NAME FIELDS
EMAIL FIELDS
PHONE FIELDS
SIDEBAR FIELDS
取得するオブジェクトと項目のリスト
ObjectsAndFields は省略可能です。これは検索結果で返す情報です
指定されていない場合、検索結果には見つかったすべてのオブジェクトの ID が含まれます。⇒IDだけ表示される
ソースオブジェクトの行の選択条件
RETURNING Account(Name, Industry WHERE Industry='Apparel')
RETURNING Account(Name, Industry ORDER BY Name)
RETURNING Account(Name, Industry LIMIT 10)
この検索では、テキストの任意の位置に The と Query の両方が含まれる項目を持つすべてのレコードが返されます。検索語での単語の順序は考慮されません。
FIND {The Query} IN ALL FIELDS RETURNING Account(Name,Description), Contact(FirstName,LastName,Department)
この検索では OR 論理演算子を使用します。単語 Wingo が含まれる項目を持つレコードまたは単語 Man が含まれる項目を持つレコードが返されます。
FIND {Wingo OR Man} IN ALL FIELDS RETURNING Account(Name,Description), Contact(FirstName,LastName,Department)
この検索では、項目に単語 1212 が含まれる項目を持つすべてのレコードが返されます。1212 は、ダッシュで区切られている場合は単語と見なされるため、-1212 で終わる電話項目は一致します。
FIND {1212} IN ALL FIELDS RETURNING Account(Name,Description), Contact(FirstName,LastName,Department)
これはワイルドカード検索です。この検索では、値が wing で始まる項目を持つすべてのレコードが返されます。
FIND {wing*} IN ALL FIELDS RETURNING Account(Name,Description), Contact(FirstName,LastName,Department)
SOSL Apex の例
List<List<sObject>> searchList = [FIND 'Wingo OR SFDC' 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);
}
Dynamic SOQLを実行する場合は「Database.query」を使用しますが、Dynamic SOSLを実行する場合は、「Search.query」を使用します。
String query = 'FIND '*' + searchText + '*' IN ALL FIELDS RETURNING Hoge__c(Id, Name)';
List<List<sObject>> searchList = search.query(query);
パタメータ
public class ContactAndLeadSearch {
public static List<List<SObject>> searchContactsAndLeads(String incoming ){
return [FIND :incoming IN ALL FIELDS RETURNING Lead(Name),Contact(FirstName,LastName,Department)];
}
}
制御
ガバナー制限
発行される SOSL クエリの合計数
20
1 つの SOSL クエリによって取得されるレコードの合計数
2000
1文字の検索は不可(エラーとなる)
search term must be longer than one character: 1
検索するカラムが指定できない
機能の要件によっては、SOSLでのデータ取得後、Apex処理内で更にマッチングの処理を追加する必要があります
SOSL ステートメントの最大長
デフォルトは 20,000 文字です。
SearchQuery 文字列の最大長
SearchQuery 文字列が 10,000 字を超えると、結果行は返されません。SearchQuery が 4,000 文字を超えると、論理演算子はすべて削除されます。
返される最大行数
クエリでカスタム制限を指定しない限り、合計 2,000 件の結果
リレーションクエリの制限
1 回のクエリに指定できる子-親リレーションは、35 個以下です。カスタムオブジェクトには最大 25 個のリレーションが許可されているため、1 回のクエリでカスタムオブジェクトのすべての子-親リレーションを参照できます。