在 SharePoint 2013 的自訂搜尋銷售報表中使用查詢規則、結果類型與顯示範本
英文原文已於 2012 年 7 月 24 日星期二發佈
(標準免責聲明:部落格格式太糟了。為了您眼睛的健康,請下載附件,裡面是此篇文章的 Word 文件檔。)
今天的主題標題可真是冗長,但是我們會介紹很多很棒的內容。SharePoint 2013 有許多傑出的功能,讓您可以有真正使用和自訂搜尋結果的空前體驗。在這篇文章中,我不會很廣泛地全面討論所有的功能,甚至也不會太詳細介紹我們正在使用的元件,因為這些內容會在其他地方介紹。不過,我會給您一組初步的搜尋結果,簡短地綜述各項功能,然後逐步解釋如何使用這些功能建立非常酷的自訂搜尋結果,為您示範如何這些功能的共同作業效能。
首先,我們先來看看我在伺服器陣列中執行「銷售報表」查詢所得到的搜尋結果 (注意:我使用的是 Beta 2 版本,在最終版看到的可能會有些許不同):
這是搜尋結果的原始體驗,看起來還不錯。不過,我們加入的這些功能,可真的幫您擴大使用者在 SharePoint 2013 的搜尋體驗,所以我們在案例中添加一些內容。我們公司分成好幾個部門,其中幾個負責管理自己部門的銷售。各部門使用標準 Excel 範本,每隔一段時間報告他們的銷售活動。此外,每個部門都有專人負責管理客戶關係以及報告銷售資訊。那麼,我們要如何利用 SharePoint 的這些功能來做到標準化,以及產生部門和客戶的重要資訊?我們要用多元的方法來解決這個問題。
自訂內容類型
首先,我們要為每個人建立自訂內容類型,把銷售報表上傳至 SharePoint。我先建立我等會兒會用到的網站欄 – 這些是我希望在我的搜尋銷售報表中看到的欄位。在此案例中,我已經定義了以下我們會用到的網站欄:
網站欄名稱 |
類型 |
客戶經理 |
單行文字 |
直屬員工 |
數字 |
銷售區域 |
選項:北美、EMEA (歐洲、中東和非洲)、亞洲 |
主要客戶 |
單行文字 |
客戶總數 |
數字 |
接著我建立了包含這些所有網站欄的內容類型。我是在與我的 Managed Metadata Service 關聯的發佈中樞網站建立這個內容類型,這樣它就會推播至伺服器陣列中所有我訂閱的網站,以我的例子來說,就是所有 Web 應用程式中的全部網站。
下一個步驟我以手動執行,就是把這個內容類型加入各部門網站集合的可用內容類型清單,位置在各部門儲存銷售報表 (和其他東西) 的文件庫。當然有一些方法可以自動執行,但是為了簡單起見,我選擇手動操作。好了,所以我們的第一步已經完成了 – 我們有自訂的內容類型、也完成部署,而且既然銷售報表已經加到文件庫,「客戶經理」就可以在上傳銷售報表和填寫中繼資料時識別銷售報表。
Managed 屬性
既然我們的網站已經有了這些銷售報表,我們需要從銷售報表自訂網站欄建立 Managed 屬性。以此案例的目的來看,這個步驟在 SharePoint 2013 和 SharePoint 2010 相比並沒有什麼新意 – 您需要進行完整編目來建立編目屬性,然後建立對應至那些編目屬性的 Managed 屬性,然後再進行另一個完整編目。我說在這個案例沒有什麼不同,是因為我們正在做的是整個伺服器陣列的解決方案。不過,SharePoint 2013 的確有一個極佳的功能,可讓網站集合管理員標記他們的網站集合或網站,或甚至是完整編目清單。當您在比較小的範圍執行時,這可為您省下執行全公司完整編目的功夫,這真是太棒了。我會試著在別篇文章介紹這個功能 – 我只是想點出有這樣的功能,只不過不適用於這個案例,因為我們的解決方案範圍是整個伺服器陣列。
查詢規則
到了這一步,我們有使用自訂內容類型的銷售報表,那些銷售報表中的中繼資料值也已填入 Managed 屬性。下一步我們要做的,就是確認當有人的搜尋應該包含這些銷售報表時,這些項目能受到注意。對此,SharePoint 2013 推出一項完美的功能,稱為「查詢規則」。查詢規則有三項主要元件:
- 條件 – 查詢規則的條件決定規則啟動的時機。您在使用這些規則時,可以搭配許多不同的變化。這裡只是快速的瀏覽,但使用它們的可能性是千變萬化,事實上,其中有些在出廠時就已設定。另一個很有趣的轉折 – 如果您希望查詢規則啟動所有的搜尋結果,那您就不要設定任何條件。當然您也可以反過來做,設定好幾個條件。或許您可以很快地看看您會不會迷失在這大量的可能性中。您可用於查詢規則的條件包括:
- 以特定單字或片語開頭或結尾的查詢
- 包含動作字眼的查詢 (您定義的字多半會是動詞,例如「下載」等)
- 包含管理的中繼資料字詞組裡的單字的查詢 (您可以用這個條件做很酷的事情)
- 在其他結果來源出現過的查詢,例如影片結果、文件結果等 – 這可以是任何內容,因為結果來源是由您定義和建立
- 結果要包含頻繁點擊的結果類型,例如討論、Excel 試算表等
- 進階規則,在這您會被規則運算式搞瘋,將查詢拆成動詞部分和主詞部分 (動詞部分後面的就不要了) 等
- 動作 – 這是指符合您的查詢規則條件後,您要執行的動作。在這裡,您同樣有三個選擇;您可以:
- 新增升級的結果 – 這個的運作方式就和 SharePoint 2010 的 [首選] 還有 SharePoint 2010 快速搜尋的 [視覺化首選] 相似。您可以新增一個新的連結,讓它顯示在所有搜尋結果的最上方。您可以選擇讓連結以超連結的方式顯示,或是以圖片方式 – 如此一來就和 [視覺化首選] 很類似。
- 新增結果區塊 – 結果區塊是指您另外執行一個查詢,傳回的產生結果會加上原本的搜尋結果。之所以稱為區塊,是因為產生的結果都在集中在一個區塊中。您可以讓區塊顯示在所有搜尋結果的最上方,或者您也可以讓它和其他搜尋結果混合依據順位排列。有一點必須記得,這並不表示是在兩個查詢做相關程度排名。它只是表示這整個區塊會和其他所有本機搜尋結果一起進行排名。如果您點了結果區塊中的任何一個項目,本機會記錄這個點選動作,而這整個區塊的相關程度會變高。所以,如果區塊中的項目有很多點擊次數,那麼時間一久區塊在結果中的順位會開始往前,因為它的相關程度會高於較少被選擇的個別結果。事實上,設定結果區塊的方法說也說不完,但我之前講過了,此時此刻我不打算深入討論這一點。
- 變更查詢以改變排名結果 – 這個選項相當囉嗦,它的功能就如字面所示。您可以實際進入,以任何您想要的方式變更被要求的查詢。您可以增加準則、移除字詞、也可以用 XRANK 來修改排名 – 這裡的選擇還滿多樣的。
- 發佈 – 發佈讓您可以控制是否使用以及何時使用查詢規則。例如,您想要建立一套規則,讓它們在感恩節特賣後的隔天啟動。但是,您不要它們在那一天真正到來之前啟動。因此,您可以建立規則,但是設定發佈,這樣規則便不會作用。或者您可以讓規則作用,但是設定它在特定日期之後才開始作用,然後在更晚的日期結束。
好了,以上就是查詢規則的「簡短」介紹,那我們要怎麼運用它們呢?嗯,其實原廠設定的查詢規則就可以幫我們搞定一切。實際上,我在擷取以上螢幕擷取畫面時,停用了這個規則,這樣您才會更了解它的影響。在我們這個例子中,我們要的是可以看到銷售報表的查詢,好讓我們部門的銷售報表跳出得到注意。所以,請到 [搜尋] 網站集合,[網站設定],按一下 [查詢規則] 連結。在 [選取來源] 下拉清單中按一下,選取 [本機報表] 和 [資料結果];您會看到一個叫做 [報表與資料] 的查詢規則。按一下它,從下拉式功能表選取 [檢視],查看規則建構方式。它的運作方式如下:
- 條件 – 這個規則的條件是,查詢的開始或結尾有以下任何一個單字:analysis;cube;dashboard;dashboards;data;database;report;reports;sales。請注意,這裡您看到 reports 和 sales。所以,如果有人搜尋 sales report,那麼這個查詢規則就會執行。這聽起來很完美 – 如果有人搜尋 sales report,我們的確希望他們看到我們部門的銷售報表。這個規則會把相符的部分指派為動詞部分,其他的就指派為主詞部分。在這個例子中,reports 被指派為動詞部分,而 sales 是主詞部分。
- 動作 – 這個規則的動作就是只根據主詞部分執行另一個查詢。所以根據上面的條件,它只會為 sales 執行個別查詢。它會新增一個區塊,排名永遠在其他結果之前。但是…它只會在 [本機報表] 和 [資料結果] 來源中搜尋 sales。這也是原廠設定的結果來源,而且很有效率的只會傳回 Excel 文件 (副檔名結尾為 .XLSX、XLS 等)。太棒了,所以這個查詢只會針對 Excel 文件執行 sales 查詢。
- 發佈 – 這個規則沒有限制開始日期或結束日期,所以它一律都會啟動。
我重新啟用了那個查詢規則,所以現在我查詢銷售報表的結果看起來是這樣:
酷,一切都漸入佳境 – 查詢規則已經啟用,現在根據我們的自訂銷售報表內容類型,我們的文件也顯示在結果的最上方 – 真是太棒了!不過,我們還是沒有顯示任何文件的中繼資料,而那正是這一切發生的關鍵。
顯示範本
如果您想要在 SharePoint 2010 以不同的方式產生某個特定項目,這會是個艱難的過程,您得進到核心結果網頁組件修改一大區塊的 XSLT。您要好好練習您那驚人的 XSLT 技能,還要試著在無數的文件當中找到對的地方插入您自訂的程式碼。整體來說,這真是個讓人開心不起來的體驗。
到了 SharePoint 2013 – 請下音樂 – 我們有顯示範本,這真是不得了的進步。您再也不用隨身帶著您的 XSLT Zen 了,現在您可以建立自訂的顯示程式碼做為純 HTML – 這真是太棒了!事實上,為了這篇文章,我還真的用 Adobe 的 Dreamweaver CS6 建立了我自訂顯示範本的「程式碼」。那麼,顯示範本是怎麼運作的呢?
要使用顯示範本,有幾個不同的東西要追蹤:
- Managed 屬性 – 在查詢時,您必須告訴它您需要擷取的 Managed 屬性。之後您可以在您的 HTML 使用那些屬性,稍後我會告訴您使用的方法。
- 外部 JS 與 CSS – 如果您想要在您的顯示範本中使用任何 Javascript 或 CSS 檔,那您可以將它們移到外部並加入至顯示範本。
- 內嵌 JS – 您也可以在顯示範本中使用內嵌 JS。您只需要確保它的位置是在顯示範本的第一個 <div> 之下 – 在那之下還有其他項目。
- HTML – 這是您實際建立顯示範本 HTML 的位置,範本會產出結果。
在我們的顯示範本,我們會從我們建立的自訂銷售報表內容類型中匯集屬性,如此一來它會像這樣顯示在搜尋結果中:
那我們開始吧 – 首先,在您建立新的顯示範本時,您可能會一直很想從現有的顯示範本開始。您可以前往搜尋中心網站集合的 [網站設定],按一下 [主版] 頁面和版面配置連結。進入程式庫後,按一下 [顯示範本] 資料夾,然後按一下 [搜尋] 資料夾。在那裡您會看到所有內建的顯示範本。您可能會看到很多名稱相同的檔案,尾碼不是 .html 就是 .js。您只需要關心 .html 檔 – .js 檔會在您上傳 .html 檔時自動產生。在這個例子中,既然顯示範本是用於 Excel 檔案,那我就從 Item_Excel.htm 檔開始。我在本機下載一份複本,將它重新命名為 SalesReport.html,然後在 Dreamweaver 中開啟。
接著我加入我的 Managed 屬性。有一個叫做 mso:ManagedPropertyMapping 的標記,把它放在顯示範本要求的 Managed 屬性。我把我的加在清單的最後,用的格式和其他 Managed 屬性一樣 – 它看起來是像這樣:
<mso:ManagedPropertyMapping msdt:dt="string">'Title':'Title', 'Author':'Author', 'Size':'Size', 'Path':'Path', 'Description':'Description', 'LastModifiedTime':'LastModifiedTime', 'CollapsingStatus':'CollapsingStatus', 'DocId':'DocId', 'HitHighlightedSummary':'HitHighlightedSummary', 'HitHighlightedProperties':'HitHighlightedProperties', 'FileExtension':'FileExtension', 'ViewsLifeTime':'ViewsLifeTime', 'ParentLink':'ParentLink', 'ViewsRecent':'ViewsRecent', 'FileType':'FileType', 'IsContainer':'IsContainer', 'ServerRedirectedURL':'ServerRedirectedURL', 'ServerRedirectedEmbedURL':'ServerRedirectedEmbedURL', 'ServerRedirectedPreviewURL':'ServerRedirectedPreviewURL', 'AccountManager':'AccountManager', 'SalesRegion':'SalesRegion', 'TotalAccounts':'TotalAccounts', 'TopAccounts':'TopAccounts', 'DirectReports':'DirectReports', 'ContentType':'ContentType'</mso:ManagedPropertyMapping>
就像您看到的,我加入了 AccountManager、 SalesRegion 等屬性 – 所有我為自訂內容類型建立的屬性。在那之後,我往下拉到這個地方:
<div id="_#= $htmlEncode(itemId) =#_" name="Item" data-displaytemplate="ExcelItem" class="ms-srch-item" onmouseover="_#= ctx.CurrentItem.csr_ShowHoverPanelCallback =#_" onmouseout="_#= ctx.CurrentItem.csr_HideHoverPanelCallback =#_">
_#=ctx.RenderBody(ctx)=#_
<div id="_#= $htmlEncode(hoverId) =#_" class="ms-srch-hover-outerContainer"></div>
</div>
然後我刪除了在外部 DIV 標記之間的所有東西 (也就是我在上面以紅色標出的部分)。現在我可以開始寫 HTML。在這之前,有三件事在您開始前您應該要知道:
- 把 <style> 標記留在顯示範本的 <head> 區段,對您來說應該是最簡單的。但等到顯示範本產生後,那些樣式標記會被捨棄,至於原因我現在先不說明,所以您最終還是得複製樣式標記,把它們另存在 CSS 檔。不過,在您實際建立 HTML 時,您可以使用和修改您的樣式標記,確定它們能反映出您想要給顯示範本的外觀與風格。
- 我前面說過,您可以加入我所說的內嵌 Javascript,這真正的意思是,只要加入的位置正確,您可以加入 Javascript 程式碼。所謂正確的顯示範本位置就是它必須放在顯示範本中第一個 DIV 標記之後。此外,它必須在標記集合的開始和結束之間,像是這樣:<!--#_ and _#-->。後面我會更詳細地解釋自訂標記,現在您只要知道如果不把 Javascript 放在標記之間它會無法執行就夠了。不過關於這點有一件非常酷的事情,建立輸出的 HTML 時,您可以使用您在內嵌 Javascript 定義的變數。我會在下個項目進一步解釋。
- 要從任何您建立的內嵌 Javascript 發出 Managed 屬性或變數,他們必須要被包在標記集合的開始和結束之間,像是這樣:_#= and =#_。Managed 屬性都是在一個叫做 ctx.CurrentItem 的物件裡的變數。例如,要發出 AccountManager Managed 屬性,我會新增這個標記:_#= ctx.CurrentItem.AccountManager =#_。如果我的 Javascript 看起來像這樣:var foo = “The current Account Manager is “ + ctx.CurrentItem.AccountManager + “.”;,那麼如果要發出 “foo”,我會新增這個標記:_#= foo =#_。這讓您有彈性能夠新增或處理資料,為您的顯示範本工作。
好,現在您了解了建立 HTML 的機制,以下是我用來建立我上面所展示的顯示範本的內容;我在 head 標記加入了這些樣式屬性:
<style>
.ReportDiv
{
float:left;
}
.ReportText
{
font-family: Verdana, Geneva, sans-serif;
font-size: 12px;
}
.ReportHeading
{
font-weight: bold;
}
.LogoImg
{
margin-top: 15px;
width: 118px;
height: 101px;
}
.MasterDiv
{
float:left;
height: 215px;
width: 342px;
background-repeat: no-repeat;
background-image: url(https://sps/sites/search/PublishingImages/SalesReportBackground.PNG);
padding: 15px;
}
.DetailsContainer
{
background-color:#CCC;
}
</style>
這裡只有一點值得注意,我在客戶經理詳細資料中用的背景圖片,是我已經上傳到網站的圖片;其他內容不用解釋應該都能明白。同樣地,把樣式標記放在 <head> 區段,我在 Dreamweaver 設計時,就可以清楚看到版面的樣子。
接下來,我們來看看用來建立顯示範本的 HTML:
<div>
<div class="ReportDiv">
<img class="LogoImg" src="https://sps/sites/search/PublishingImages/SalesReportLogo.PNG" />
</div>
<div class="MasterDiv">
<!-- Title and link to item -->
<a href="_#= ctx.CurrentItem.Path =#_" class="ReportText">_#= ctx.CurrentItem.Title =#_</a>
<br/><br/>
<!-- Account Manager -->
<span class="ReportHeading ReportText">
Account Manager:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.AccountManager =#_
</span><br/>
<!-- Sales Region -->
<span class="ReportHeading ReportText">
Sales Region:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.SalesRegion =#_
</span><br/>
<!-- Total Accounts -->
<span class="ReportHeading ReportText">
Total Accounts:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.TotalAccounts =#_
</span><br/>
<!-- Top Accounts -->
<span class="ReportHeading ReportText">
Top Accounts:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.TopAccounts =#_
</span><br/>
<!-- Direct Reports -->
<span class="ReportHeading ReportText">
Direct Reports:
</span>
<span class="ReportText">
_#= ctx.CurrentItem.DirectReports =#_
</span><br/>
<!-- Hit Highlighted Text -->
<br/>
<span class="ReportHeading ReportText">
Details:
</span>
<br/>
<span class="DetailsContainer ReportText">
_#= Srch.U.processHHXML(ctx.CurrentItem.HitHighlightedSummary) =#_
</span>
</div>
</div>
我先不講這個內容的格式設定功能,只把重點放在資料。您可以看到我利用 _#= and =#_ 標記,從頭到尾放進 Managed 屬性的位置。您會發現它完全是 Token 的替代品,所以我甚至可以直接把它用在上面的 <a> href 屬性 (和 XSLT 的做法恰好相反,XSLT 牽涉的層面較廣)。其他欄位會被塞進適當的 DIV 或 SPAN 標記,以便進行格式設定。這裡一個比較特殊的例子是 HitHighlightedSummary,它用的是搜尋的內建處理元件。我現在沒有元件和方法以及它們功能的完整清單,但我加入這個元件只是因為如果您不用它,您的摘要就不會有相符結果醒目提示。所以,為了這個目的,請確認您有使用這個方法。
現在一切都就緒了,我還要再對我的標記做一個處理。我複製所有在 <style> 標記之間的內容,把它們存在新的 CSS 文件,命名為 SalesReport.css。在我的主版頁面圖庫,我在 /Display Templates/Search 資料夾另外建立了一個叫做樣式的資料夾。我把 SalesReport.css 檔案上傳到那個目錄。現在我要把它用在我的顯示範本,我必須新增一個指令碼標記。它應該位在 <body> 標記之下,第一個 <div> 標記之上。我用一個叫做 $includeCSS 的 SharePoint Javascript 函數來為顯示範本拉入我的 CSS 檔。所以我的起始標記看起來是像這樣:
<body>
<script>
$includeCSS(this.url, "./styles/SalesReport.css");
</script>
<div id="Item_SalesReport">
好了,所以程式碼我們都看完了,但是我們要怎麼使用我們的自訂顯示範本呢?
結果類型
結果類型是您根據一套規則啟用顯示範本的方式。要使用規則很簡單 – 您可以讓它們為某個預先定義的內容類型啟動,像是電子郵件、PDF、Word 文件、SharePoint Wiki 等。除此之外,您也可以讓它們只用於特定結果來源的查詢。最後,您也可以選擇任何 Managed 屬性和任何一般比較一起做為規則的準則。例如,您可以讓結果類型規則只在 AccountManager 欄位中包含 “Vice President” 時才啟動,這樣您搜尋 VP 時就會用到不同的顯示類型。以我們的例子來說,我們希望我們的結果類型只有在內容類型等於 “Sales Report” 時才啟動。所以我們為結果類型增加一個條件,也就是 ContentType 等於 “Sales Report”。
如您所見,我們甚至可以在相符結果加入幾個值。我們也可以加入幾個屬性,同時使用幾個 AND。在這個情境中,我們只需要 ContentType。定義條件之後,我們可以設定規則的動作。對於結果類型,動作只是一個包含所有可用顯示範本的下拉清單。我只需要從下拉清單挑選我的 [銷售報表] 顯示範本,按一下 [儲存] 按鈕,就可以建立我的結果類型。同樣地,如果您不確定如何建立結果類型,不妨看看所有 SharePoint 內建的結果類型。看看現有的結果類型,您對新建結果類型會有更多好的想法。
全部整合在一起
現在我們一切都準備妥當了 – 一個能擷取我們想要的中繼資料的自訂內容類型、一些能擷取內容類型並把它放置於索引的 Managed 屬性、一個能在有人查詢「銷售報表」時,確保我們的銷售報表內容會出現在清單頂端的查詢規則、一個能以獨特、實用、絕對不同於一般搜尋結果的格式來展示我們擷取的中繼資料的自訂顯示範本、還有一個能確保在搜尋結果傳回我們的自訂內容類型時,會使用我們的顯示範本的結果類型。現在完成後的最終成果就像這樣:
以上就是 SharePoint 2013 呈現搜尋結果一些很酷的功能介紹。希望您有感受到這些功能的魅力,用許多有用又有趣的方式來使用它們。
這是翻譯後的部落格文章。英文原文請參閱 Using Query Rules, Result Types and Display Templates for a Custom Search Sales Report in SharePoint 2013