探討上一篇文章中,關於索引的一些欄位的作用說明。
另外,說明怎麼建立一個欄位可以是Collection的內容。
同時大致說明Azure Search對於全文檢索中解析的方式。
上一篇文章中,提到我們設定的索引的時候會有一些設定要設定。如下:
- 可擷取(retrievable) => 允許被使用者看到的欄位。
- 可篩選(filterable) => 允許作為查詢條件的欄位,與【可搜尋】是不同的。
- 可排序(sortable) => 可以用來排序的欄位
- 可Facet(facetable) => 看完說明,我還是沒辦法掌握精髓(請看原文)
- 可搜尋(searchable) => 表示可進行全文檢索(擁有斷詞分析)的欄位,往往會是比較需要模糊搜尋的欄位。
今天在MSDN中有看到一篇比較完整的說明,大家可以對照的看(下圖擷取自MSDN)。
接著,解釋一下關於分析器(analzyer)。
若欄位型態為:Edm.String
或 Collection(Edm.String)
類型可以設定為可搜尋(searchable)
而這類欄位需要設定你要透過哪種分析器作為斷詞、 文字正規化和篩選出字詞等動作的技術基底。
目前分為兩種:
-
由 Lucene所支援的分析器 35。
-
由專屬的 Microsoft 自然語言處理技術,用於 Office 和 Bing 支援的分析器 50。
這兩種皆會把一整段文字拆解成很端小段落,並且運用自行的邏輯處理。
有些開發人員可能會偏好較熟悉、 簡單、 開放原始碼的 Lucene 解決方案。Lucene 分析器速度較快,但是 Microsoft 分析器擁有的進階功能,例如詞形還原、 word decompounding (以像德文、 丹麥文、 荷蘭文、 瑞典文、 挪威文、 愛沙尼亞文、 完成、 匈牙利文、 斯洛伐克文語言) 和實體辨識 (Url、 電子郵件、 日期、 數字)。可能的話,您應該執行比較來決定哪一種變得更符合 Microsoft 和 Lucene 分析器。(擷取自MSDN)
推薦各位看一段Channel9的影片:
最後,我們來說明一下一個比較特殊的欄位型態Collection(Edm.String) 。
這個欄位型態可以接受 JSON 陣列的字串會轉換為Collection的形式。
字串格式為:["red", "white", "blue"]
所以,首先我們先找出方法將欄位結果變成類似JSON的格式(Sql Server 2016支援 For JSON)。
已昨天的View改成:
SELECT
b.Name,
b.ID,
(
SELECT
COUNT(*)
FROM Product p
WHERE p.Brand = b.ID)
PCount,
(
SELECT
'[' + STUFF((
SELECT
',"' + p.Name + '"'
FROM Product p
WHERE p.Brand = b.ID
FOR XML PATH (''), TYPE)
.value('.', 'nvarchar(max)'), 1, 1, '') + ']')
AS TAry,
b.IsDelete,
b.ModifyDatetime
FROM Brand b
GO
另外,在匯入資料的時候,記得在欄位設定時,將TAry的型態選為Collection(Edm.string)。
這樣設定為,第一次建立索引子一定會失敗,錯誤訊息會像是:
The data field 'TAry' has an invalid value. The expected type was 'Collection(Edm.String)'.
透過Stackoverflow的詢問獲得了微軟Azure Search的團對成員的提示終於解決。卡了幾個小時才恍然大悟。
這個動作必須進行對應函數的動作,光靠Azure Search目前匯入資料的精靈並沒有這一個步驟(這就是我一直卡住的地方)。
Azure Search基本上所有動作都是透過Rest API 可以操作完成。
而這個最後一步我們也是要靠Rest API完成,這邊我透過POSTMAN來實做。
我們會需要幾個參數:
- 使用【Put】
- 網址:https://demoazure1222.search.windows.net/indexers/sews?api-version=2015-02-28-Preview
- dataSourceName:azuresql
- targetIndexName:testbrand2
- sourceFieldName:TAry
紅字部分都是參數,請自行修改。下圖列出部分參數來源,對照看就可以看出來。
先看若欄位僅是Edm.String非Collection的結果會是如下圖:
TAry的文字就是純字串。
接下來,我們透過PostMan來把欄位型態為Collection(Edm.String)的TAry做對應函示的動作。
注意幾個地方:
- Api Version:此功能目前是 API 2015-02-28-Preview才支援
- Header 需包含:Api Key 、Content-Type需為application/json
- Body 選擇row,按照剛剛上妙的參數等撰寫。
最後,我們看查詢結果。
如此TAry就變成Collection的型態了。
以上若有錯誤,歡迎大家一起交流。