見出し画像

【Salesforce】SOSLの基本


はじめに

こんにちは、株式会社SHIFT サービス&テクノロジー本部 カスタマーサクセス部 Salesforceグループ所属のホンマです。

Salesforceにエンジニアとして関わってから約4年が経ち、Apexを中心とした言語を扱ってきました。

ただ、全くと言っていいほど触ってこなかったSalesforce特有の言語がありました。

SOSL(≠SOQL) です。

SOSLは検索言語のひとつで、キーワードに対して複数オブジェクトからレコード検索をすることができます。

使う頻度が低い言語ですが、備忘録も込みでどのような検索ができるのか、使いかたをまとめていこうと思います。

SOSLの基本

SOSLのSalesforceリファレンス・Trailheadは以下リンクから見ることができます。

SOSL の構文(リファレンス)
https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_sosl_syntax.htm

SOSL クエリの作成(Trailhead)
https://trailhead.salesforce.com/ja/content/learn/modules/apex_database/apex_database_sosl

リファレンスによると必須となる項目はFIND句(FIND {SearchQuery})です。

まずはFIND句に「Andy」と入れて、開発者コンソールでレコード検索をしてみましょう。

※今回は開発環境(Developer Edition)を使用しています。

FIND {Andy}

検索結果

この環境には「Andy」というワードが入ったレコードは2件ありました。

ただ、どの項目情報を取得するか指定していないため、レコードIDのみが返ってきました。

次は以下のようにオブジェクト・項目を指定して再検索してみます。

FIND {Andy} RETURNING Lead(FirstName, LastName, Company),Account(Name, Phone), Contact(FirstName, LastName, Phone, Email, Title)

検索結果

「Andy」というキーワードが登録されているレコードの項目の情報が取得できました。 1回目の検索でリードと商談にのみレコードがあることは分かっていたので、試しに取引先も検索結果を返すように指定してみましたが、レコードが取得できたオブジェクトのみタブ表示されるようです。

SOSLを使うときの注意点

SOSLの使用にはいくつかの制限があります。

検索結果に対する SOSL の制限(リファレンス)https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_sosl_limits.htm

個人的に検索するときやApex上で実装するときに注意しなければならないと思ったところを3点あげます。

取得可能レコード数に制限がある

複数オブジェクトまたいで検索する場合、1オブジェクトにつき2000件まで取得可能です。

2000件すべてを見ることはないと思いますが、この制限によって本当に見たいデータが見れなくなる可能性があります。

検索時は条件を指定したほうが精度は上がりそうです。

実行者の権限によって表示可能なレコードデータが異なる

システム管理者や一般ユーザの権限によって、検索結果として参照可能なレコードは可変します。

場合によってはSalesforceの権限設定にも注意が必要です。

選択リスト項目の値をキーワード検索できない

これはリファレンス等に掲載されておりませんが、個人的につまずいて注意が必要だと思った部分です。

FIND句に選択リストの値を入れても検索ができません。

たとえば、選択リスト「評価(Rating)」の値が「Hot」になっているリードレコードを検索しようとした場合、以下のようなクエリを実行しても想定しているレコードは検索できません。

FIND {Hot} RETURNING Lead(FirstName, LastName, Company),Account(Name, Phone), Contact(FirstName, LastName, Phone, Email, Title)

検索結果

(代わりに取引先レコードの「Grand Hotels & Resorts Ltd」は取得できました…。)

開発環境上には1件だけ、評価がHotになっているレコードがあるので検索できると思っていたのですが、選択リスト値はFIND句の検索対象にはならないようです。(画像の2番目のレコード)

回避策として、RETURNING句にWHEREを組み入れることで検索することができます。(SOQLと同じ)

何でもかんでもFIND句に入れればOKではないんですね。

FIND {Boxer} RETURNING Lead(FirstName, LastName, Company WHERE Rating like 'Hot'),Account(Name, Phone), Contact(FirstName, LastName, Phone, Email, Title)

検索結果

最後に

利用頻度が低いSOSL。

今回noteを書くにあたって勉強してみましたがグローバル検索機能をカスタムで実装したいときに使用出来そうだと思いました。

また、キーワードに対して各オブジェクトから検索ができるのでリレーションのないレコードであっても共通のキーワードを持っていれば一括で検索出来ます。

これらの特性を活かせればSOSLも上手に使いこなせそうです!

読者の方で「こういう使い方もできる!」という経験やアイデアがある方はぜひ教えてください。

今回はどのように使えるかを公式リファレンス紹介も交えてまとめてみたので、いつか、実例を紹介できればと思っています。


執筆者プロフィール :  ホンマ
SHIFT入社月:2023年1月
Salesforce歴:2019年夏~
Trailblazerランク:Ranger
認定資格:アドミニストレーター、Platformアプリケーションビルダー

お問合せはお気軽に

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら

PHOTO:Unsplashpath digital