【Azure】二探Azure 搜尋服務

探討上一篇文章中,關於索引的一些欄位的作用說明。

另外,說明怎麼建立一個欄位可以是Collection的內容。

同時大致說明Azure Search對於全文檢索中解析的方式。

上一篇文章中,提到我們設定的索引的時候會有一些設定要設定。如下:

  • 可擷取(retrievable) => 允許被使用者看到的欄位。
  • 可篩選(filterable) => 允許作為查詢條件的欄位,與【可搜尋】是不同的。
  • 可排序(sortable) => 可以用來排序的欄位
  • 可Facet(facetable) => 看完說明,我還是沒辦法掌握精髓(請看原文)
  • 可搜尋(searchable) => 表示可進行全文檢索(擁有斷詞分析)的欄位,往往會是比較需要模糊搜尋的欄位。

今天在MSDN中有看到一篇比較完整的說明,大家可以對照的看(下圖擷取自MSDN)。

接著,解釋一下關於分析器(analzyer)

若欄位型態為:Edm.StringCollection(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的型態了。

以上若有錯誤,歡迎大家一起交流。