Skip to main content

SOSL クエリの作成

学習の目的

この単元を完了すると、次のことができるようになります。

  • SOSL が他の全文検索とどのように異なるかを理解する。
  • 基本的な SOSL 構文を特定する。
  • SOSL と SOQL の相違点を説明する。
  • 複数の sObject にわたって検索を行う SOSL クエリを作成する。

SOSL とは

前の単元では SOQL を紹介し、SOQL を使用して sObject や関連テーブル内のデータを照会する方法を学習しました。複数の sObject にわたってテキストベースのクエリを実行するには、Salesforce の全文検索オプションである SOSL (Salesforce Object Search Language) を使用できます。

.NET 開発者の皆さんは、Microsoft SQL Server で使用できる全文検索機能 (MS FTS) に慣れているかもしれません。また、元の Java バージョンから C# に移植された Lucene.Net と呼ばれる人気のある検索エンジンライブラリにも馴染みがあるかもしれません。

良くも悪くも、SOSL はそれらの全文検索手法とは異なります。最も大きな違いは、インデックスの設定と管理に必要な作業です。SOSL の基盤にはオープンソースの検索およびインデックス化エンジンである Lucene が使用されていますが、設定済みであるため、ユーザーはインストールや設定について心配する必要がありません。インデックスの管理も必要ありません。実際、ほとんどの場合、検索インデックスがどのように使用されるかについてユーザーは制御できません。これは、SOSL クエリの記述が簡単になることを意味するため、良いことです。

ただし、.NET 開発者はコードを改善したり変更したりできることを好みます。ですから、設定やインデックス化をあまり制御できないと聞いて、がっかりするかもしれませんが、制御はあまりできなくても、SOSL クエリと SOQL の両方で、クエリのパフォーマンスを向上させるためにできることがありますのでご安心ください。それらの方法については後ほど詳しく説明しますが、ここでは SOSL 構文の違いについて見てみましょう。

SOSL クエリの作成

MS FTS に精通していれば、CONTAINS ステートメントまたは FREETEXT ステートメントを使用する SELECT クエリを記述する必要があることをご存知でしょう。強力な CONTAINS 検索には多くのバリエーションがあり、完全一致やあいまい一致の検索、および別の言葉に近い言葉の検索を行うことができます。

SOSL が使用する検索構文はもっとシンプルで、SOQL の SELECT キーワードを使用しません。代わりに FIND キーワードを使用します。基本的なクエリは次のようになります。

FIND {"grand*"} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName, Email)

このクエリは 3 つの部分に分けられます。

FIND 句と検索語

FIND 句は必須であり、SOSL 検索特有の句です。FIND の後に、探している検索語を記述します。1 つの単語でも語句でも使用できます。この場合は、検索語は「grand」です。例のようにワイルドカード文字を使用することもできます。ワイルドカード文字には次のものがあります。

* matches zero or more characters at the middle or end of the search term
?matches only one character at the middle or end of the search term

ワイルドカードの詳細については、次の単元で説明します。ここでは、検索語の途中と末尾の両方にワイルドカードを使用できるからといって、それが必要なわけではないということだけを認識してください。もっとはっきり言えば、ベストプラクティスとしてそれはお勧めしません。クエリのパフォーマンスに多大な影響が及ぼされる可能性があるためです。

IN 句

IN 句を使用すると、検索グループを指定できます。Salesforce でどの項目を検索するかを指定できます。ただし、知っておくべき重要な事項がありますので、しばらくお付き合いください。

上の例では ALL FIELDS を指定しました。文字どおりすべての項目が検索されるかと思うかもしれませんが、RETURNING 句に指定するオブジェクトによっては、特定のテキストベースの項目のみが含まれます。少しわかりにくいかったですか?

繰り返しますので、もう少しお付き合いください。つまり、こういうことです。返されるオブジェクトが記事、ドキュメント、フィードコメント、フィード項目、ファイル、商品、またはソリューションであれば、すべての項目が検索されます。これらの種類のオブジェクトではすべての項目を検索する必要があるためです。

ただし、テキストベース以外のさまざまな項目が含まれているほとんどの標準オブジェクトやカスタムオブジェクトを検索する場合は、名前、メール、電話番号、およびサイドバーの項目のみを検索するのが理にかなっています。そして、これがデフォルトの動作です。

では、ALL FIELDS を指定する代わりに名前項目のみを検索するとします。その場合は、NAME FIELDS を使用します。電話番号項目のみを検索するには PHONE FIELDS を使用します。おわかりですね。

RETURNING 句

RETURNING 句を使用すると、どのデータを返し、どのオブジェクトを検索するかを指定できます。上の例では、Account の Name 項目と Contact の Lastname、FirstName、Email 項目が返されます。検索では、両方のオブジェクトのすべての検索可能な項目が対象となりますが、返される結果には括弧内に指定された項目のみが含まれます。

オブジェクト名を指定するときに括弧内に項目名を指定しなかった場合、検索で一致が見つかると、そのオブジェクトの ID のみが返されます。

SOSL 構文にはその他にも省略可能な句があります。詳細については公式ドキュメントを参照してください。

さて、あいまい一致については、SOSL は他の全文検索エンジンと比べてどうなのだろうとお思いでしょう。SOQL クエリで使用できる LIKE キーワードと SOSL で使用できるワイルドカード以外に Salesforce で使用できるのはニックネームを検索するシノニム検索のみです。

メモ

メモ

ニックネーム検索について知っておくべき重要な点は、取引先、取引先責任者、リード、およびユーザーオブジェクトに対する英語での検索のみに適用されるということです。

SOQL か SOSL か?

どちらを使用しますか? これを聞いても驚かないと思いますが、それは目的によって異なります。

単一のオブジェクトからのデータが必要で、そのオブジェクトの条件が正確にわかっているときには、通常、SOQL を使用します。実際、クエリのほとんどはおそらく SOQL を使用するでしょう。

SOSL が最も役に立つのは、データがどの項目やオブジェクトに存在しているかが正確にわかっておらず、複数のオブジェクトにわたって検索する必要がある場合です。それらのオブジェクトが関連していない場合には特にそれが当てはまります。これは、SOQL は関連オブジェクトにのみ使用できるためです。

SOSL 検索を使用する理由と方法がわかったので、作成してみましょう。

SOSL 検索を実行する方法はいくつかありますが、ここでは最も簡単な開発者コンソールでクエリエディターを使用する方法に焦点を絞ります。これは、SOQL についての前の単元でも使用したのでおそらく覚えているでしょう。

前提条件

SOSL 検索を実行する前に、開発組織にデータを追加する必要があります。まず、開発組織にアップロードできるサンプルドキュメントを作成します。

  1. メモ帳または任意のテキストベースのエディターで、ファイルを作成し、次のテキストを入力します。
    First quarter figures were better than expected for new employee Joseph Smith.
  2. ファイルを TestDocument.txt という名前でローカルマシンに保存します。
  3. Developer Edtion 組織で、[ファイル] タブの [ファイルのアップロード] をクリックします。
  4. TestDocument.txt ファイルを保存した場所に移動し、[開く] をクリックします。
  5. [完了] をクリックします。
メモ

メモ

SOSL のインデックス化は非同期で行われるため、システムに変更を行っても SOSL 検索ですぐに結果が表示されない可能性があります。

標準オブジェクトのいくつかにもデータを追加する必要があります。

  1. [設定] メニューから、[開発者コンソール] を選択して開発者コンソールを開きます。
  2. 開発者コンソールで、[Debug (デバッグ)] > [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] を選択します。
  3. 既存のコードを削除して、次のスニペットを挿入します。
    // Add Account and related Contact
    Account acct = new Account(
        Name='Test Account',
        Phone='(225)555-8989',
        NumberOfEmployees=10,
        BillingCity='Baton Rouge');
    insert acct;
    // Get the Id of the Inserted Account
    ID acctID = acct.ID;
    // Add a contact to the Account.Contact con = new Contact(
        FirstName='Joseph',
        LastName='Smith',
        Phone='(225)555-8787',
        Email='jsmith@testaccount.com',
        AccountId=acctID);
    insert con;
    
  4. [実行] をクリックします。

開発者コンソールの使用

検索対象のサンプルデータができたので、クエリエディターを使用して新しい SOSL 検索を実行します。

  1. 開発者コンソールで、下部ペインの [Query Editor (クエリエディター)] タブをクリックします。
  2. 既存のコードを削除して、次のスニペットを挿入します。
    FIND {joey} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName), ContentVersion(Title)
    

ここでまず気づくのは、前の例で検索語を囲んでいた一重引用符が中括弧に置き換えられていることです。クエリエディターで SOSL 検索を行うときには引用符ではなく中括弧を使用する必要があります。Apex コードで検索を行うときには一重引用符を使用します。さらに、検索語が「joey」という単語になっています。これは Joseph のニックネームとして知られています (検索する実際の名前は Joseph です)。

  1. [実行] をクリックします。検索結果では、1 つのタブのみが表示されます。挿入した取引先責任者が [Contact (取引先責任者)] タブに表示されます。これは、Winter '16 で使用可能になったニックネーム機能に基づいて一致が見つかったためです。一方、アップロードした TestDocument は表示されません。ニックネーム検索は取引先、取引先責任者、リード、およびユーザーオブジェクトにのみ適用されるためです。テストを変更し、すべての結果が得られるようにしましょう。
  2. クエリエディターで既存のコードを次のコードに置き換えます。
    FIND {jos*} IN ALL FIELDS RETURNING Account(Name), Contact(LastName, FirstName), ContentVersion(Title)
    
  3. [実行] をクリックします。
  4. 今回は検索結果が 2 つのタブに表示されます。[Document (ドキュメント)] タブにはアップロードしたドキュメントの名前が表示されます。目的の結果をすべて得るためにワイルドカード検索を使用したことに注目してください。

もうひとこと...

制限のために、SOSL 検索で一致する結果がすべて見つからない可能性があります。Salesforce はマルチテナント環境です。すべてのお客様がリソースを限界まで使用することが許可されると、あっという間にシステム全体がクラッシュしてしまうでしょう。20,000 文字を超える検索を行うとシステムに負荷がかかります。そのため、SOQL と同様に SOSL でも検索が制限されています。次は、検索クエリを最適化する方法を学習します。

Salesforce ヘルプで Trailhead のフィードバックを共有してください。

Trailhead についての感想をお聞かせください。[Salesforce ヘルプ] サイトから新しいフィードバックフォームにいつでもアクセスできるようになりました。

詳細はこちら フィードバックの共有に進む