2019.06.10

今から始めるSOSL入門!

はじめに

こんにちは、テラスカイの上川です。

Salesforceにはデータを操作するのに、SOQLとSOSLがあります。
「SOQLは触るけど、SOSLはあまり触ったことがない...」そんな方も多いのではないでしょうか?
今回は最近触ったSOSLについて、今さらながら書いていきたいと思います。

SOQL と SOSL の違い

SOQLとSOSLの違いについてサクッとおさらいしていきましょう。

・SOQLでは一度に1つの標準・カスタムオブジェクトからしか特定の情報を検索出来ませんが、SOSLでは一度に複数のオブジェクトから検索可能です。
・SOQLではデフォルトでは完全一致で項目の値を検索しますが、SOSLで「Digital」を検索すると、項目値が「Digital」や「The Digital Company」のレコードが返されます。

SOSLの構文などはこちらをご参照ください。

SOQLとSOSLの制限

SOQLとSOSLによって取得されるレコードの合計数は以下になります。
例えば、SOSLでレコードを検索した際には2000件までしか取得できないため、該当のレコードが3000件以上あった場合に1000件漏れてしまいます。
なので、order byでソートするなどの工夫が必要です。
SOQL クエリによって取得されるレコードの合計数 50,000
1 つの SOSL クエリによって取得されるレコードの合計数 2,000
その他制限についてはこちらをご参照ください。

SOSLの使用例

SOSLの使用例は以下のような形になります。
・複数のオブジェクトや項目から効率的に値を取得する。
・項目に存在することが分かっている特定の用語を検索する。
 SOSLでは項目内の用語を自動的に分割し、それを検索対象とすることが出来ます。
 そのため、SOSL 検索でより速く、より多くの関連結果を返すことができます。
 またSOSL検索では、設定したシノニムも活用し検索精度を向上することが出来ます。

シノニムについて

シノニムグループを設定することによって、以下のように1つの語を検索するとグループ内のすべての語に対する結果を返すことが出来ます。シノニムグループは、英語の場合は標準で設定されているものもありますが、日本語の場合は自分で設定する必要があるそうです。
オブジェクトとしては、ケース・Chatter フィード・ファイル・ナレッジ記事などがサポートされます。
1 つの語を検索すると、グループ内のすべての語に対する結果が返されます。たとえば、「サムドライブ」、「フラッシュドライブ」、「メモリスティック」という 3 つの語がシノニムグループにある場合、「サムドライブ」を検索すると、「フラッシュドライブ」と「メモリスティック」に対する結果も返されます。

SOSLでナレッジ記事を検索する例

個別開発時におけるナレッジについては、こちらの記事が分かりやすいと思いますので是非ご参照ください。
今回は、SOSLはどんな時に使用するのか?その一例を示したいと思います。
例えばSalesforceのサイトで構築したお客様サポートサイトがあり、そこでナレッジ記事を検索し、その検索結果を返すページを考えてみます。

大まかな流れは以下の様になります。
※流れの詳細はコメントを参照ください。
・検索画面で入力した値がKeywordに格納され、それを基にSOSLでナレッジに検索をかけます。
・最後に取得したスニペットを検索結果として表示するということが考えられます。
(組織で Salesforce ナレッジ記事を使用する場合、SOSLのクエリにWITH SNIPPETを付けると検索結果で各記事の検索語を強調表示(黄色でハイライト)して返してくれます。)
//動的SOSLを用いた記事検索一部抜粋
//Keyword=検索キーワ―ド
SOSL = 'FIND \''+ String.escapeSingleQuotes(String.escapeSingleQuotes(this.Keyword)) + '\' IN ALL FIELDS ';
SOSL += 'RETURNING KnowledgeArticleVersion(';
// 項目
SOSL += 'Id ';                                      // ナレッジの記事バージョン ID
SOSL += ',KnowledgeArticleId ';                     // ナレッジの記事 ID
SOSL += ',PublishStatus ';                          // 公開状況
SOSL += ',VersionNumber ';                          // バージョン番号
SOSL += ',Title ';                                  // タイトル
SOSL += ',Summary ';                                // 概要
SOSL += ',ArticleNumber ';                          // 記事番号
SOSL += ',ArticleType ';                            // 記事タイプ

// 条件
SOSL += 'WHERE PublishStatus = \''+ this.PublishStatus + '\' ';                         // 公開状況
SOSL += '  AND Language = \'ja\' ';                 // 言語
SOSL += '  AND ArticleType in (\''+ String.join(this.ArticleTypes,'\',\'') + '\') ';    // 記事タイプ
SOSL += 'limit 2000 ';//取得数
SOSL += ') ';

//スニペット
SOSL += 'WITH SNIPPET ';

//実行時に動的 SOSL クエリで SOSL WITH SNIPPET 句を使用するには、Search.find メソッドを使用
Search.SearchResults searchResults = Search.find(SOSL);

List<Search.SearchResult> sRList = searchResults.get('KnowledgeArticleVersion');
List<String> snippetTexts = new List<String>();

for(Search.SearchResult SR : sRList){
        //スニペットを取得
        snippetTexts.add(SR.getSnippet());
}
KnowledgeSearch

注意点:スニペットの制限

注意点としてはスニペットは返す数に制限があるため、何も返さない時はSOSLで取得した概要を表示するなどの考慮が必要です。
スニペットが表示されるのは、ページに返される結果が 20 件以下の場合のみです。

まとめ

今回は、SOSLとSOQLの違いからSOSLの使用例について示しました。
ナレッジ周りなどでSOSLを使用する機会がありましたら是非参考にしていただければ幸いです。
27 件
     
  • banner
  • banner

関連する記事