您的位置:首页 > 产品设计 > UI/UE

SharePoint 2013 Search Keyword Query Class

2015-03-16 15:07 218 查看
原文地址
SharePoint 2013 Search Keyword Query Class 本文由SPFarmer翻译
在过去旧版本的SharePoint中,我已经写过一些关于如何使用搜索的文章,在这些文章当中,如何使用 KeywordQuery类是比较火的(20102007). 发扬这个传统,我很骄傲的发布如何使用KeywordQuery
类的SharePoint 2013版本.
好消息是,你以前的旧代码应该还可以工作,快消失是,这些就得类和方法都被标记为废弃了。事实上,我在大量的文档中挖掘了很久,想查找没有被废弃的正确的API。有一件事情让人非常迷惑,就是在Microsoft.Search.QueryMicrosoft.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: