【Azure】初試Azure 搜尋服務

搜尋是許多應用程式和其使用者之間的主要互動模式。一談到搜尋,使用者總寄予很高的期望。使用者期望能夠得到最好的關聯性、建議、幾近即時的回應、多語 言、面向等等。Azure 搜尋服務可讓您輕鬆地在網站或應用程式中加入功能強大且精確的搜尋功能。經過 16 年的開發,整合式 Microsoft 自然語言堆疊 (也用於 Bing 及 Office) 的功能變得更強。快速輕鬆地調整搜尋結果,並建構豐富、微調的評等模型,讓搜尋結果完全符合業務目標。可靠的輸送量和儲存體提供了快速搜尋索引功能和查 詢,以支援時間緊迫的搜尋案例。

(擷取自官網)

最近有功能要透過Azure Search做搜尋的功能。

這兩天看了不少相關文章、影片(微軟最近感覺在雲端上真的下了很大的功夫)。

理論上,龐大的資料量透過Azure Search 做搜尋,會比一般在DB裡面下Query速度差很多。

因為,Azure Search是透過另外的演算法&不同的索引來建立這樣一套服務。

這個月在上課的時候,有得到一組Azure Pass,發現還沒到期,所以,快速的體驗了一下。

以下案例採用Azure的DB,結合Azure Search(請用新的Protal)。

首先,我們要先建立Azure的DB,

選擇SQL 資料庫 按下新增。

伺服器管理員是未來作為登入的帳號&密碼。

位置:

  • 東南亞 => 新加坡
  • 東亞 => 香港(台灣連過去好像比較快)

設定完,按下建立就等一陣子就會通知建立完畢了。

假設今天要透過SSMS連結至Azure DB,點進DB以後,在設定可以取得伺服器名稱。

帳號密碼則是剛剛建立的資訊。

第一次透過SSMS應該會出現這錯誤,主要是說防火牆檔掉你的IP,不允許遠端登入。

回到網頁,進入DB以後,選擇左上方圈起來的地方,再選擇右方【設定你的防火牆】

用戶端IP會抓取你當下連網的IP,可以直接點選加入用戶端IP,就可以透過該IP,使用SSMS登入了。

設定完以後,我們先建立為用到的資料庫、Table、View、資料。

CREATE DATABASE [DemoAzureSearch]
GO

USE [DemoAzureSearch]
GO

CREATE TABLE dbo.Product
(
	ID INT IDENTITY,
	Name NVARCHAR(20) NOT NULL,
	Brand INT NOT NULL,
	IsDelete BIT NOT NULL DEFAULT(0),
	ModifyDatetime datetime not null default(getdate()),
	CONSTRAINT PK_Product_ID PRIMARY KEY (ID)
)
GO

CREATE TABLE dbo.Brand (
	ID INT IDENTITY,
	Name NVARCHAR(20) NOT NULL,
	IsDelete BIT NOT NULL DEFAULT (0),
	ModifyDatetime DATETIME NOT NULL DEFAULT (GETDATE()),
	CONSTRAINT PK_Brand_ID PRIMARY KEY (ID)
)
GO

CREATE VIEW dbo.vw_BrandInfo
AS

SELECT
	b.Name,
	b.ID,
	(
		SELECT
			COUNT(*)
		FROM Product p
		WHERE p.Brand = b.ID)
	PCount,
	b.IsDelete,
	b.ModifyDatetime
FROM Brand b

GO

INSERT INTO Brand (Name,
		IsDelete,
		ModifyDatetime)
	VALUES (N'愛敵打',
			DEFAULT,
			DEFAULT);

INSERT INTO Brand (Name,
		IsDelete,
		ModifyDatetime)
	VALUES (N'耐求',
			DEFAULT,
			DEFAULT);
			

INSERT INTO Product (Name,
		Brand,
		IsDelete,
		ModifyDatetime)
	VALUES (N'螺絲一代',
			1,
			DEFAULT,
			DEFAULT);

INSERT INTO Product (Name,
		Brand,
		IsDelete,
		ModifyDatetime)
	VALUES (N'當肯一代',
			1,
			DEFAULT,
			DEFAULT);
			
INSERT INTO Product (Name,
		Brand,
		IsDelete,
		ModifyDatetime)
	VALUES (N'橋單13',
			2,
			DEFAULT,
			DEFAULT);

建立完,我們再來處理Azure Search的部分。

Search 服務要透過瀏覽裡面才可以找到,點進去以後一樣選擇新增。

Url是未來呼叫搜尋服務的網址,按下建立以後要等約10分鐘吧!

點進去剛建立的服務,按下【匯入資料】,之後我們會按照1、2、3來設定。

步驟1選Azure SQL。

這邊的名稱,圖片編輯錯了,名稱代表的只是資料來源名稱。

這邊選擇剛剛我們新建立的DB,按下測試連結,成功以後才會有下圖。

這麼我們要選擇,我們這次要建立的索引,是針對Table或是View。

以我來說,我這次會面對到的是View(資料不只包含一張Table用View最方便)。

步驟2:系統會自動把剛剛選擇的View/Table中的欄位列出來。

  • 可擷取 => 代表可以被Select到的欄位
  • 可篩選 => 代表明確的比對,適用ID這種欄位
  • 可排序 => 可以用來排序的欄位
  • 可Facet => 這個尚未查明
  • 可搜尋 => 代表比較不明確的比對,適用Name這種欄位

這邊說明是我自己目前的理解,若有錯請告知,謝謝!

分析器 這邊目前理解的是,使用的欄位會做類似文章語句的分析。(尚未深入理解,待未來補充)

步驟3:有點像是資料更新的排程一些設定。

間隔(分鐘)=> 最小單位為每五中一次。

因為我們是透過View當資料來源,所以,我們必須有機制讓服務資料資料有異動。

  • 高水位線資料行 => 用來判斷資料是否有異動,所以,當資料異動時,若此欄位沒更新,搜尋服務也不會更新!
  • 追蹤刪除 => 預設搜尋不會處理刪除動作,只會更新或新增,勾選起來以後要設定以下兩欄位。
  • 虛刪除資料行 => 基本上就是軟刪除,透過一個欄位來判定資料是否被刪除。
  • 刪除標記值 => 這邊系統建議是使用bool 或是 數值,當資料的【虛刪除資料行】欄位的值為【刪除標記值】,此時會在搜尋服務中移除該筆資料。

上述動作執行完,在主頁就會發現資料來源變為1,同時有1索引子。

在搜尋總管功能,可以快速在網頁上看搜尋的結果。
搜尋是透過REST API來作用,可以在此網頁查詢相關查詢方法

除了我們剛剛設定的排程時間,也可以透過手動方式執行。

我們先更新DB:

--測試更新
UPDATE Brand set Name = N'耐求更新後',ModifyDatetime = GETUTCDATE() WHERE ID = 2
GO

之後點進去索引子以後,按下執行就會立刻執行更新索引。

再回去看,資料已經更新為:

同樣的,這次我們改成刪除:

--測試刪除
UPDATE Brand set Name = N'耐求更新後',ModifyDatetime = GETUTCDATE(),IsDelete = 1 WHERE ID = 2
GO

執行結果,就會發現少一筆。

很快速的,體驗了一輪,也分享給大家。

心得:

  • Azure 搜尋服務應該要先有情境設定。
  • 每個欄位設定的地方應該是最大重點。
  • 微軟又把複雜的部分讓我變成下一步的機器人。(一開始,我只看官方文件,裡面根本沒這樣簡單)
  • 微軟在雲端這塊,確實感受到積極的發展。