雖然對於信息工作者來說SharePoint 2010開箱即用的搜索界面已經非常直觀並易用,但作為超級用戶仍然可以創建屬於自己的搜索體驗。SharePoint Server 2010包括了許多與搜索相關的強大的Web部件,用於支持超級用戶定制搜索體驗,包括搜索最佳匹配,精簡面板,搜索核心結果,相關查詢等等。下圖為標准的搜索類WebPart。
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方式訪問搜索架構,來查找屬性。
運行結果
排序字段與排序方向選擇:
WebPart屬性編輯,其中包括可排序字段的選擇和附加的一個查詢條件:
本文配套源碼