个性化设置搜索结果示例 SharePoint 外接程序

Search.PersonalizedResults 示例展示了如何按用户配置文件属性值筛选信息,从而个性化设置 SharePoint。 个性化的一些例子包括:

  • 按国家/地区或地理位置筛选新闻文章或其他内容。
  • 根据用户的角色或组织筛选出的导航链接。
  • 按经营地理位置筛选餐馆或零售商店列表。

此代码示例使用提供程序托管加载项向用户显示搜索结果,其中包括所有网站或仅用户有权访问的团队网站。 为此,本示例:

  • 检查 AboutMe 用户配置文件属性的值。
  • 生成与 AboutMe 用户配置文件属性的值相关联的搜索查询筛选器字符串。
  • 运行搜索查询并显示搜索查询结果。

准备工作

首先,请从 GitHub 上的 Office 365 开发人员模式和做法项目下载 Search.PersonalizedResults 示例外接程序。

注意

本文中的代码按原样提供,不提供任何明示或暗示的担保,包括对特定用途适用性、适销性或不侵权的默示担保。

使用 Search.PersonalizedResults 示例外接程序

运行本代码示例时,会显示提供程序托管的应用程序。

显示 Search.PersonalizedResults 外接程序起始页的屏幕截图

本文介绍了使用配置文件数据,对所有网站模板执行个性化搜索的方案。 选择“执行个性化搜索”将返回仅包含团队网站的筛选搜索结果,如下图所示。 请注意,“模板”列仅包含类型为 STS 的网站。

仅显示团队网站的搜索结果的屏幕截图

若要处理个性化方案,可以更改搜索查询,具体方法如下:

  • 读取并测试相应用户的用户配置文件属性值。 此代码示例测试 AboutMe 属性值是否为 AppTest

  • 根据用户配置文件属性值执行特定操作。 例如,如果 AboutMe 用户配置文件属性值为 AppTest,此代码示例将移除团队网站筛选器,并返回包含所有网站的搜索结果。

在“AboutMe”用户配置文件属性中输入“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;
        }

另请参阅