IT技術互動交流平臺

SharePoint2013SearchKeywordQueryClass

發布日期:2015-03-16 19:47:44

原文地址 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

延伸閱讀:

  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
江西11选5 速发彩票开户 投票网赚 内蒙古快3 有哪些靠谱的网赚平台 甘肃快3 北京快3 什么是网赚竞技 什么都不会怎么网赚 网赚论坛靠谱吗