検索結果をカスタマイズするサンプル アドイン (SharePoint)

Search.PersonalizedResults サンプルは、ユーザー プロファイル プロパティの値に基づき情報をフィルター処理して SharePoint をカスタマイズする方法を示しています。 たとえば、以下のようにカスタマイズできます。

  • ニュース記事などのコンテンツを国や場所によってフィルター処理します。
  • ユーザーの役割や組織に基づいてナビゲーション リンクをフィルター処理します。
  • 事業所の場所に基づいてレストランや小売店を一覧表示します。

このコード サンプルは、プロバイダー ホスト型アドインを使用して、ユーザーがアクセス許可を持つすべてのサイトまたはチーム サイトのみが含まれる検索結果をそのユーザーに対して表示します。 このために、サンプルでは以下の処理が実行されます。

  • AboutMe ユーザー プロファイル プロパティの値を調べます。
  • AboutMe ユーザー プロファイル プロパティの値に関連付けられた検索クエリ フィルター文字列を作成します。
  • 検索クエリを実行し、検索クエリの結果を表示します。

はじめに

まず、Search.PersonalizedResults サンプル アドインを、GitHub 上の Office 365 Developer Patterns and Practices プロジェクトからダウンロードします。

注:

この記事で提供されるコードは、明示または黙示のいかなる種類の保証なしに現状のまま提供されるものであり、特定目的への適合性、商品性、権利侵害の不存在についての暗黙的な保証は一切ありません。

Search.PersonalizedResults サンプル アドインを使用する

このコード サンプルを実行すると、プロバイダー ホスト型アプリケーションが表示されます。

Search.PersonalizedResults アドインの開始ページを示すスクリーンショット

この記事では、「すべてのサイト テンプレートに対して、プロファイル データを使用して個人用に設定した検索を実行する」というシナリオについて説明します。 以下の図に示すように、[カスタマイズ検索の実行] を選択すると、チーム サイトだけが含まれるようにフィルター処理された検索結果が返されます。 [テンプレート] 列には、種類が [STS] のサイトだけが含まれていることに注意してください。

チーム サイトのみが表示された検索結果のスクリーンショット

カスタマイズ シナリオを処理するため、以下のようにして検索クエリを変更できます。

  • 対象ユーザーのユーザー プロファイル プロパティの値を読み取って検査する。 このコード サンプルは、[自己紹介] プロパティの値が AppTest であるかどうかを検査します。

  • ユーザー プロファイル プロパティの値に基づいて特定のアクションを実行します。 たとえば、[自己紹介] ユーザー プロファイル プロパティの値が AppTest である場合、このコード サンプルはチーム サイトのフィルターを削除し、すべてのサイトを含む検索結果を返します。

[自己紹介] ユーザー プロファイル プロパティに AppTest を入力する

  1. Office 365 サイトの上部にある自分のプロファイル画像を選択して、[自己紹介] を選択します。

    [自己紹介] が選択された状態のユーザー プロファイル ページのスクリーンショット。

  2. [自己紹介] ページで、[プロファイルの編集] を選択します。

  3. [自己紹介] に、AppTest と入力します。

  4. [すべて保存して閉じる] を選択します。

Search.PersonalizedResults プロバイダー ホスト型アドインに戻り、[個人用に設定された検索を実行する] をもう一度選択します。 以下の図に示すように、アドインで検索クエリのフィルターが変更され、チーム サイトだけでなく、すべてのサイトが表示されるようになります。 [テンプレート] 列に、いくつかの異なるサイト テンプレートの種類が含まれるようになります。

すべてのサイトが表示された検索結果のスクリーンショット

default.aspx.cs で、[ 個人用設定検索の実行 ] を選択すると 、btnPersonalizedSearch_Click メソッドが呼び出され、次のアクションが実行されます。

  • PeopleManager を使用して、このアドインを実行しているユーザーのユーザー プロファイル プロパティをすべて取得します。

  • AboutMe ユーザー プロファイル プロパティの値を取得して検査します。 AboutMe プロパティの値が AppTest の場合、検索クエリはクエリ文字列 contentclass:"STS_Site"を使用してすべてのサイトを取得します。 AboutMe プロパティの値が AppTest でない場合、チーム サイト フィルターはクエリ文字列 (WebTemplate=STS) に追加され、検索クエリはチーム サイトのみを取得します。

  • ProcessQuery メソッドを呼び出して、指定されたクエリ文字列に基づく検索結果を取得します。 ProcessQuery も、検索結果で返すプロパティのリストを指定する方法を示しています。

  • FormatResults メソッドを呼び出して、検索結果を HTML テーブルとして書式設定します。

protected void btnPersonalizedSearch_Click(object sender, EventArgs e)
        {
            var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);

            using (var clientContext = spContext.CreateUserClientContextForSPHost())
            {
                // Load user profile properties.
                PeopleManager peopleManager = new PeopleManager(clientContext);
                PersonProperties personProperties = peopleManager.GetMyProperties();
                clientContext.Load(personProperties);
                clientContext.ExecuteQuery();
                // Check the value of About Me.
                string aboutMeValue = personProperties.UserProfileProperties["AboutMe"];
                string templateFilter = ResolveAdditionalFilter(aboutMeValue);
                // Build the query string.
                string query = "contentclass:\"STS_Site\" " + templateFilter;
                ClientResult<ResultTableCollection> results = ProcessQuery(clientContext, query);
                lblStatus2.Text = FormatResults(results);
            }
        }

private ClientResult<ResultTableCollection> ProcessQuery(ClientContext ctx, string keywordQueryValue)
        {
            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);
            SearchExecutor searchExec = new SearchExecutor(ctx);
            ClientResult<ResultTableCollection> results = searchExec.ExecuteQuery(keywordQuery);
            ctx.ExecuteQuery();
            return results;
        }

関連項目