原文地址 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 来获取存储结果集的table。Indexer已经被废弃了,所以我们要使用新的 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: SharePoint, Enterprise Search, SharePoint 2013