2017.11.29

統合検索(Federated Search)をさわってみました

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

はじめに

皆さんこんにちは!!家族全員のリニアモーターカーの体験乗車の購入権が当たった川口です。
子供と一緒に旅行に行くネタができて本当にうれしいです!

 さて、今回は、Summer'17でリリースされた統合検索(Federated Search)という機能を使って、TerraSkyのテックブログをSalesforceのグローバル検索で検索する方法を説明します。
 興味を持ったきっかけは、分からないことを検索するのに、いつも時間がかかっていたことです。それは、複数の社内の非公開ナレッジや、公開ナレッジ、属人的なナレッジを検索するのに、それぞれに検索が必要で、例えば、私はまず、プロジェクト管理ツールやチャットツール、Salesforce、共有サーバを検索し、なければ、次にテックブログや公開のブログを検索します。最後に属人的なナレッジをChatterで聞くという流れで検索します。
 ここで、私が不便に感じる点は3つあります。
 まず一つが、情報やファイルがどこにあるか把握すること、特に新人は自社のシステムにも慣れておらず、共有ファイルシステムを探すことにも時間がかかること、
 次に、複数のナレッジやファイルが別々のアプリケーションで管理されているためと検索を複数回実行すること、
 最後に、一度検索した情報は、また同じ問題が発生した時や、確認したい時のためにメモで残すのですがメンテナンス性が低く情報量が増えると逆に検索しにくくなることです。
 このような不便な点は、統合検索を利用することで一つにまとめることができ、検索結果から簡単に目的の情報やファイルにアクセスすることができます。そうすれば、検索に対するストレスや生産性が間違いなく向上しそうですね!!

仕様

 統合検索は、分散している外部リポジトリを1回の検索で検索することができる機能です。今回は、Googleカスタム検索で自社のブログを検索してみたいと思います。
 それでは、もう少し詳細に説明します。

利用環境

 統合検索を使える環境は、Lightning ExperienceやSalesforce Classicの両方で利用することが可能です。

外部検索プロバイダ

 今回は、Googleのカスタム検索を使用しますが、その他にSalesforce は Coveo、Docurated、および Swiftype とも提携しているため、簡単に外部検索プロバイダを Salesforce に接続できます。これらのパートナーのサービスを利用することで、そのサービス先の外部リポジトリも検索できます。たとえば、Dropbox、Confluence、SharePoint など検索できます。また、「Federated Search Developer Guide」を読めば個別で実装することも可能です。

OpenSearch プロトコル

 Salesforce統合検索コネクタは 、OpenSearch 標準に基づく外部検索エンジンに Salesforce 統合検索 API で接続します。なので、少しだけOpen Search プロトコルについて知識があるほうが設定を理解しやすいです。
OpenSearchプロトコルは二つの部分で構成されています。
一つが、「OpenSearch XML Description」
外部検索エンジンを検索する方法と、それがサポートする機能について記述しています。このXMLファイルは、検索エンジン自体が公開URLで提供します。記述の主な要素は<Url>で、テンプレート属性が呼び出すURLとセマンティクスでサポートされるパラメータを提供します。また、テンプレート属性で設定された外部検索エンジンに送信するパラメータはURLエンコードされ、HTTPS GETメソッドを介して送信されます。
また、OpenSearch仕様と同じ要素にSalesforce拡張機能にレコードタイプやOAuth認証など含めることができます。

もう一つが、「外部検索エンジンから返された検索結果」
HTML検索要求の応答としてAtomまたはRSS形式で返されます。
実際に、検索結果を確認したい場合はテンプレートのURLをブラウザで実行してみると結果を簡単に確認することができます。

テンプレートパラメータ

簡単な説明ですが、テンプレートパラメータに設定できるのは、OpenSearchの標準だと検索条件、ページ毎の表示件数、スタート件数、インプットとアウトプットのエンコードが設定できます。そして、Salesforce固有で設定できるのは、ユーザID、ログインユーザ名、ユーザメールアドレス、組織ID、SOSL構文、ID検索フラグ、レコードタイプ、ソート項目、ソート順が設定可能です。

アーキテクチャ

ヘルプの資料の引用ですが、システム的な動きの説明です。

外部検索プロバイダでのデータの検索

上の図は「SALESFORCE ヘルプ」の「外部検索プロバイダでのデータの検索」から引用しました。

設定

それでは、各設定に移ります。

Googleカスタム検索設定

Googleカスタム検索を利用して、対象ドメイン内のページ検索します。 作成には、Googleアカウントが必要です。今回は、Google Custom Search APIを利用するので、Google Cloud Platformのアカウントが必要です。設定方法については、色々なブログで公開されていますのでここでは割愛したいと思います。

Googleカスタム検索へリンク

検索エンジンID

検索エンジンの名前をクリックすると詳細画面に遷移します。 [基本]タブの[詳細]セクションの[検索エンジンID]ボタンを押下すると、[検索エンジンID]が表示されます。メモしておいてください。

Custom Search JSON/Atom API設定

Custom Search APIを使用して、OpenSearchプロトコルに準拠した結果をGoogleカスタム検索から取得するために利用します。こちらも設定に関して、色々なブログで公開されていますのでここでは割愛したいと思います。

Google Developers Console

APIキー

GCPのコンソール画面を開いて、サイドメニューの[APIとサービス]> [認証情報]のリンクをクリックします。[認証情報]画面の[API キー]セクションの該当のAPIキーをメモします。

OpenSearch XML Description XMLファイルを公開

[OpenSearch プロトコル]で説明した[Open Search XML Description]のXMLファイルを、Salesforceから参照できるように公開します。
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:sfdc="http://salesforce.com/2016/federatedsearch/1.0">
    <ShortName>Eventbrite Search</ShortName>
    <Url type="application/atom+xml" sfdc:maxTotalResults="100" sfdc:maxCount="10" template="https://www.googleapis.com/customsearch/v1?key=xxx&amp;alt=atom&amp;cx=yyy&amp;q={searchTerms}&amp;start={startIndex?}&amp;num={count?}"/>
</OpenSearchDescription>
OpenSearch XML Description
 上記のXMLをファイルにコピーして。Urlエレメントのテンプレート属性にある xxxとyyyに先ほどメモした値を設定します。xxxにはGoogle Custom Search APIのAPIキー、yyyにはGoogleカスタム検索の検索エンジンID を設定します。
 このファイルをSalesforceから参照できるように公開します。私は、Herokuに設置して公開しました。静的リソースやGoogleドライブで公開できるので試しましたが、Salesforceで正しく読み込めませんでした。やり方については、「Getting Started on Heroku with Node.js」を参照してください。

Getting Started on Heroku with Node.js

配置場所は、{ローカルにcloneした場所}\node-js-getting-started\publicの配下にファイルを配置すると公開できます。

外部データソース設定

外部データソース登録

設定は、[設定]ボタン > [開発]> [外部データソース]リンクを押下します。次に[外部データソース]画面の[外部データソース]ボタンを押下します。

外部データソース登録

OpenSearchDescription URLに先ほどHerokuに公開したXMLファイルのURLを設定します。そして、タイムアウト時間は1秒未満で最大120秒まで値を設定します。ここは、デフォルトで設定します。

検証して同期

登録が完了したら[検証して同期]ボタンを押下します。

同期実行

 [検証して同期]が正常に完了すると[状況]が成功になって、外部オブジェクトセクションにオブジェクトが表示されます。また、エラーが発生している場合はXMLのパースエラーなどはここに表示されます。  成功したら、外部オブジェクトの名前の隣の[選択]チェックボックスをチェックして、[同期]ボタンを押下します。

外部オブジェクト作成完了

検索レイアウト変更

外部オブジェクトの設定

グローバル検索結果のレイアウトを見やすくするため変更します。 表示方法は、2つあります。 一つが、先ほどの画面から、[外部オブジェクト]関連リストの表示ラベルから遷移する方法と、 もう一つが、[設定]> [開発] > [外部オブジェクト] から遷移する方法があります。

検索を許可のチェックを確認

グローバル検索で検索されるために、[外部オブジェクトの詳細]セクションの[検索を許可]にチェックがついているか確認します

検索結果レイアウト変更

グローバル検索結果で表示されるレイアウトを変更します。

検索結果

Title、表示URL、Summary、Dateを登録すると、結果が見やすくなります。

確認してみよう

グローバル検索

ヘッダー部分のグローバル検索項目に、検索したいキーワードを入力します。検索条件は部分一致です。

グローバル検索結果

読みたい検索結果の表示URL列のリンクをクリックすると、ブログに遷移します。

テラスカイ テックブログ

選択したブログが表示しました。

気になるところ

検索実行の制御

 APIのコール回数で課金されるサービスもありますので、実行を制御する方法を調べました。
 制御する方法として、動的に制御する方法はなさそうですが、静的に制御する方法は、オブジェクトの設定ページの [検索を許可] 設定を有効/無効にする事で制御できます。ヘルプではグローバル検索で検索速度を高速化するために使用されないカスタムオブジェクトや外部オブジェクトを検索対象から外すような説明で紹介されていました。また、プロファイルの外部オブジェクト権限でプロファイル単位の制御はできました。

検索の高速化:静的に制御する方法が説明されています

APIのコール数

1回のグローバル検索で、Google Custom Search APIが何回リクエストされるのか確認しました。

統合検索実行前のGCPリクエスト回数

検索する前は、リクエスト回数が11です。

グローバル検索

[検索]ボタンを押下して、検索を実行します。

リクエスト回数確認

検索実行後リクエスト数が14になっています。ほぼすべては1回の検索で1回増える動きになっていますが、検索中の画面が長い場合、もしかしたらリクエストが複数発行される事があるかもしれませんね。ただ、ダッシュボードに反映されるのが遅い場合もあるので注意が必要ですね!
 追加で、検索するサイトが増えた場合どうなるのか試してみました。
 一回のグローバル検索で、同じGoogle Custom Search APIのAPIキーで、2つのGoogleカスタム検索を実行すると、リクエスト数はカスタム検索の個数分の2回リクエストが実行されている事を確認できました。リクエストは有料なので注意が必要ですね。

その他の実行

 グローバル検索では、実行が動的に制御できないため検索を有効にしていると常に実行されます。おそらく、状況に応じて検索できるように個別開発で検索画面を開発したい要望が出てくると思いますが、今のところその方法を説明されたドキュメントはありませんでした。
 少し調査した結果を載せたいと思います。開発者コンソールからSOSLで検索すると標準項目の外部 ID、表示 URLは検索できますが、カスタム項目のDate、Title、Summaryが検索できませんでした。あと、標準ではオブジェクトのホーム画面にはレコードが表示されませんでした。
 そのほかに標準で表示できる方法のリンクを載せます。一部試してみましたがうまく実行できなかったものもあるのでぜひ試してみてください。

統合検索に関する考慮事項

アクセスコントロール

外部オブジェクトのアクセスコントロールについて説明している資料を見つけることができなかったので、私の調査結果で説明します。
① 共有設定や共有ルールでは外部オブジェクトが非表示なので制御はできませんでした。
② プロファイルのオブジェクト権限(参照のみ)、項目レベルセキュリティーは制御できました。レコードタイプは非表示なので制御はできませんでした。
③ 所有者のアクセス権は、所有者項目がないためできませんでした。
④ 主従によるアクセス権は、参照関係しか設定できずできませんでした。
⑤ コミュニティーユーザにプロファイルで外部オブジェクト権限を付与できますが、コミュニティーの検索で利用できないようです。
⑥ ユーザ単位やレコード単位でアクセス制御は、検索先で実装するのが最善だと感じました。

料金

① Googleカスタム検索は無料です。
② Google Custom Search APIは、1日100クエリまでは無料ですが、更に必要な場合は1000回につき5ドル、最大1日1万リクエストが上限です。
③ Salesforce 統合検索機能の料金は無料です。

Custom Search JSON/Atom API ドキュメント

まとめ

 いかがだったでしょうか?便利に感じていただけたでしょうか?このブログを見て「おおーー!!」と思った方は多いと思います。設定も簡単なので簡単に試していただけると思います。
 この機能で検索の利便性が向上するとともに、ナレッジが更に活用されることで、もっと「ナレッジを蓄積しよう!」という動きが出てきたら更にうれしいですね!
それでは!

資料

70 件

関連する記事