SharePoint の検索のカスタマイズ
注:
次のページは、SharePoint Online のクラシック サイトに関連しています。 これらの機能は、最新の SharePoint サイトではサポートされていません。 最新の SharePoint で同様の機能を実装するには、次の場所にある PnP モダン検索 Web パーツを確認します。 https://microsoft-search.github.io/pnp-modern-search/
検索ベースのサイト ディレクトリ、カスタマイズ検索結果、または検索構成の移植性を使用して、カスタマイズした SharePoint および SharePoint Online の検索シナリオを作成します。
検索ベースのサイト ディレクトリ
SharePoint 検索では、カスタム コードを記述せずに検索ベースのサイト ディレクトを作成することができます。
サイト ディレクトリを作成するには、次の手順を実行します。
- サイト ディレクトリの表示テンプレートを作成します。
- サイト ディレクトリの検索結果の種類を定義します。
- 結果ページを作成します。
- 検索結果 Web パーツ プロパティを編集します。
注:
次の手順では、サイトに関連する表示テンプレートを変更なしで使用します。 サイト ディレクトリの結果の表示方法を変更する場合、作成する表示テンプレートを変更します。
サイト ディレクトリの表示テンプレートを作成するには
マスター ページ ギャラリーにマップされたネットワーク ドライブを開きます。 詳細については、「SharePoint マスター ページ ギャラリーへネットワーク ドライブを割り当てる」を参照してください。
操作しようとしている内容を最適にマップする表示テンプレート HTML ファイルのコピーを作成します。 サイト ディレクトリのシナリオの場合は、Item_Site.html と Item_Site_HoverPanel.html です。 どちらのファイルも、マップされたネットワーク ドライブの
\Display Templates\Search
フォルダーにあります。次のように Item_SiteDirectory.html と Item_SiteDirectory_HoverPanel.html のコピーの名前を変更します。
Item_SiteDirectory.html ファイルを開き、次のように変更します。
<title>
タグの値を Site Item から Site Directory に変更します。- 開始
<body>
タグの後の最初の<div>
タグを<div id="Item_Site">
から<div id="Item_SiteDirectory">
に変更します。 - ホバー パネル表示テンプレート JavaScript ファイルの名前を
var hoverUrl = "~sitecollection/_catalogs/masterpage/Display Templates/Search/Item_Site_HoverPanel.js";
からvar hoverUrl = "~sitecollection/_catalogs/masterpage/Display Templates/Search/Item_SiteDirectory_HoverPanel.js";
に変更します。
Item_SiteDirectory_HoverPanel.html ファイルを開き、次のように変更します。
- 開始
<body>
タグの後の<div>
タグを<title>Site Hover Panel Test</title>
から<title>Site Directory Hover Panel</title>
に変更します。 <title>
タグを<div id="Item_Site_HoverPanel">
から<div id="Item_SiteDirectory_HoverPanel">
に変更します。
- 開始
サイト ディレクトリの結果の種類を定義するには
[サイト設定]>[検索]>[検索結果の種類] に移動し、新しい検索結果の種類 を選択します。
新しい検索結果の種類の名前を「Basic Site Direcotory」にします。
[結果の見た目を設定] ボックスで、[サイト ディレクトリ] を選択します。
[保存] を選択します。
結果ページを作成するには
- [サイト設定] メニューで、[サイト コンテンツ] を選択します。
- [ページ] を選択します。
- [ページ] ライブラリで、[ファイル]>[新しいドキュメント]>[ページ] を選択します。
- [ページの作成] ページで、[タイトル] に Site Directory、[URL 名] に sitedirectory を指定します。
- [作成] を選択します。
検索結果 Web パーツのプロパティを編集するには
[サイト ディレクトリ] ページで、[設定]>[ページの編集] を選択します。
[検索結果 Web パーツ] で、[Web パーツ] メニューを選択し、[Web パーツの編集] を選択します。
Web パーツ ツール ウィンドウで、[クエリの変更] を選択し、クエリ ビルダーを開きます。
[クエリ テキスト] フィールドに次を入力します。
ContentClass:STS_Web OR ContentClass:STS_Site path:http://<YourServer>
[テスト クエリ] を選択して、構文が正しいことを確認します。 [検索結果のプレビュー] ウィンドウに、[クエリ テキスト] の path で指定したサイト内のサブサイトが表示されるはずです。
[OK] をクリックしてクエリ ビルダーを閉じます。
[表示テンプレート] で、[検索結果の種類を使用したアイテムの表示] を選択します。
[アイテムの検索結果の種類] リストの [Basic Site Directory] を選択します。
[外観] セクションで、[タイトル] を Sites I have access to に変更します。
[OK] をクリックして Web パーツの変更を保存し、Web パーツ ツール ウィンドウを閉じます。
次の図では、検索ベースのサイト ディレクトリ ページの例を示します。
カスタマイズ検索の結果
カスタマイズ検索は、検索要求を提出するユーザーを対象とする検索結果を表示するときに使用されます。 このセクションでは、カスタマイズ検索の一部のシナリオとそれらの実装方法を説明します。
ニュース シナリオ
このシナリオでは、ユーザーを対象にニュースやイベントなど、関連するコンテンツを示す検索アドインを作成します。
ニュースのカスタマイズ検索のシナリオ
ニュースのシナリオを実装するには、SharePoint 検索結果 Web パーツおよび既定の表示テンプレートを使用して、タイトル、説明、ロールアップ イメージを含むニュース情報を表示します。 最初の 10 個のニュース アイテムを表示します。 ユーザーがロールアップ イメージ、タイトル、または [詳細情報] リンクを選択すると、ニュース記事のページが読み込まれます。
または、クエリ API (CSOM または REST) を使用して検索アドインを作成することができます。 検索アドイン プロパティを使用して構成可能なニュース アイテムの数を表示することができます。
もう 1 つのオプションでは、クエリ API を使用し、検索結果を取得するクエリ API コードをページ レイアウトに直接追加します。
ユーザー固有のニュースやイベント情報を表示するには
- 部署、地域、言語などのユーザー プロファイルのプロパティに基づいてニュースやイベントの結果をフィルター処理するように、クエリを変更します。
- ニュースやイベント アイテムのタイトル、説明、ロールアップ イメージ、および URL のプロパティを取得します。
- 組み合わせたニュースとイベントを LastModifiedDate プロパティに基づいて並び替えるロジックを実装します。
予定イベントのシナリオ
このシナリオでは、検索アドインは、ユーザーを対象に関連するイベントを表示します。
予定イベントのカスタマイズ検索のシナリオ
このシナリオを実装するには、SharePoint 検索結果 Web パーツの構成で、予定イベント情報だけを取得するようにクエリを変更できます。 これを実行するには、ContentClass:STS_ListItem_Events
に Web パーツのクエリ テキストを指定します。 イベントの結果の表示方法を変更するには、カスタム表示テンプレートを作成し、イベント情報を表示します。
アイテム表示テンプレートを変更して、ユーザーがイメージ、タイトル、または [詳細情報] リンクを選択すると、イベント情報が読み込まれるようにすることができます。 コントロール表示テンプレートを変更して、ユーザーが [その他を見る] を選択すると Web パーツに次の 10 イベント結果が表示されるようにすることもできます。
クエリ API を使用する検索アドインを作成して、イベント結果を取得することもできます。 既定で最新の 10 項目の予定イベントのみを表示するように検索アドインを構成できますが、検索アドイン プロパティでこの設定を構成可能にしてください。
おすすめのニュース シナリオ
このシナリオでは、検索アドインは検索結果を、企業のイントラネットや部門のランディング ページなどの場所でユーザーを対象とするおすすめコンテンツとして表示します。 これを、検索 REST サービスまたはクエリ CSOM を使用する HTML とともに jQuery プラグインを含むアドイン パーツで実装して、SharePoint から検索結果を取得し、結果を表示することができます。
カスタマイズ検索のコード サンプル
[SharePoint アドインで検索結果をカスタマイズする] サンプルでは、検索クエリ CSOM を使用する基本的な検索結果とカスタマイズされた検索結果が表示されます。 基本的な検索結果は、ユーザーに検索フィルターを提供して、テナント全体の検索に使用できるようにします。 サイトは、そのユーザーが提供したフィルターに基づいて検索されます。
この例では、SharePointContextProvider クラスを使用して SharePoit コンテキストを最初に取得します。
var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
次に、ユーザーが入力した内容に基づいてクエリを作成します。 クエリをサイト コレクションに限定した後、ProcessQuery メソッドを呼び出し、コンテキストとクエリをメソッド コールに渡します。 次に、ProcessQuery 結果を結果テーブルとして返し、それが FormatResults メソッドで解析されます。
using (var clientContext = spContext.CreateUserClientContextForSPHost())
{
string query = searchtext.Text + " contentclass:\"STS_Site\"";
ClientResult<ResultTableCollection> results = ProcessQuery(clientContext, query);
lblStatus1.Text = FormatResults(results);
}
ProcessQuery メソッドは、検索クエリを表す KeywordQuery オブジェクトを作成します。
KeywordQuery keywordQuery = new KeywordQuery(ctx);
keywordQuery.QueryText = keywordQueryValue;
keywordQuery.RowLimit = 500;
keywordQuery.StartRow = 0;
keywordQuery.SelectProperties.Add("Title");
keywordQuery.SelectProperties.Add("SPSiteUrl");
keywordQuery.SelectProperties.Add("Description");
keywordQuery.SelectProperties.Add("WebTemplate");
keywordQuery.SortList.Add("SPSiteUrl", Microsoft.SharePoint.Client.Search.Query.SortDirection.Ascending);
ExecuteQuery_Client(Query) メソッドが呼び出されて、検索クエリが SharePoint に送信されます。 結果は ClientResult<T> オブジェクトに返されます。
SearchExecutor searchExec = new SearchExecutor(ctx);
ClientResult<ResultTableCollection> results = searchExec.ExecuteQuery(keywordQuery);
ctx.ExecuteQuery();
FormatResults メソッドは検索結果を反復処理して、結果の値を表示する HTML テーブルを作成します。
string responseHtml = "<h3>Results</h3>";
responseHtml += "<table>";
responseHtml += "<tr><th>Title</th><th>Site URL</th><th>Description</th><th>Template</th></tr>";
if (results.Value[0].RowCount > 0)
{
foreach (var row in results.Value[0].ResultRows)
{
responseHtml += "<tr>";
responseHtml += string.Format("<td>{0}</td>", row["Title"] != null ? row["Title"].ToString() : "");
responseHtml += string.Format("<td>{0}</td>", row["SPSiteUrl"] != null ? row["SPSiteUrl"].ToString() : "");
responseHtml += string.Format("<td>{0}</td>", row["Description"] != null ? row["Description"].ToString() : "");
responseHtml += string.Format("<td>{0}</td>", row["WebTemplate"] != null ? row["WebTemplate"].ToString() : "");
responseHtml += "</tr>";
}
}
responseHtml += "</table>";
ResolveAdditionalFilter メソッドは、"Apptest" があるかどうかを検査します。 見つかった場合、任意の種類のサイト テンプレートのリストが検索結果に返されます。 見つからなかった場合、STS Web テンプレートだけが検索結果に返されます。
private string ResolveAdditionalFilter(string aboutMeValue)
{
if (!aboutMeValue.Contains("AppTest"))
{
return "WebTemplate=STS";
}
return "";
}
次に、この例ではクエリを作成し、検索結果の取得、書式設定、表示を実行するために ProcessQuery および FormatResults メソッドを呼び出します。
string query = "contentclass:\"STS_Site\" " + templateFilter;
ClientResult<ResultTableCollection> results = ProcessQuery(clientContext, query);
lblStatus2.Text = FormatResults(results);
以下の図では、この例の UI を示します。
検索構成の移植性
SharePoint および SharePoint Online では、サイト コレクションおよびサイトの間で、カスタマイズされた検索構成設定のインポートとエクスポートができます。 Search Service アプリケーション (SSA) レベルでは、カスタマイズされた検索構成設定のみをエクスポートすることができ、これをプログラムで実行するには検索 API を使用する必要があります。 [エクスポート] オプションは、SharePoint UI では使用できません。
「SharePoint Online の検索設定のインポートとエクスポート」 サンプルでは、コンソール アプリケーションで検索 CSOM を使用して、SharePoint Online サイトの検索設定をインポートおよびエクスポートする方法が示されています。
移植可能な設定の構成
カスタマイズされた検索構成設定をエクスポートする場合、SharePoint は XML 形式の検索構成ファイルを作成します。 この検索構成ファイルには、SSA レベル、サイト コレクション レベル、またはサイト レベル (エクスポートを開始した場所) でエクスポート可能なすべてのカスタマイズされた検索構成設定が含まれます。 サイト コレクション用の検索構成ファイルには、サイト コレクション内の個々のサイトからの検索構成設定は含まれません。
検索構成ファイルをインポートすると、SharePoint は、サイト コレクションまたはサイト (インポートを開始した場所) に、カスタマイズされた検索構成設定を作成し、それを有効にします。
次の表は、エクスポート/インポートできる設定と、他のカスタマイズされた検索構成設定に対する依存関係を一覧表示しています。 カスタマイズされた検索構成設定が、別のレベルにあるカスタマイズされた検索構成設定に依存している場合、該当するすべてのレベルで設定をエクスポート/インポートする必要があります。
エクスポートおよびインポート可能な検索設定
構成設定 | 依存関係 |
---|---|
結果ブロック、昇格した結果、およびユーザー セグメントを含むクエリ ルール | 検索先、検索結果の種類、検索スキーマ、ランク付けモデル |
検索先 | 検索スキーマ |
結果の種類 | 検索スキーマ、検索先、表示テンプレート |
検索スキーマ | なし |
ランク付けモデル | 検索スキーマ |
カスタマイズされた検索構成設定を SSA からエクスポートし、その設定をサイト コレクションおよびサイトにインポートすることができます。 しかし、カスタマイズされた検索構成設定を SSA にインポートすることはできません。 また、既定の検索構成設定をエクスポートすることもできません。
サイトまたはサイト コレクションのレベルでは、SharePoint UI を使用して検索構成設定をエクスポートまたはインポートできます。 これらの設定は、[サイトの設定] ページの [検索] セクションにあります。
これらの設定は、[サイト コレクションの管理] セクションでも利用できます。 または、SharePoint 検索 CSOM を使用してこれらの設定をプログラムでインポートおよびエクスポートすることができます。
検索構成ファイル
次の表では、検索構成をサポートするスキーマ ファイルを一覧表示します。 スキーマ形式の詳細については、「SharePoint 検索設定の移植性スキーマ」 を参照してください。
注:
スキーマ ファイルは、SP15_search_settings_portability_schema.zip からダウンロードすることができます。
検索設定の移植性スキーマ
スキーマ | 説明 |
---|---|
SPS15XSDSearchSet1 | 検索先を表す XML を指定します。 |
SPS15XSDSearchSet2 | SSA 検索インスタンスを管理するための管理タイプとメンバーを表す XML を指定します。 これには、検索結果アイテムの種類とプロパティ ルールの設定が含まれます。 |
SPS15XSDSearchSet3 | クエリ ルール、検索先、管理プロパティ、クロールされたプロパティ、およびランク付けモデルを含む設定を表す XML を指定します。 |
SPS15XSDSearchSet4 | その他のスキーマで使用される列挙を表す XML を指定します。 |
SPS15XSDSearchSet5 | 他のスキーマで使用される ResultType のような列挙を表す XML を指定します。 |
SPS15XSDSearchSet6 | Microsoft.Office.Server.Search.Administration スキーマで使用される列挙を表す XML を指定します。 |
CSOM を使用した構成設定の移植
検索構成設定をインポートおよびエクスポートするために必要な CSOM API は、Microsoft.SharePoint.Client.Search.Portability 名前空間の SearchConfigurationPortability クラスにあります。
以下のコードの例は、サイトの検索構成設定をエクスポートする方法を示しています。
private static void ExportSearchSettings(ClientContext context, string settingsFile)
{
SearchConfigurationPortability sconfig = new SearchConfigurationPortability(context);
SearchObjectOwner owner = new SearchObjectOwner(context, SearchObjectLevel.SPWeb);
ClientResult<string> configresults = sconfig.ExportSearchConfiguration(owner);
context.ExecuteQuery();
string results = configresults.Value;
System.IO.File.WriteAllText(settingsFile, results);
}
以下のコードは、サイトの検索構成設定をインポートする方法を示しています。
private static void ImportSearchSettings(ClientContext context, string settingsFile)
{
SearchConfigurationPortability sconfig = new SearchConfigurationPortability(context);
SearchObjectOwner owner = new SearchObjectOwner(context, SearchObjectLevel.SPWeb);
sconfig.ImportSearchConfiguration(owner, System.IO.File.ReadAllText(settingsFile));
context.ExecuteQuery();
}