blog
ブログ

Salesforce技術ブログ(SOQLじゃないよ!SOSLの活用法!)

こんにちは!前Dです!

ロングテキストエリア、リッチテキストエリアは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 class SOSLSample {
    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

 

グローバル検索同様に少し癖はありますが、使いこなせると便利です。

是非ご活用ください。

contact

ご相談・ご質問等ございましたら、お気軽にお問い合わせください。

翻訳