SharePoint 2013 のカスタム検索売上報告書でのクエリ ルール、結果の種類、および表示テンプレートの使用
原文記事の投稿日: 2012 年 7 月 24 日 (火曜日)
(一般免責事項: ブログの書式設定は良好ではありません。好みに応じて、この投稿の Word ドキュメント版の添付ファイルをダウンロードしてください。)
こんにちは。今日のトピックのタイトルは長いですが、内容も役立つ情報で盛りだくさんです。SharePoint 2013 には、かつてない方法で検索結果を使用してカスタマイズするのを可能にする、本当の意味での特筆すべき機能がいくつもあります。他の記事で大々的に取り上げられているので、それらすべての機能について包括的な概要を述べたり、この投稿で使用するコンポーネントについて詳述したりするつもりはありません。代わりに、検索結果の開始セットを示し、それらの各機能について概要を述べ、それらの機能を使用して洗練されカスタマイズされた検索結果を作成するプロセスを順を追って説明して、実際にそれらの要素すべてが連携して動作する仕組みを示します。
まず、ファームで "sales reports" のクエリを実行したときに表示される検索結果のビューの外観から始めましょう (注意: これはベータ 2 ビルドであり、最終リリースは外観が異なることもあります)。
これは、検索結果の既定の表示エクスペリエンスで、よく整えられているという印象を受けます。しかし私たちは、SharePoint 2013 でのエンド ユーザーの検索エクスペリエンスを本当に満足できるものにするためにこれらの機能を追加しましたので、ここでシナリオにもう少し何かを追加してみましょう。社内全体はいくつかの部門に分かれており、そのいくつかには自部門の売り上げを管理する責任があります。各部門は、標準の Excel テンプレートを使用して時系列に対する営業成績を報告します。加えて各部門には、カスタマー リレーションシップを管理し、売り上げ情報を報告する責任を持つ担当者が 1 人います。では、SharePoint でこれらの機能を使用して、部門とその顧客に関する重要な情報をどのように標準化して提供できるでしょうか。ここでは、多面的アプローチでこれを解決します。
カスタム コンテンツ タイプ
はじめに、売上報告書を SharePoint にアップロードするすべての人向けのカスタム コンテンツ タイプを作成します。ここでは、使用するサイト内の列の作成から開始します。それらは、自分の検索売上報告書に含められるようにするフィールドです。ここでのシナリオでは、次のサイト内の列を使用するように定義しました。
サイト内の列名 |
型 |
アカウント マネージャー |
1 行テキスト |
直属の部下 |
数字 |
営業地域 |
選択肢: Northamerica、EMEA、Asia |
上位アカウント |
1 行テキスト |
アカウント合計 |
数字 |
次に、これらのサイト内の列すべてを含んだコンテンツ タイプを作成しました。Managed Metadata Service に関連付けられた公開ハブ サイトでコンテンツ タイプを作成したため、そのコンテンツ タイプはファーム内の自分の購読側サイトすべて (私の場合は、すべての Web アプリケーションのすべてのサイト) にプッシュされます。
次の手順は (私の場合手動で行いましたが)、売上報告書を (他のデータと一緒に) 格納するドキュメント ライブラリで、このコンテンツ タイプを部門のサイト コレクションごとに使用可能なコンテンツ タイプのリストに追加することでした。確かにこの処理は自動化できますが、簡潔にするために手動で行うことにしました。これで最初の手順は終了です。カスタム コンテンツ タイプを作成して展開し、売上報告書をこれらのドキュメント ライブラリに追加しました。アカウント マネージャーは、売上報告書をアップロードするときにそれを識別し、メタデータを入力することができます。
管理プロパティ
これで、これらの売上報告書が私たちのサイトに取り込まれるように設定したので、売上報告書のカスタム サイト内の列から管理プロパティを作成する必要があります。このシナリオの目的からすると、SharePoint 2010 と比較した場合、SharePoint 2013 には本当の意味で新しい機能はありません。フル クロールを実行してクロールされたプロパティを作成し、次にそれらのクロールされたプロパティにマップされる管理プロパティを作成し、さらに別のフル クロールを実行する必要があります。私たちはファーム規模のソリューションを実装しようとしているので、このシナリオにおいて異なる作業はありません。ただし SharePoint 2013 には、サイト コレクション管理者が自分たちのサイト コレクション、サイト、またはフル クロールのリストにさえマークを付けることができるようにするという、驚くべき機能があります。これによりもっと対象範囲が狭いレベルでクロールするときにエンタープライズ規模のフル クロールを実行する必要がなくなるため、それは本当にすばらしいことです。その機能については別の投稿で述べることにし、ここでは、そのような機能があることだけ指摘しておきます。ただし、私たちのソリューションの対象範囲はファーム全体であるため、この場合には適用されません。
クエリ ルール
ここまでで、カスタム コンテンツ タイプを使用する売上報告書、およびそれらの売上報告書のメタデータ値が取り込まれる管理プロパティを作成することができました。次に行う必要があるのは、誰かがこれらの売上報告書の 1 つを含むと考えられる何かを検索しようとするときに、必ずこれらの項目に "通知" されるようにすることです。SharePoint 2013 には、クエリ ルールというそれに最適の機能があります。クエリ ルールには、以下に示すように、主なコンポーネントが 3 つあります。
- 条件: クエリ ルールの条件により、ルールが起動するときが決まります。ルールを使用することにより、さまざまな種類の処理を行うことができます。ここでは簡単に説明しますが、条件を使用する場合の可能性は無限大であり、実際、いくつかの条件がすぐに使用できる状態で出荷されます。もう 1 つの面白い工夫は、クエリ ルールが毎回の検索結果について起動されるようにする場合、条件は付加されないことです。もちろん反対のことを行い、複数の条件を有効にすることも可能です。ここでの可能性の範囲において、迷いそうな自分にすぐに気付いたかもしれません。クエリ ルールでは、以下のような条件を使用できます。
- 特定の単語または語句で始まるか終わるクエリ
- アクションを示す単語 ("download" など、一般には動詞の定義された単語) を含んだクエリ
- 管理メタデータ用語セットにある単語を含むクエリ (これによりいくつかの高度な処理を実行できます)
- ビデオ結果やドキュメント結果などの別の結果ソースで共通のクエリ (自分で結果ソースを定義および作成するため、何にでもすることができます)
- ディスカッションや Excel スプレッドシートなどの一般的にクリックされる結果の種類を含む結果
- 正規表現を活用したり、クエリをアクション用語と件名用語 (アクション用語を取り除いた後の残り) に分離したりすることができる高度なルール
- アクション: アクションは、クエリ ルールの条件が満たされたときに実行する処理です。ここでは、以下の 3 つの選択肢があります。
- 昇格された結果を追加する: これは、SharePoint 2010 でのおすすめコンテンツの仕組みと、SharePoint 2010 の FAST 検索でのビジュアルおすすめコンテンツの仕組みに似ています。検索結果すべての先頭に、新しいリンクを表示することができます。リンクは、ハイパーリンクまたは画像としてレンダリング (したがって、ビジュアルおすすめコンテンツに類似) されるように選択できます。
- 結果ブロックを追加する: 結果ブロックは、追加のクエリを実行する場所で、結果が元の検索結果と一緒に返されてレンダリングされます。結果がすべてまとめられて 1 つのブロックとしてレンダリングされるため、ブロックと呼びます。ブロックは、検索結果すべての先頭に表示されるようにするか、ランクに基づき他の検索結果と区別しないで表示されるようにすることができます。この場合、2 つのクエリの間の適切性ランキングを意味するものではないことを覚えておくことは重要です。これは、全体としてのそのブロックに、他のローカル検索結果すべてと同様のランクが付与されているというだけのことです。結果ブロックの項目をクリックすると、そのクリック アクションはローカルに記録され、そのブロックは全体として関連性が強くなります。したがって、ブロック内の項目が何度もクリックされると、同じ頻度で選択されていない個々の結果よりも関連性が高まるため、時間とともにそのブロックは検索結果内を上に移動し始めます。結果ブロックは本当に多くの方法で構成することができますが、先に述べたように、それについての詳しい説明はここでは控えます。
- クエリを変更することによって変更されたランク付けされた結果: このやや冗長な表現のオプションでは、その名のとおりのことが行われます。実際に要求されたクエリを開始し、自分の望む方法で変更することができます。たとえば、条件を追加したり、用語を取り除いたり、XRANK を使用してランク付けを変更したりできます。この場合のオプションには、かなり大きな幅があります。
- 発行: 発行は、クエリ ルールを使用するかどうかと、いつ使用するかを制御するためのコンポーネントです。たとえば、感謝祭セールの翌日に適用するルールのセットを作成するとします。ただし、実際にその日になるまではそれらのルールを無効にする必要があります。その場合は、ルールが作成されたとしてもそのルールが非アクティブになるように発行を構成できます。あるいは、ルールがアクティブにされたとしても、特定の日付になるまでは開始せず、その後の日付で終了するように構成することができます。
ここまでがクエリ ルールについての "簡単な" 説明ですが、では一体どのように使用できるでしょうか。実際には、すぐに使用できる状態で出荷されるクエリ ルールが用意されています。上のスクリーンショットを取得したときには、その影響を理解しやすいようにルールを非アクティブにしていました。この場合、誰かが売上報告書を調べようとするときのクエリで、私たちの売上報告書がポップアップ表示されて通知されるようにする必要があります。それで、検索サイト コレクションの [サイトの設定] に移動し、[クエリ ルール] リンクをクリックします。[ソースを選択してください] ドロップダウンで、[ローカル レポートとデータの結果] を選択します。[Reports and Data] (レポートとデータ) というクエリ ルールが表示されます。そのルールをクリックしてドロップダウン メニューから [表示] を選択すると、ルールの構造を表示することができます。次のような仕組みです。
- 条件: ルールの条件は、クエリの先頭または末尾に、"analysis;cube;dashboard;dashboards;data;database;report;reports;sales" のいずれかの単語が含まれていることです。用語の中に、reports と sales の両方が含まれていることに注目してください。こうすれば、誰かが "sales report" のクエリを実行したときにこのクエリ ルールが適用されます。これで申し分ありません。誰かが "sales report" についてクエリを実行した場合には、是非とも私たちの部門の売上報告書を見てほしいわけです。このルールの一部として、一致がアクション用語に割り当てられており、それ以外はすべて件名用語に割り当てられます。この場合は、"reports" をアクション用語に、"sales" を件名用語に割り当てます。
- アクション: このルールのアクションは、件名用語にのみ基づいて別のクエリを実行します。そのため、上の条件に基づき、"sales" の場合にのみ別個のクエリを実行します。これにより、ブロックが返されて、必ず他のすべての結果の先頭に追加されます。ただし、ローカル レポートとデータ結果ソースでのみ sales が検索されます。これは、やはりすぐに使える状態で出荷される結果ソースで、実質的に Excel ドキュメント (ファイル拡張子が .xlsx や .xls のドキュメント) のみを返します。これは、Excel ドキュメントに対してのみ、"sales" についてクエリを実行するクエリです。
- 発行: ルールは、開始日と終了日の制限なしでアクティブであるため、いつでも開始されます。
そのクエリ ルールを再び有効にしました。以下に、売上報告書についてクエリを実行した場合に表示される結果を示します。
これはさらに良くすることができます。クエリ ルールは組み込んだので、今度は結果の先頭に表示されるカスタム売上報告書コンテンツ タイプに基づいてドキュメントを取得します。これはすばらしいことです。ただし、ドキュメントに関するメタデータは引き続き何も表示せず、それにより本当にこのすべてがまとめられます。
表示テンプレート
SharePoint 2010 において、特定の項目を異なる方法でレンダリングするということは、コアの結果 Web パーツで 1 つの巨大な XSLT チャンクに入って変更するという非常に困難なプロセスでした。自分の XSLT スキルを活用し、巨大なドキュメントの中でカスタム コードを挿入するのに適した場所を見つける必要がありました。概してそれは、あまり楽しい作業ではありませんでした。
SharePoint 2013 では、なんと、表示テンプレートが用意されており、それらのテンプレートは大幅に改善されています。自分についての XSLT Zen を持ち運ぶ必要がなく、HTML だけでカスタム表示コードを作成できるようになっています。実際、この投稿では Adobe の Dreamweaver CS6 を使用してカスタム表示テンプレートの "コード" を作成しました。では、表示テンプレートはどのように機能するのでしょうか。
表示テンプレートに関しては、次のいくつかの項目を追跡します。
- 管理プロパティ: クエリ時に取得する必要がある管理プロパティを指定する必要があります。それらのプロパティは、以下で説明する方法に従い、HTML で使用できます。
- 外部 JS と CSS: 表示テンプレートで使用する JavaScript または CSS ファイルがある場合は、それらのファイルを外面化し、表示テンプレートに追加することができます。
- インライン JS: 表示テンプレートでインライン JS を使用することもできます。必要なのは、表示テンプレートの最初の <div> の下にインライン JS があるようにし、それよりも下にさらにインライン JS があるようにすることです。
- HTML: ここで、結果をレンダリングする表示テンプレートの実際の HTML を作成します。
例の表示テンプレートでは、次のように検索結果に表示することができるよう、作成したカスタム売上報告書コンテンツ タイプから属性を収集します。
では始めましょう。新しいテンプレートを構築するときには、大抵の場合、既存の表示テンプレートから始めたいと思われることでしょう。検索センターのサイト コレクションに入る場合は、[サイトの設定] で [マスター ページとページ レイアウト] リンクをクリックします。ライブラリに入ったら、Display Templates フォルダーをクリックして、Search フォルダーをクリックします。私たちが出荷する表示テンプレートは、すべてそのフォルダーで見つけることができます。高い可能性で同じ名前のファイルがいくつか表示されますが、サフィックスは .html か .js のどちらかです。ここで関係するのは .html ファイルだけです。.js ファイルは、.html ファイルをアップロードするときに自動的に生成されます。この場合、表示テンプレートは Excel ファイル用なので、Item_Excel.htm ファイルから開始しました。コピーをローカルにダウンロードし、名前を SalesReport.html に変更して、Dreamweaver で開きました。
次に、管理プロパティを追加します。mso:ManagedPropertyMapping というタグがあるので、そこに表示テンプレートで必要とされる管理プロパティを入力できます。ここでは、残りの管理プロパティと同じ形式を使用して、リストの最後に自分の管理プロパティを追加しました。次のようになります。
<mso:ManagedPropertyMapping msdt:dt="string">'Title':'Title','Author':'Author','Size':'Size','Path':'Path', 'Description':'Description','LastModifiedTime':'LastModifiedTime','CollapsingStatus':'CollapsingStatus', 'DocId':'DocId','HitHighlightedSummary':'HitHighlightedSummary', 'HitHighlightedProperties':'HitHighlightedProperties','FileExtension':'FileExtension', 'ViewsLifeTime':'ViewsLifeTime','ParentLink':'ParentLink','ViewsRecent':'ViewsRecent','FileType':'FileType', 'IsContainer':'IsContainer','ServerRedirectedURL':'ServerRedirectedURL', 'ServerRedirectedEmbedURL':'ServerRedirectedEmbedURL', 'ServerRedirectedPreviewURL':'ServerRedirectedPreviewURL', 'AccountManager':'AccountManager', 'SalesRegion':'SalesRegion', 'TotalAccounts':'TotalAccounts', 'TopAccounts':'TopAccounts', 'DirectReports':'DirectReports', 'ContentType':'ContentType'</mso:ManagedPropertyMapping>
ご覧のとおり、AccountManager や SalesRegion など、カスタム コンテンツ タイプで作成したプロパティすべてを追加しています。その後、次の行まで下にスクロールしました。
<div id="_#= $htmlEncode(itemId) =#_" name="Item" data-displaytemplate="ExcelItem" class="ms-srch-item" onmouseover="_#= ctx.CurrentItem.csr_ShowHoverPanelCallback =#_" onmouseout="_#= ctx.CurrentItem.csr_HideHoverPanelCallback =#_">
_#=ctx.RenderBody(ctx)=#_
<div id="_#= $htmlEncode(hoverId) =#_" class="ms-srch-hover-outerContainer"></div>
</div>
その後、外側の DIV タグの間をすべて (上の赤でハイライトした部分) 削除しました。今度は、自分の HTML を書き込むことができます。その前に、知っておくべきことが 3 つあります。
- おそらく、自分の表示テンプレートの <head> セクションに <style> タグを保持するのが最も簡単な方法です。ここでは説明しませんが、いくつかの理由でそれらの style タグは表示テンプレートがレンダリングされるときに破棄されるため、最終的には style タグをコピーして別の CSS ファイルに挿入することができます。ただし、実際に HTML を作成する間に、表示テンプレートに設定する外観が確実に反映されるように style タグを使用して変更することができます。
- 上記のとおり、インライン JavaScript と呼ぶスクリプトを追加することができますが、これは実際には、正しい場所である限り、JavaScript コードを追加できることを意味します。表示テンプレートの正しい場所とは、表示テンプレートの最初の DIV タグの後に配置する必要があるということを意味します。また、開始タグと終了タグのセット (<!--#_ と _#-->) の間に配置する必要があります。カスタム タグについては以下で説明しますが、これらのタグの間に JavaScript を配置しなければ実行されません。これについて非常に優れている点は、出力される HTML を作成するときにインライン JavaScript で定義する変数を使用できることです。それについては次の項目で詳しく説明します。
- 作成したインライン JavaScript から管理プロパティや変数を生成するには、そのスクリプトを開始タグと終了タグのセット (_#= と =#_) で囲む必要があります。管理プロパティは、すべて ctx.CurrentItem と呼ばれる 1 つのオブジェクト内にあります。たとえば、AccountManager 管理プロパティを生成するには、_#= ctx.CurrentItem.AccountManager =#_ タグを追加します。var foo = “The current Account Manager is “ + ctx.CurrentItem.AccountManager + “.”; のような JavaScript がある場合は、“foo” を生成するため、_#= foo =#_ タグを追加します。これにより、表示テンプレートで使用できるデータを追加または処理するための完全な柔軟性が得られます。
これで、HTML を作成する場合のメカニズムについてご理解いただけたと思います。次に、上記の表示テンプレートを作成するために使用したコードを示します。head タグには次の style 属性を追加しました。
<style>
.ReportDiv
{
float:left;
}
.ReportText
{
font-family: Verdana, Geneva, sans-serif;
font-size: 12px;
}
.ReportHeading
{
font-weight: bold;
}
.LogoImg
{
margin-top: 15px;
width: 118px;
height: 101px;
}
.MasterDiv
{
float:left;
height: 215px;
width: 342px;
background-repeat: no-repeat;
background-image: url(https://sps/sites/search/PublishingImages/SalesReportBackground.PNG);
padding: 15px;
}
.DetailsContainer
{
background-color:#CCC;
}
</style>
ここに記すだけの価値がある主要な点は、アカウント マネージャーの詳細で背景として使用する画像は、既に自分のサイトにアップロード済みの画像だということです。それ以外はすべて見ればわかります。繰り返しますが、この style タグを <head> セクションに含めることにより、Dreamweaver でデザインする間、正確なレイアウトの状態を確認することができます。
次に、表示テンプレートを作成するのに使用する HTML 自体を見てみましょう。
<div>
<div class="ReportDiv">
<img class="LogoImg" src="https://sps/sites/search/PublishingImages/SalesReportLogo.PNG" />
</div>
<div class="MasterDiv">
<!-- Title and link to item -->
<a href="_#= ctx.CurrentItem.Path =#_" class="ReportText">_#= ctx.CurrentItem.Title =#_</a>
<br/><br/>
<!-- Account Manager -->
<span class="ReportHeading ReportText">
Account Manager:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.AccountManager =#_
</span><br/>
<!-- Sales Region -->
<span class="ReportHeading ReportText">
Sales Region:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.SalesRegion =#_
</span><br/>
<!-- Total Accounts -->
<span class="ReportHeading ReportText">
Total Accounts:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.TotalAccounts =#_
</span><br/>
<!-- Top Accounts -->
<span class="ReportHeading ReportText">
Top Accounts:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.TopAccounts =#_
</span><br/>
<!-- Direct Reports -->
<span class="ReportHeading ReportText">
Direct Reports:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.DirectReports =#_
</span><br/>
<!-- Hit Highlighted Text -->
<br/>
<span class="ReportHeading ReportText">
Details:
</span>
<br/>
<span class="DetailsContainer ReportText">
_#= Srch.U.processHHXML(ctx.CurrentItem.HitHighlightedSummary) =#_
</span>
</div>
</div>
このコンテンツの書式設定機能の説明については省略し、データについて説明します。全体をとおして、_#= タグと =#_ タグを使用して管理プロパティを挿入した場所を確認いただけると思います。ご覧のとおりの単純なトークン置換なので、(より関係が深い XSLT でこれを行うのとは反対に) 上の <a> href 属性でも直接に使用することができます。残りのフィールドは書式設定用の適切な DIV または SPAN タグの間に挿入されるだけです。ここに示す 1 つの "特殊な" ケースは、検索に付随する組み込み処理コンポーネントを使用する HitHighlightedSummary に関するものです。この時点では、コンポーネントとメソッドおよびその動作に関する完全な一覧はありませんが、使用しなければ概要がハイライト表示されないという理由でのみ、これを追加します。この方法は、必ずその目的で使用してください。
これで、正常に機能させるためにすべきことをすべて行いましたが、マークアップに関して行う必要がある処理がもう 1 つあります。つまり、<style> タグの間の部分をすべてコピーし、SalesReport.css という新しい CSS ドキュメントに貼り付けることです。私は、自分のマスター ページ ギャラリーの /Display Templates/Search フォルダーに styles という別のフォルダーを作成し、そのディレクトリに SalesReport.css ファイルをアップロードしました。そのファイルを今すぐ表示テンプレートで使用するには、新しいスクリプト タグを追加する必要があります。そのタグは、<body> タグより下で、最初の <div> タグより上に位置する必要があります。私は、$includeCSS というSharePoint の JavaScript 関数を使用して、表示テンプレート用に引き出された自分の CSS ファイルを取得します。それで、開始マークアップは次のようになります。
<body>
<script>
$includeCSS(this.url, "./styles/SalesReport.css");
</script>
<div id="Item_SalesReport">
これでコードは完成ですが、カスタム表示テンプレートを使用するにはどうすればよいでしょうか。
結果の種類
結果の種類は、ルール セットに基づいて表示テンプレートを呼び出すときの方法です。ルールは使用するのがいたって簡単です。電子メール、PDF、Word ドキュメント、SharePoint Wiki など、事前定義された特定のコンテンツ タイプの場合に起動することができます。それに加えて、クエリの対象が特定の結果ソースである場合にのみそれらのルールを提供することもできます。最後に、任意の共通比較を使用して、任意の管理プロパティをルールの条件として選択することもできます。たとえば、VP で異なる表示タイプが使用されるようにする場合は、AccountManager フィールドに “Vice President” が含まれている場合にのみ結果の種類ルールが起動されるようにすることができます。私たちのケースでは、コンテンツ タイプが “売上報告書” (Sales Report) と等しい場合にのみ、結果の種類が起動されるようにします。したがって、ContentType が “売上報告書” (Sales Report) に等しいことを示す条件を、結果の種類の条件として追加します。
おわかりのように、一致文字列として複数の値を追加することも可能です。また、一緒に AND 演算される複数のプロパティを追加することもできます。このシナリオの場合、必要なのは ContentType だけです。いったん条件を定義した後は、そのルールのアクションを構成できます。結果の種類の場合のアクションは、使用可能な表示テンプレートすべてを含んだドロップダウンを表示することだけです。必要な操作は、ドロップダウンから自分の売上報告書表示テンプレートを選択し、[保存] ボタンをクリックして結果の種類を作成することだけです。繰り返しますが、結果の種類の作成方法が不明な場合は、SharePoint に付属の結果の種類すべてを調べてください。既存の結果の種類のいくつかを調べれば、新しい結果の種類を作成するためのヒントをたくさん見つけることができます。
まとめ
これで、必要なメタデータをキャプチャするカスタム コンテンツ タイプ、抽出してインデックスに入力するいくつかの管理プロパティ、誰かが "sales report" についてクエリを実行したときにリストの先頭に売上報告書のコンテンツがポップアップ表示されるようにするクエリ ルール、捕捉したメタデータを標準的な検索結果とはかけ離れた本当に独特で便利な形式で表示するカスタム表示テンプレート、およびカスタム コンテンツ タイプが検索結果で返されたときに表示テンプレートが必ず使用されるようにする結果の種類など、必要なものすべての準備を整えることができました。最終的な結果は次のようになります。
以上が、検索結果を表示するための SharePoint 2013 における非常に優れた機能のいくつかについての紹介です。どうぞ、これらの機能の有効性を実感し、それらの機能を使用する場合の有用で興味深い方法を見出してください。
これはローカライズされたブログ投稿です。原文の記事は、「Using Query Rules, Result Types and Display Templates for a Custom Search Sales Report in SharePoint 2013」をご覧ください。