搜索 SharePoint 的自定义项

注意

以下页面与 SharePoint Online 中的经典网站相关。 新式 SharePoint 网站不支持这些功能。 若要在新式 SharePoint 中实现类似功能,请查看以下位置的 PnP 新式搜索 Web 部件: https://microsoft-search.github.io/pnp-modern-search/

通过使用基于搜索的网站目录、个性化的搜索结果或搜索配置的可移植性来创建自定义的 SharePoint 和 SharePoint Online 搜索方案。

基于搜索的网站目录

您可以通过 SharePoint 搜索创建基于搜索的网站目录,而无需编写任何自定义代码。

创建网站目录:

  1. 创建网站目录显示模板。
  2. 定义网站目录结果类型。
  3. 创建结果页。
  4. 编辑结果 Web 部件属性。

注意

以下过程使用的是未经修改的网站相关显示模板。 若要更改网站目录结果的显示方式,请修改自己创建的显示模板。

创建网站目录显示模板

  1. 打开母版页样式库的映射网络驱动器。 有关详细信息,请参阅将网络驱动器映射到 SharePoint 母版页样式库

  2. 制作能够最好地映射你尝试执行操作的显示模板 HTML 文件的副本。 对于网站目录方案,文件为 Item_Site.html 和 Item_Site_HoverPanel.html。 这两个文件均位于映射的网络驱动器中的 \Display Templates\Search 文件夹。

  3. 重命名您复制的 Item_SiteDirectory.html 和 Item_SiteDirectory_HoverPanel.html 文件副本,如下所示。

    网站目录显示模板

  4. 打开 Item_SiteDirectory.html 文件,并进行以下更改:

    • <title> 标记值从 Site Item 更改为 Site Directory
    • 将打开的 <div> 标记后的第一个 <body> 标记从 <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";
  5. 打开 Item_SiteDirectory_HoverPanel.html 文件,并进行以下更改:

    • 将打开的 <div> 标记后的 <body> 标记从 <title>Site Hover Panel Test</title> 更改为 <title>Site Directory Hover Panel</title>
    • <title> 标记从 <div id="Item_Site_HoverPanel"> 更改为 <div id="Item_SiteDirectory_HoverPanel">

定义网站目录结果类型

  1. 转到“网站设置”>“搜索”>“结果类型”,然后选择“新结果类型”。

  2. 将新结果类型命名为“基本网站目录”。

  3. 在“这些结果应该是什么样子?”框中,选择“网站目录”。

    示例网站结果配置

  4. 选择“保存”

创建结果页

  1. 在“网站设置”菜单上,选择“网站内容”。
  2. 选择“页面”。
  3. 在“页面”库中,选择“文件”>“新建文档”>“页面”。
  4. 在“创建页面”页上,为“标题”指定“网站目录”,并为“URL 名称”指定“sitedirectory”。
  5. 选择“创建”。

编辑结果 Web 部件属性

  1. 在“网站目录”页上,选择“设置”>“编辑页面”。

  2. 在“搜索结果 Web 部件”中,选择“Web 部件”菜单,然后选择“编辑 Web 部件”。

    Web 部件菜单

  3. 在 Web 部件工具窗格中,选择“更改查询”以打开查询生成器。

  4. 在“查询文本”字段,输入以下内容:ContentClass:STS_Web OR ContentClass:STS_Site path:http://<YourServer>

  5. 选择“测试查询”以确认语法是否正确。 “搜索结果预览”窗格应显示你在“查询文本”中为 path 指定的网站内的子网站。

    搜索结果 Web 部件查询生成器

  6. 选择“确定”以关闭查询生成器。

  7. 在“显示模板”中,选择“使用结果类型来显示项目”。

  8. 在“项目结果类型”列表中选择“基本网站目录”。

  9. 在“外观”部分,将“标题”更改为“我有权访问的网站”。

  10. 选择“确定”以保存对 Web 部件所做的更改并关闭 Web 部件工具窗格。

    下图显示了基于搜索的网站目录页面的一个示例。

    基于 Contoso 搜索的网站目录示例

个性化的搜索结果

个性化搜索是指当你显示针对提交搜索请求的用户的搜索结果时。 本节介绍了一些个性化搜索的方案以及可能如何实现它们。

你的新闻方案

在此方案中,你将创建一个搜索外接程序,以显示相关的内容,如面向用户的新闻和事件。

你的新闻个性化的搜索方案

你的新闻个性化的搜索方案

要实施新闻方案,请使用 SharePoint 搜索结果 Web 部件和默认显示模板来显示新闻信息,其中包括标题、说明和汇总图像。 显示前十个新闻项。 用户选择汇总图像、标题或“阅读更多”链接时,将加载新闻文章页面。

或者,可以使用查询 API(CSOM 或 REST)创建搜索外接程序。 可以使用搜索外接程序属性使新闻项目的数量显示为可配置。

另一种方法是使用查询 API 添加直接对页面布局检索搜索结果的查询 API 代码。

显示特定于用户的新闻和事件信息:

  1. 基于用户配置文件属性(如业务部门、区域和语言)修改查询,以筛选新闻和事件的结果。
  2. 检索标题、说明、滚动图像和新闻或事件项的 URL 属性。
  3. 根据 LastModifiedDate 属性对组合性的新闻和事件实现排序逻辑。

即将发生的事件方案

在此方案中,搜索外接程序显示面向用户的相关事件。

即将推出的事件个性化的搜索方案

即将推出的事件个性化的搜索方案

要实现这种情况,可以配置 SharePoint 搜索结果 Web 部件以将查询更改为仅检索即将发生的事件信息。 为此,请指定 Web 部件查询文本的 ContentClass:STS_ListItem_Events。 要更改事件结果的显示方式,请创建自定义显示模板来呈现事件信息。

你可以修改项目显示模板,以便当用户选择图像、标题或“了解更多”链接时会加载事件信息页。 你还可以修改控件显示模板,以便当用户选择“查看更多”时会在 Web 部件中显示接下来的 10 个事件结果。

还可以创建一个搜索外接程序,使其可以使用查询 API 来检索结果。 默认情况下,可以配置搜索外接程序以仅显示 10 个最新即将发生的事件,但可通过搜索外接程序属性将此设置变为可配置状态。

在此方案中,针对你处于公司 Intranet 和部门登录页等位置的用户,搜索外接程序将搜索结果显示为特色内容。 可以使用外接程序部件(其中包含 HTML 的 jQuery 插件,其使用搜索 REST 服务或查询 CSOM 从 SharePoint 获取搜索结果并显示结果)来实现此方案。

个性化 SharePoint 外接程序中的搜索结果示例演示了一个基本搜索示例和一个使用搜索查询 CSOM 的个性化搜索结果的示例。 基本搜索示例使用户能够提供要用于租户范围搜索的搜索筛选器。 基于该用户提供的筛选器对站点进行搜索。

该示例将首先使用 SharePointContextProvider 类获取 SharePoint 上下文。

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 "";
}

然后,该示例将构造查询,并调用 ProcessQueryFormatResults 方法对搜索结果进行检索、设置格式和显示。

string query = "contentclass:\"STS_Site\" " + templateFilter;
ClientResult<ResultTableCollection> results = ProcessQuery(clientContext, query);
lblStatus2.Text = FormatResults(results);

在下图中,你可以看到此示例的 UI。

个性化的搜索结果示例 UI

搜索配置可移植性

在 SharePoint 2013 和 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();
}

另请参阅