zoukankan      html  css  js  c++  java
  • SharePoint 2013 开发——搜索架构及扩展

    博客地址:http://blog.csdn.net/FoxDave

    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 FilesMicrosoft Office Servers15.0SearchApplicationsExternal,添加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的服务中定义的字符串格式的值。

    更多信息


  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/justinliu/p/5961608.html
Copyright © 2011-2022 走看看