SharePoint 2013 開發——搜尋架構及擴充套件

Justin-Liu發表於2015-08-07
部落格地址:http://blog.csdn.net/FoxDave

SharePoint 2013高度整合了搜尋引擎,在一個場中只有一個搜尋服務應用程式(SSA)。它整合了FAST,只有一個程式碼庫,不同的授權層次啟用不同的搜尋功能,但是有些功能在雲端是不可用的。

下圖從開發者的視角展示了搜尋架構,摘選自SharePoint高階程式設計。

圖中標記灰色的部分就是我們在開發過程中可以應用或擴充套件的部分。我們可以通過REST或CSOM API來對查詢模組進行定義和擴充套件;通過BCS來建立新的索引連線;藉助內容擴充Web服務(CEWS)API來擴充套件內容處理模組。

下面我們具體來看一下搜尋中可擴充套件的點。

介面UI:

●Web部件,主要體現在內容搜尋Web部件

●結果展示模板

●導航設定

查詢:

●查詢語法(KQL和FQL)

●查詢APIs(REST和CSOM)

●查詢規則

內容和後設資料:

●搜尋架構

●結果源

●業務資料連線(BCS)

●內容處理(CEWS)

相關性和語言學:

●排名屬性

●許可權

●術語集和字典

●語言學(如分詞演算法)

●分析

而我們常接觸到的開發場景並不是以上全部,一般常做的開發場景有如下幾個:

●修改終端使用者體驗,展示特定的資訊;

●為特定的產業、部門,甚至是話題和角色建立新的垂直搜尋應用程式;

●建立一個新的視覺化元素新增到標準的搜尋中;

●修改查詢和索引

●建立新的搜尋驅動的網站和應用程式

SharePoint 2013的搜尋相關的內容個人認為是比較高深的,需要花費大量的時間好好鑽研。

本篇的最後我們來一起學習一下如何使用Content Enrichment Web Service,參考一位外國友人的例子。

通過CEWS我們可以擴充套件SharePoint 2013的搜尋功能,將託管屬性的值傳送到外部的Web服務並返回新的或經過修改的託管屬性。這個過程包括實現一個自定義的WCF服務並使用PowerShell註冊它,通過PowerShell命令來指定哪些屬性進出該WCF服務。

本例中將採用Author和LastModifiedTime這兩個託管屬性,然後編寫一個新的字串如“Modified by <author> on <LastModifiedTime>.”到託管屬性TestProperty。

首先建立這個託管屬性TestProperty,型別為Text,屬性有Query、SSearch、Retrieve和Refine。進入到SharePoint的網站設定頁面,單擊網站集管理->搜尋架構,單擊新建託管屬性,填寫名稱為TestProperty,勾選查詢、搜尋、檢索和優化,單擊確定按鈕完成建立,如下圖所示。



接下來開啟Visual Studio 2013,建立一個WCF應用程式專案叫做ContentEnrichmentExampleService

隨專案預設建立的Service1.svc和IService1.cs沒有什麼用,我們直接刪除之。向專案中新增引用,瀏覽,導航到目錄C:\Program Files\Microsoft Office Servers\15.0\Search\Applications\External,新增microsoft.office.server.search.contentprocessingenrichment.dll。

下面我們需要建立一個服務來做內容擴充處理這件事,向專案中新增一個新建項WCF服務,取名做ContentEnrichmentExampleService.svc。本例中不需要IContentEnrichmentExampleService.cs,故將它刪除掉。現在我們可以開啟建立服務的後臺程式碼檔案新增我們自己的程式碼了,程式碼主要實現的功能為檢索輸入的屬性值,建立我們新的輸出屬性TestProperty併發回給搜尋索引。

在程式碼頭新增兩個using引用

using Microsoft.Office.Server.Search.ContentProcessingEnrichment;
using Microsoft.Office.Server.Search.ContentProcessingEnrichment.PropertyTypes;

將類的基類改為IContentProcessingEnrichmentService,新增一個ProcessedItem型別集合來儲存從服務輸出的託管屬性值。

然後實現ProcessItem方法,宣告我們建立的自定義屬性並根據傳入的值將TestProperty的值拼接出來,完整的程式碼如下所示:

public class ContentEnrichmentExampleService : IContentProcessingEnrichmentService
    {
        private readonly ProcessedItem processedItemHolder = new ProcessedItem
        {
            ItemProperties = new List<AbstractProperty>()
        };

        public ProcessedItem ProcessItem(Item item)
        {
            processedItemHolder.ErrorCode = 0;
            processedItemHolder.ItemProperties.Clear();

            //建立一個新的託管屬性作為返回值,該屬性必須通過PowerShell註冊為輸出屬性
            var testProperty = new Property<string>();
            testProperty.Name = "TestProperty";

            //需要通過PowerShell註冊為輸入屬性
            var authorProperty = item.ItemProperties.FirstOrDefault(i => i.Name == "Author") as Property<List<string>>;
            var writeProperty = item.ItemProperties.FirstOrDefault(i => i.Name == "LastModifiedTime") as Property<DateTime>;

            if ((authorProperty != null) && (writeProperty != null))
            {
                testProperty.Value = string.Format("Modified by {0} on {1}.", authorProperty.Value.First(), writeProperty.Value);
                processedItemHolder.ItemProperties.Add(testProperty);
            }
            else
            {
                testProperty.Value = "檢索托管屬性出錯。";
                processedItemHolder.ItemProperties.Add(testProperty);
            }

            return processedItemHolder;
        }
    }

接下來需要將這個服務註冊到SharePoint,使用PowerShell命令New-SPEnterpriseSearchContentEnrichmentConfiguration進行註冊,註冊完之後執行一下完全爬網。通過訪問http://server/_api/search/query?querytext='*'&selectproperties='title,path,author,testproperty'可以驗證我們上面的操作是不是都正確,如果正確將會返回屬性TestProperty的服務中定義的字串格式的值。

更多資訊


相關文章