blog
ブログ

SOQLじゃないよ!SOSLの活用法!

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 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

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

翻訳

SFA/CRMに蓄積されている情報を活用する方法ガイド