个性化设置搜索结果示例 SharePoint 外接程序
Search.PersonalizedResults 示例展示了如何按用户配置文件属性值筛选信息,从而个性化设置 SharePoint。 个性化的一些例子包括:
- 按国家/地区或地理位置筛选新闻文章或其他内容。
- 根据用户的角色或组织筛选出的导航链接。
- 按经营地理位置筛选餐馆或零售商店列表。
此代码示例使用提供程序托管加载项向用户显示搜索结果,其中包括所有网站或仅用户有权访问的团队网站。 为此,本示例:
- 检查 AboutMe 用户配置文件属性的值。
- 生成与 AboutMe 用户配置文件属性的值相关联的搜索查询筛选器字符串。
- 运行搜索查询并显示搜索查询结果。
准备工作
首先,请从 GitHub 上的 Office 365 开发人员模式和做法项目下载 Search.PersonalizedResults 示例外接程序。
注意
本文中的代码按原样提供,不提供任何明示或暗示的担保,包括对特定用途适用性、适销性或不侵权的默示担保。
使用 Search.PersonalizedResults 示例外接程序
运行本代码示例时,会显示提供程序托管的应用程序。
本文介绍了使用配置文件数据,对所有网站模板执行个性化搜索的方案。 选择“执行个性化搜索”将返回仅包含团队网站的筛选搜索结果,如下图所示。 请注意,“模板”列仅包含类型为 STS 的网站。
若要处理个性化方案,可以更改搜索查询,具体方法如下:
读取并测试相应用户的用户配置文件属性值。 此代码示例测试 AboutMe 属性值是否为 AppTest。
根据用户配置文件属性值执行特定操作。 例如,如果 AboutMe 用户配置文件属性值为 AppTest,此代码示例将移除团队网站筛选器,并返回包含所有网站的搜索结果。
在“AboutMe”用户配置文件属性中输入“AppTest”
在 Office 365 网站顶部,选择你的配置文件图片,然后选择“关于我”。
在“关于我”页上,选择“编辑你的配置文件”。
在“关于我”中,输入“AppTest”。
选择“全部保存并关闭”。
执行个性化搜索
返回到 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;
}