SharePoint 2013 开发——搜索架构及扩展
SharePoint 2013高度整合了搜索引擎,在一个场中只有一个搜索服务应用程序(SSA)。它集成了FAST,只有一个代码库,不同的授权层次启用不同的搜索功能,但是有些功能在云端是不可用的。
下图从开发者的视角展示了搜索架构,摘选自SharePoint高级编程。
图中标记灰色的部分就是我们在开发过程中可以应用或扩展的部分。我们可以通过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,勾选查询、搜索、检索和优化,单击确定按钮完成创建,如下图所示。
接下来打开Visual Studio 2013,创建一个WCF应用程序项目叫做ContentEnrichmentExampleService
随项目默认创建的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的服务中定义的字符串格式的值。
SharePoint 2013 开发——搜索架构及扩展的更多相关文章
- SharePoint 2013 企业搜索架构示例
博客地址:http://blog.csdn.net/FoxDave 本文参考自微软官方的Chart,我们来看一下企业中对于不同规模SharePoint搜索的场的架构是什么样的. 对于搜索场的规模, ...
- SharePoint 2013 开发——工作流架构
博客地址:http://blog.csdn.net/FoxDave SharePoint 2013的工作流较之前有了不同,第一次真正地作为独立的服务的概念推出了.这意味着SharePoint工作流不再 ...
- SharePoint 2013 开发——概述
博客地址:http://blog.csdn.net/FoxDave 近来阅读SharePoint 2013开发一书,带着与大家一起分享其中的内容. 部署场景: 本地部署(On-Premise D ...
- SharePoint 2013 定制搜索显示模板
前言 之前我们已经介绍了一些关于搜索的相关配置,当然,用户关于搜索的要求可能是各种各样.有时候,用户会说,你们的显示结果太Low了,确实是:不过,在SharePoint中,我们可以很容易的定制搜索结果 ...
- SharePoint 2013 禁用搜索服务
原文:SharePoint 2013 禁用搜索服务 前言,在SharePoint2013中,对于硬件需求的提升,让我们虚机里安装总是一筹莫展,尤其开启了搜索服务以后,对于内存的消耗就更加严重,尤其对于 ...
- SharePoint 2013 定制搜索显示模板(二)
前言 之前一篇博客,简单的介绍了如何定制搜索显示模板,这一次,我们介绍一下如何定制搜索显示时,弹出来的那个页面,相信这个大家也都会遇到的. 1.第一部分就是搜索显示模板的部分,第二部分就是搜索项目详情 ...
- SharePoint 2013开发环境准备一些小事项
开发慢慢向着SharePoint 2013迁移,环境也开始慢慢准备起来了.由于FAST Search的集成,和缓存服务的加入,SharePoint 2013对开发机器要求的不是一般的高.这里介绍一下如 ...
- SharePoint 2013 开发——APP开发的考虑和建议
博客地址:http://blog.csdn.net/FoxDave 需要考虑的方面: 1. 记得CSOM授予网站集及以下的权限,而场解决方案需要整个场的访问权限. 2. 由于应用程序是彼此完全独立 ...
- SharePoint 2013 开发——APP安全模型
博客地址:http://blog.csdn.net/FoxDave 除非开启了SharePoint网站的匿名访问,否则对于入站的请求,必须要有一个身份验证的过程(Authentication),这个 ...
随机推荐
- js子窗体、父窗体方法互调
var childWindow = $("#editFrame")[0].contentWindow;//获取子窗体的window对象. childWindow.subForm() ...
- ifconfig
虚拟机启动后发现ifconfig命令下,没有打印ip .用ifconfig eth0 up命令开启下网卡. #ifconfig eth0 up .更改eth0配置: #vi/etc/sysconfig ...
- Digital Roots 1013
Digital Roots 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:456 测试通过:162 描述 T ...
- 关于css的一些知识点整理
一.标签的类型: 行内:span.a.b.i.strong.em. 1.共处一行 2.不支持设置宽高 display:block; 转换成块 块:h1-h6 p div ul ol 1. ...
- HTML 事件属性
HTML 事件属性一:定义二:窗口事件 (Window Events)三:表单元素事件 (Form Element Events)四:图像事件 (Image Events) 一:定义 HTML 4 的 ...
- 【Python】我的Python学习笔记【2】【using Python 3】
... 1. 在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值, 所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便. 2. ...
- Masonry+拖动
最近遇到一个问题,用Masonry写的布局: 拖动其中某个view,拖动方法按传统的写成如下形式.如果view中的label更改text值,拖动之后的view就会回到最初被设定的位置. - (void ...
- EVA资料
[史上最全EVA资料+原画+画集+设定集][共2266P=3.56GB] <ignore_js_op> <ignore_js_op> <ignore_js_op> ...
- C++11在时空性能方面的改进
C++11在时空性能方面的改进 这篇我们聊聊C++11在时间和空间上的改进点: 主要包括以下方面: 新增的高效容器:array.forward_list以及unordered containers: ...
- redis 数据导出
一.导出所有的keys echo "keys 201*" |./redis-cli -h localhost -p 6379 -a password >> 1.txt ...