SharePoint 2013 Search Keyword Query Class

原文地址  SharePoint 2013 Search Keyword Query Class 本文由SPFarmer翻译

在过去旧版本的SharePoint中,我已经写过一些关于如何使用搜索的文章,在这些文章当中,如何使用 KeywordQuery是比较火的(2010 2007). 发扬这个传统,我很骄傲的发布如何使用KeywordQuery 类的SharePoint 2013版本. 好消息是,你以前的旧代码应该还可以工作,快消失是,这些就得类和方法都被标记为废弃了。事实上,我在大量的文档中挖掘了很久,想查找没有被废弃的正确的API。有一件事情让人非常迷惑,就是在Microsoft.Search.Query Microsoft.Office.Server.Search.Query和中都有一个类叫 KeywordQuery 为了减少迷惑性,Microsoft.Search.Query中的KeywordQuery 类被标记成废弃了。新的类在Microsoft.Office.Search.Query里面。  虽然微软在SharePoint 2010的名字里去掉了Office,但是在API里它还是活的好好的。

现在我们来说说,要在代码中执行搜索查询,我们需要做什么呢?今天这里的代码可以在场解决方案里运行,也可以在运行在SharePoint Server上的.NET 应用程序运行。我们今天会写一个命令行程序。如果你想在远程的机器上执行查询,那么你需要使用Search Client Object Model,在之前的文章里介绍过。新建一个应用程序,然后添加下面的引用。这些文件可以在15 hive里面的ISAPI 文件夹里找到:

  • Microsoft.Office.Server
  • Microsoft.Office.Server.Search
  • Microsoft.SharePoint
  • Microsoft.SharePoint.Security

然后我们需要下面的引用。这些引用提供了search, SharePoint以及后面查询完之后要用到的datatable 对象。

using System.Data;
using Microsoft.SharePoint;
using Microsoft.Office.Server.Search.Query;


一旦我们加好了这些,我们就可以开始了。有很多办法可以构建一个KeywordQuery 对象。简单的做法是,使用一个SPSite 对象,你也可以使用SPWeb对象,或者你可以使用代理技术,就像我在SharePoint 2010 里面使用的.。首先,我们获取一个SPSite 对象。

using (SPSite siteCollection = new SPSite("http://server/sitecollection"))

然后我们使用这个site collecion创建 KeywordQuery 对象

KeywordQuery keywordQuery = new KeywordQuery(siteCollection);

现在,我们使用QueryText属性来设置查询。这里是你可以使用自定义KQL查询的地方。文档组已经更新了这方面的文章,有很多好的建议在里面。我现在要搜索SharePoint这个关键字。

keywordQuery.QueryText= "SharePoint";

在之前,我们接下来会设置我们想要的 ResultsProvider  ResultTypes , 现在我们不再需要这么做了。事实上,这整个过程的代码量减少了。现在我们使用新的SearchExecutor 类。

SearchExecutor searchExecutor = new SearchExecutor();

然后我们把KeywordQuery  传递给他的ExecuteQuery 方法。

ResultTableCollection resultTableCollection =searchExecutor.ExecuteQuery(keywordQuery);

假设它正确的运行了,我们可以得到搜索结果。以前,我们使用一个索引(indexer)ResultTypes.ReleventResults 来获取存储结果集的tableIndexer已经被废弃了,所以我们要使用新的 Filter 方法。我是从indexer的废弃说明里找到的。第一个参数,是TableType 的值,是一个string类型的。由于前面的枚举也废弃了,我们现在使用 KnownTableTypes.RelevantResults.

var resultTables =resultTableCollection.Filter("TableType",KnownTableTypes.RelevantResults);

它返回  IEnumerable<ResultType>, 因此我们需要 filter 一下。我就用了  FirstOrDefault()  来获取我们需要的 table

var resultTable =resultTables.FirstOrDefault();

以前,我们不得不把数据加载到一个DataTable 里,这个过程会增加一些代码量。然后,现在不用了,因为有了新的Table 属性。

DataTable dataTable = resultTable.Table;

现在你有了一个DataTable, 你可以绑定到绑定或者查询它,你也可以VS里使用DataGridView把结果显示出来。


下面是整个的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using System.Data;
using Microsoft.SharePoint;
using Microsoft.Office.Server.Search.Query;
 
namespace SearchConsoleApplication1
{
    class Program
   {
        static void Main(string[] args)
       {
            using (SPSite siteCollection = newSPSite("http://server/sitecollection"))
           {
                KeywordQuery keywordQuery = new KeywordQuery(siteCollection);
               keywordQuery.QueryText = "SharePoint";
 
                SearchExecutor searchExecutor = new SearchExecutor();
                ResultTableCollection resultTableCollection =searchExecutor.ExecuteQuery(keywordQuery);
                var resultTables =resultTableCollection.Filter("TableType",KnownTableTypes.RelevantResults);
 
                var resultTable =resultTables.FirstOrDefault();
 
                DataTable dataTable = resultTable.Table;
           }
       }
   }
}

因此,如果你有很多基于搜索的代码,那么你需要升级一下。然而,我觉得这是一个简化代码的好机会。

Published Jan 03 2013, 11:42 AM by CoreyRoth

Filed under: SharePointEnterprise SearchSharePoint 2013

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值