ApexでSOSLを使いこなす:取得・加工・操作の実践ガイド

Salesforce開発において、SOSLは「キーワード検索」を実現するための非常に強力なツールです。特にApexと組み合わせることで、ナレッジ検索やグローバル検索、類似データ抽出などを柔軟に実装できます。

本記事では、ApexでのSOSLの基本から、取得・加工・実務での使い方までを体系的に解説します。


1. SOSLの基本構造(おさらい)

ApexでのSOSLは以下のように記述します。

List<List<SObject>> results = [
    FIND 'エラー'
    IN ALL FIELDS
    RETURNING Case(Id, Subject), Knowledge__kav(Id, Title)
];

ポイント:

・戻り値は「List<List>」
・RETURNINGの順番で結果が入る
・複数オブジェクト同時検索が可能


2. 基本的な取得方法

■ 単純な検索

String keyword = 'ログイン';

List<List<SObject>> searchResults = [
    FIND :keyword
    IN ALL FIELDS
    RETURNING Case(Id, Subject)
];

List<Case> cases = (List<Case>) searchResults[0];

ここで重要なのはキャスト処理です。


3. 複数オブジェクトの取得

List<List<SObject>> results = [
    FIND 'エラー'
    IN ALL FIELDS
    RETURNING
        Case(Id, Subject),
        Knowledge__kav(Id, Title)
];

List<Case> caseList = (List<Case>) results[0];
List<Knowledge__kav> knowledgeList = (List<Knowledge__kav>) results[1];

ポイント:

・RETURNINGの順番がそのままインデックスになる
・型キャストを忘れるとエラーになる


4. 動的SOSL(ユーザー入力検索)

実務ではユーザー入力を使うケースが多いです。

public static List<Case> searchCases(String keyword) {

    if(String.isBlank(keyword)) {
        return new List<Case>();
    }

    List<List<SObject>> results = [
        FIND :keyword
        IN ALL FIELDS
        RETURNING Case(Id, Subject, Status)
    ];

    return (List<Case>) results[0];
}

ポイント:

・必ずNULLチェック
・ユーザー入力をそのまま使う


5. 検索結果の加工

SOSL結果はそのまま使うだけでなく加工も重要です。

■ 件数制御

List<Case> cases = (List<Case>)results[0];

if(cases.size() > 10) {
    cases = cases.subList(0, 10);
}

■ マップ化

Map<Id, Case> caseMap = new Map<Id, Case>(cases);

高速アクセスが可能になります。


6. SOSL + ナレッジ検索実装例

実務でよくあるパターンです。

public static List<Knowledge__kav> searchKnowledge(String keyword) {

    List<List<SObject>> results = [
        FIND :keyword
        IN ALL FIELDS
        RETURNING Knowledge__kav(Id, Title, Summary)
    ];

    return (List<Knowledge__kav>) results[0];
}

用途:

・サポート画面のサジェスト
・FAQ検索


7. SOSLの制限と注意点

■ 戻り値はList<List>固定

→ 1次元配列ではない

■ LIKE検索との違い

→ LIKEより圧倒的に高速

■ インデックス依存

→ 検索対象フィールドに制限あり


8. よくあるミス

■ キャストミス

List<Case> cases = results[0]; // NG

→ 必ずキャストが必要


■ インデックス順番ミス

RETURNING順と取得順がズレるとバグになる


■ キーワード未加工

ユーザー入力をそのまま使うと検索精度が低下


9. 実務での使いどころ

・ナレッジ検索
・ケース類似検索
・グローバル検索機能
・サジェスト機能

特にUI検索系はほぼSOSLが適しています。


10. SOQLとの組み合わせ設計

実務では以下の構成が多いです:

  1. SOSLで候補取得
  2. SOQLで詳細取得

例:

・SOSL → 検索結果ID取得
・SOQL → 詳細データ取得

これによりパフォーマンスと精度を両立できます。


まとめ

ApexにおけるSOSLは「検索体験を作るための武器」です。

単純なデータ取得ではなく、ユーザーが自然に検索できる仕組みを作ることが重要です。

正しく使えば、ナレッジ検索・ケースサポート・UI検索を大幅に改善できます。