SharePoint 2013 开发——搜索架构及扩展

时间:2021-08-31 11:26:33
博客地址:http://blog.csdn.net/FoxDave

SharePoint 2013高度整合了搜索引擎,在一个场中只有一个搜索服务应用程序(SSA)。它集成了FAST,只有一个代码库,不同的授权层次启用不同的搜索功能,但是有些功能在云端是不可用的。

下图从开发者的视角展示了搜索架构,摘选自SharePoint高级编程。

SharePoint 2013 开发——搜索架构及扩展

图中标记灰色的部分就是我们在开发过程中可以应用或扩展的部分。我们可以通过REST或CSOM API来对查询模块进行定义和扩展;通过BCS来创建新的索引连接;借助内容扩充Web服务(CEWS)API来扩展内容处理模块。

下面我们具体来看一下搜索中可扩展的点。

界面UI:

●Web部件,主要体现在内容搜索Web部件

●结果展示模板

●导航设置

查询:

●查询语法(KQL和FQL)

●查询APIs(REST和CSOM)

●查询规则

内容和元数据:

●搜索架构

●结果源

●业务数据连接(BCS)

●内容处理(CEWS)

相关性和语言学:

●排名属性

●权限

●术语集和字典

●语言学(如分词算法)

●分析

而我们常接触到的开发场景并不是以上全部,一般常做的开发场景有如下几个:

●修改终端用户体验,展示特定的信息;

●为特定的产业、部门,甚至是话题和角色创建新的垂直搜索应用程序;

●创建一个新的可视化元素添加到标准的搜索中;

●修改查询和索引

●创建新的搜索驱动的网站和应用程序

SharePoint 2013的搜索相关的内容个人认为是比较高深的,需要花费大量的时间好好钻研。

本篇的最后我们来一起学习一下如何使用Content Enrichment Web Service,参考一位外国友人的例子。

通过CEWS我们可以扩展SharePoint 2013的搜索功能,将托管属性的值发送到外部的Web服务并返回新的或经过修改的托管属性。这个过程包括实现一个自定义的WCF服务并使用PowerShell注册它,通过PowerShell命令来指定哪些属性进出该WCF服务。

本例中将采用Author和LastModifiedTime这两个托管属性,然后编写一个新的字符串如“Modified by <author> on <LastModifiedTime>.”到托管属性TestProperty。

首先创建这个托管属性TestProperty,类型为Text,属性有Query、SSearch、Retrieve和Refine。进入到SharePoint的网站设置页面,单击网站集管理->搜索架构,单击新建托管属性,填写名称为TestProperty,勾选查询、搜索、检索和优化,单击确定按钮完成创建,如下图所示。

SharePoint 2013 开发——搜索架构及扩展SharePoint 2013 开发——搜索架构及扩展



SharePoint 2013 开发——搜索架构及扩展

接下来打开Visual Studio 2013,创建一个WCF应用程序项目叫做ContentEnrichmentExampleService

SharePoint 2013 开发——搜索架构及扩展

随项目默认创建的Service1.svc和IService1.cs没有什么用,我们直接删除之。向项目中添加引用,浏览,导航到目录C:\Program Files\Microsoft Office Servers\15.0\Search\Applications\External,添加microsoft.office.server.search.contentprocessingenrichment.dll。

下面我们需要创建一个服务来做内容扩充处理这件事,向项目中添加一个新建项WCF服务,取名做ContentEnrichmentExampleService.svc。本例中不需要IContentEnrichmentExampleService.cs,故将它删除掉。现在我们可以打开创建服务的后台代码文件添加我们自己的代码了,代码主要实现的功能为检索输入的属性值,创建我们新的输出属性TestProperty并发回给搜索索引。

在代码头添加两个using引用

using Microsoft.Office.Server.Search.ContentProcessingEnrichment;using Microsoft.Office.Server.Search.ContentProcessingEnrichment.PropertyTypes;

将类的基类改为IContentProcessingEnrichmentService,添加一个ProcessedItem类型集合来保存从服务输出的托管属性值。

然后实现ProcessItem方法,声明我们创建的自定义属性并根据传入的值将TestProperty的值拼接出来,完整的代码如下所示:

public class ContentEnrichmentExampleService : IContentProcessingEnrichmentService    {        private readonly ProcessedItem processedItemHolder = new ProcessedItem        {            ItemProperties = new List<AbstractProperty>()        };        public ProcessedItem ProcessItem(Item item)        {            processedItemHolder.ErrorCode = 0;            processedItemHolder.ItemProperties.Clear();            //创建一个新的托管属性作为返回值,该属性必须通过PowerShell注册为输出属性            var testProperty = new Property<string>();            testProperty.Name = "TestProperty";            //需要通过PowerShell注册为输入属性            var authorProperty = item.ItemProperties.FirstOrDefault(i => i.Name == "Author") as Property<List<string>>;            var writeProperty = item.ItemProperties.FirstOrDefault(i => i.Name == "LastModifiedTime") as Property<DateTime>;            if ((authorProperty != null) && (writeProperty != null))            {                testProperty.Value = string.Format("Modified by {0} on {1}.", authorProperty.Value.First(), writeProperty.Value);                processedItemHolder.ItemProperties.Add(testProperty);            }            else            {                testProperty.Value = "检索托管属性出错。";                processedItemHolder.ItemProperties.Add(testProperty);            }            return processedItemHolder;        }    }

接下来需要将这个服务注册到SharePoint,使用PowerShell命令New-SPEnterpriseSearchContentEnrichmentConfiguration进行注册,注册完之后运行一下完全爬网。通过访问http://server/_api/search/query?querytext='*'&selectproperties='title,path,author,testproperty'可以验证我们上面的操作是不是都正确,如果正确将会返回属性TestProperty的服务中定义的字符串格式的值。

更多信息