设为首页 收藏本站
查看: 861|回复: 0

[经验分享] SharePoint 2010开发实例精选——可排序的搜索核心结果

[复制链接]

尚未签到

发表于 2015-9-24 11:07:55 | 显示全部楼层 |阅读模式
  虽然对于信息工作者来说SharePoint 2010开箱即用的搜索界面已经非常直观并易用,但作为超级用户仍然可以创建属于自己的搜索体验。SharePoint Server 2010包括了许多与搜索相关的强大的Web部件,用于支持超级用户定制搜索体验,包括搜索最佳匹配,精简面板,搜索核心结果,相关查询等等。下图为标准的搜索类WebPart。
DSC0000.png

  [点击查看大图]
  IT Pros或Developers可以配置内置的搜索Web部件来定制搜索体验。作为开发人员,你也可以扩展这些WebPart,来改变搜索结果页上内置搜索WebPart的行为。只需要在现有基础上进行继承并扩展,无需创建新的WebPart。
  此外,我们还可以在定制搜索WebPart时使用查询日志记录,以及随时通过查询对象模型访问搜索服务。
例子:扩展搜索核心结果Web部件
  让我们用Visual Studio 2010创建一个新的搜索WebPart。本例中的WebPart继承自CoreResultsWebPart,并从一个自定义的源中显示数据。标准的搜索核心结果WebPart包括一个构造函数和两个方法,我们将在本例中对其进行修改。
  第一步是新建一个WebPart类。创建一个新的WebPart项目并继承自CoreResultsWebPart类。覆写CreateChildControls来添加界面所需的任何控件,然后覆写CreateDataSource。这是我们操作查询的入口。在覆写中,我们将创建一个稍后创建的自定义数据源类的实例。


class MSDNSample : CoreResultsWebPart
{
    public MSDNSample()
    {
        //默认构造器:支持为了序列化所以必须存在
    }
    protected override void CreateChildControls()
    {
        base.CreateChildControls();
        //在此处添加界面上用到的控件
    }
    protected override void CreateDataSource()
    {
        //base.CreateDataSource();
        this.DataSource = new MyCoreResultsDataSource(this);
    }  第二步是创建一个新类继承自CoreResultsDatasource类。在CreateDataSource的覆写中,会设置DataSource属性为该类。在CoreResultsDataSource构造器中,创建一个稍后创建的自定义数据源视图类的实例。至此,无需再覆写其他任何内容了。


public class MyCoreResultsDataSource : CoreResultsDatasource
{
    public MyCoreResultsDataSource(CoreResultsWebPart ParentWebpart)
        : base(ParentWebpart)
    {
        //如果在这里我们需要引用该WebPart的属性或方法
        //那么可以通过 ParentWebPart 参数获取

        //创建将用于此数据源的视图
        this.View = new MyCoreResultsDataSourceView(this, "MyCoreResults");
    }
}  第三步是创建一个新类继承自CoreResultsDatasourceView类。设置你的CoreResultsDatasource的View属性为该新类。在CoreResultsDatasourceView的构造器中,获取一个引用到CoreResultsDatasource,以便你可以返回到该webpart。然后,设置QueryManager属性以便共享页面中使用的查询管理器。


public class MyCoreResultsDataSourceView : CoreResultsDatasourceView   
{
    public MyCoreResultsDataSourceView(SearchResultsBaseDatasource DataSourceOwner, string ViewName)
                    : base(DataSourceOwner, ViewName)
    {
        //确保datasource有值
        if (DataSourceOwner == null)
        {
            throw new ArgumentNullException("DataSourceOwner");
        }
        //获取一个到我们datasource的类型引用
        MyCoreResultsDataSource ds = this.DataSourceOwner as MyCoreResultsDataSource;

        //为该视图配置查询管理器
        this.QueryManager = SharedQueryManager.GetInstance(ds.ParentWebpart.Page).QueryManager;
    }  现在,我们完成了一个从自定义数据源显示数据的WebPart。接下来,我将在其中添加一些定制查询处理。
例子:为你的WebPart添加排序功能
  毫无疑问我们可以在CoreResultsDataSourceView类中修改查询的方方面面。其中首要的是对AddSortOrder的覆写。该类可以提供对SharePointSearchRuntime类的访问,借助此类,可以得到:KeywordQueryObject,Location和RefinementManager。
  下面的样例代码在AddSortOrder覆写中添加了排序功能。


    public override void AddSortOrder(SharePointSearchRuntime runtime)
    {
        //确保我们的运行时已妥善实例化
        if (runtime.KeywordQueryObject == null)
        {
            return;
        }
        //删除任何可能存在的其他字段上的排序
        runtime.KeywordQueryObject.SortList.Clear();
        //获取该datasource以便得到该webpart并获取用户所选择的排序字段
        SearchResultsPart wp = this.DataSourceOwner.ParentWebpart as SearchResultsPart;
        string sortField = wp.SortFields;
        //检查是否已经提供了排序字段
        if (!string.IsNullOrEmpty(sortField))
        {
            //如果是页面提交则使用排序下拉框中的值
            if (wp.Page.IsPostBack)
            {
                //获得下拉框中所选的排序方向
                SortDirection dir =
                    (wp.Page.Request.Form[SearchResultsPart.mFormSortDirection] == "ASC" ?
                    SortDirection.Ascending : SortDirection.Descending);

                //配置该排序列表,添加排序字段和排序方向
                runtime.KeywordQueryObject.SortList.Add(wp.Page.Request.Form[SearchResultsPart.mFormSortField],
                    dir);
            }
            else
            {
                //以分隔符来拆分该值,并取出第一项按降序排列
                string[] values = sortField.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                runtime.KeywordQueryObject.SortList.Add(values[0], SortDirection.Descending);
            }
        }
        else  //如果没有提供排序字段则使用默认排序顺序
            base.AddSortOrder(runtime);  其中本例中使用了KeywordQueryObject类。该类提供了访问关键字查询属性的接口,比如:

EnableFQL

RowLimit

EnableNicknames

SearchTerms

EnablePhonetic

SelectProperties

EnableStemming

SortList

Filter

StartRow

QueryInfo

SummaryLength

QueryText

TrimDuplicates

Refiners

. . .
  
  为了在我们的webpart中改变排序顺序,首先需要删除默认的排序顺序。然后获取一个该webpart的引用,因为可以从中得到排序字段的属性值。如果页面posbback,则取到用户在当前页中选择的排序字段。否则,使用用户在配置webpart属性时选择的第一个排序字段。最后,将排序字段添加到SortList属性。
  为了可以排序,你还需要列出可供排序的字段。 DateTime类型的字段,Numeric类型的字段,以及HasMultipleValues=false,IsInDocProps=true,并且MaxCharactersInPropertyStoreIndex>0的Text类型的字段,都可以用于排序。
  你可以通过创建一个自定义webpart属性编辑器来限制用户只能从指定的字段中进行选择。这部分的代码和SharePoint 2007里一样:继承自EditorPart并实现IWebEditable接口。在附带的样例代码中,我们的EditorPart使用标准的LINQ方式访问搜索架构,来查找属性。
运行结果
  排序字段与排序方向选择:
DSC0001.png
  WebPart属性编辑,其中包括可排序字段的选择和附加的一个查询条件:
DSC0002.png
  完整源代码下载
  参考资料
  Customizing the SharePoint 2010 Search User Experience

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118135-1-1.html 上篇帖子: SharePoint 2010中的客户端AJAX应用——jQuery的整合与持久化 下篇帖子: [SharePoint 开发详解] 一个Feature中使用SPGridView的几个Tips
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表