SOQLじゃないよ!SOSLの活用法!
こんにちは!
ロングテキストエリア、リッチテキストエリアはSOQLのWHERE句に対応していないため、
ロングテキストエリア、リッチテキストエリアに対して絞り込みを行いたい場合は、SOQLではなく、
SOSLを使う必要があります。
※ちなみに、ロングテキストエリア、リッチテキストエリアをSELECT句に指定することは可能です。
SOQLじゃないよ!SOSLの活用法!
SOSLの構文は
・FIND 検索キーワード IN ALL FIELDS RETURNING 検索対象オブジェクト名(取得項目)
となります。以下の様に、複数オブジェクトにまたがって検索することも可能です。
・FIND 検索キーワード IN ALL FIELDS RETURNING 検索対象オブジェクト名1(取得項目),検索対象オブジェクト名2(取得項目)…
また、Dynamic SOQLを実行する場合は「Database.query」を使用しますが、Dynamic SOSLを実行する場合は、「Search.query」を使用します。
下記は、SOSL実行のサンプルです。
searchText変数に画面から入力した条件が設定され、Hoge__cオブジェクトに対してキーワード検索を行います。
public List<Hoge__c> hogeList {get;set;}
public String searchText {get;set;} // 画面から入力した検索条件
public void sampleSoslExec(){
String query = ‘FIND ‘*’ + searchText + ‘*’ IN ALL FIELDS RETURNING Hoge__c(Id, Name)’;
List<List<sObject>> searchList = search.query(query);
hogeList = searchList[0]:
}
}
検索結果はネストしたsObjectのリストに格納されます。
複数オブジェクトを検索対象にしている場合は、SOSLに記載したオブジェクトの順番でリストに格納されます。
※このサンプルでは、1オブジェクトのみを対象で取得しているため、リストの0番目にHoge__cが格納されています。
SOSLを使用する場合は以下の点に注意が必要です。
1)SOQLとSOSLはガバナ制限が異なります。
○SOQL実行回数→1トランザクションにつき、100回
○SOSL実行回数→1トランザクションにつき、20回
※最新の情報はSalesforceのリファレンスを参照ください
2)SOSLはグローバル検索と同じ仕組みとなります。(※グローバル検索の仕組みについてはSalesforceのヘルプを参照ください)
○1文字の検索は不可(エラーとなる)
○検索するカラムが指定できない(指定した全オブジェクトのカラムに対し、検索が実行されます)
→機能の要件によっては、SOSLでのデータ取得後、Apex処理内で更にマッチングの処理を追加する必要があります。
○文字の種類で区切って検索される
(例)
登録データが以下の場合、「TEST0001」で検索を実行すると、下記4件がすべて抽出されます。
※「TEST」というキーワードと「0001」というキーワードが別で検索されるため。
TEST0001
TEST0002
TEST0003
SAMPLE0001
グローバル検索同様に少し癖はありますが、使いこなせると便利です。
是非ご活用ください。