教學課程:使用 .NET SDK 為 Azure SQL 資料編製索引
設定索引子,以從 Azure SQL Database 中擷取可搜尋的資料,並將其傳送至 Azure AI 搜尋服務中的搜尋索引。
本教學課程將使用 C# 和適用於 .NET 的 Azure SDK 執行下列工作:
- 建立會連線到 Azure SQL Database 的資料來源
- 建立索引子
- 執行索引子以將資料載入至索引
- 以驗證步驟的形式查詢索引
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
必要條件
- Azure SQL Database 使用 SQL Server 驗證
- Visual Studio
- Azure AI 搜尋服務 (部分機器翻譯) 建立或尋找現有的搜尋服務
注意
您可以使用免費搜尋服務來進行本教學課程。 免費層的限制為三個索引、三個索引子、以及三個資料來源。 本教學課程會各建立一個。 開始之前,請確定您的服務有空間可接受新的資源。
下載檔案
本教學課程的原始程式碼位於 Azure-Samples/search-dotnet-getting-started GitHub 存放庫中的 DotNetHowToIndexer 資料夾內。
1 - 建立服務
本教學課程將使用 Azure AI 搜尋服務進行索引編製和查詢,並以 Azure SQL Database 作為外部資料來源。 為具備鄰近性和管理方面的優勢,如果可能,請將這兩項服務建立在相同的區域和資源群組中。 在實務上,Azure SQL Database 可以位於任何區域中。
從 Azure SQL Database 開始著手
此教學課程在範例下載中提供 hotels.sql 檔案用於填入資料庫。 Azure AI 搜尋服務會取用扁平化資料列集,例如從檢視或查詢產生的資料列集。 範例方案中的 SQL 檔案會建立並填入單一資料表。
如果您有現有的 Azure SQL Database 資源,您可以在其中新增 hotels 資料表 (在開啟查詢步驟開始)。
建立 Azure SQL 資料庫,請參閱快速入門:建立單一資料庫中的指示。
資料庫的伺服器組態很重要。
選擇 SQL Server 驗證選項,該選項會提示您指定使用者名稱和密碼。 您需要提供此資訊,索引子才能使用 ADO.NET 連接字串。
選擇公用連線。 這可讓本教學課程更容易完成。 生產環境中不建議使用公用連線,建議您在教學課程結束時刪除此資源。
在 Azure 入口網站中,移至您的新資源。
新增防火牆規則以允許來自您用戶端的存取,請參閱快速入門:在 Azure 入口網站中建立伺服器層級的防火牆規則中的指示。 您可以在命令提示字元執行
ipconfig
以取得您的 IP 位址。使用查詢編輯器以載入範例資料。 在瀏覽窗格中,按一下 [查詢編輯器 (預覽)],然後輸入伺服器管理員的使用者名稱和密碼。
如果您遇到存取遭拒錯誤,請複製錯誤訊息的用戶端 IP 位址、開啟該伺服器的網路安全性頁面,並新增允許來自您用戶端存取的輸入規則。
在查詢編輯器中,選取 [開啟查詢],然後瀏覽至本機電腦上「hotels.sql」檔案所在的位置。
選取該檔案並選取 [開啟]。 指令碼應該會看起來如下列螢幕擷取畫面所示:
選取 [執行] 以執行查詢。 在 [結果] 窗格中,您應會看到查詢成功訊息 (三個資料列)。
若要從這個資料表傳回資料列集,您可以執行下列查詢作為驗證步驟:
SELECT * FROM Hotels
複製資料庫的 ADO.NET 連接字串。 在 [設定]>[連接字串] 底下,複製 ADO.NET 連接字串,如下列範例所示。
Server=tcp:<YOUR-DATABASE-NAME>.database.windows.net,1433;Initial Catalog=hotels-db;Persist Security Info=False;User ID=<YOUR-USER-NAME>;Password=<YOUR-PASSWORD>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
在下一個練習中,您需要此連接字串來設定您的環境。
Azure AI 搜尋服務
下一個元件是 Azure AI 搜尋服務,您可以在入口網站中建立該服務。 您可以使用免費層來完成此逐步解說。
取得 Azure AI 搜尋服務的管理員 API 金鑰和 URL
API 呼叫需要用到服務 URL 和存取金鑰。 搜尋服務是同時建立,因此如果您將 Azure AI 搜尋服務新增至您的訂用帳戶,請遵循下列步驟來取得必要的資訊:
登入 Azure 入口網站,並在搜尋服務的 [概觀] 頁面上取得 URL。 範例端點看起來會像是
https://mydemo.search.windows.net
。在 [設定]> [金鑰] 中,取得服務上完整權限的管理金鑰。 可互換的管理金鑰有兩個,可在您需要變換金鑰時提供商務持續性。 您可以在新增、修改及刪除物件的要求上使用主要或次要金鑰。
2 - 設定您的環境
啟動 Visual Studio 並開啟 DotNetHowToIndexers.sln。
在方案總管中開啟 appsettings.json,以提供連線資訊。
針對
SearchServiceEndPoint
,如果服務概觀頁面上的完整 URL 為 "https://my-demo-service.search.windows.net",則要提供的值就是整個 URL。AzureSqlConnectionString
的字串格式如下所示:"Server=tcp:<your-database-name>.database.windows.net,1433;Initial Catalog=hotels-db;Persist Security Info=False;User ID=<your-user-name>;Password=<your-password>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
{ "SearchServiceEndPoint": "<placeholder-search-full-url>", "SearchServiceAdminApiKey": "<placeholder-admin-key-for-search-service>", "AzureSqlConnectionString": "<placeholder-ADO.NET-connection-string", }
將 SQL 連接字串中的使用者密碼取代為有效密碼。 雖然資料庫和使用者名稱會複製過去,但密碼必須手動輸入。
3 - 建立管線
索引子需要資料來源物件和索引。 相關程式碼位於兩個檔案中:
hotel.cs,內含可定義索引的結構描述
Program.cs,內含用於建立和管理您服務中結構的函式
在 hotel.cs 中
索引結構描述會定義欄位集合,包括用於指定允許作業的屬性,例如欄位是否可全文檢索搜尋、可篩選,或可排序 (如 HotelName 的下列欄位定義中所示)。 SearchableField 根據定義可以進行全文搜尋。 其他屬性會明確指派。
. . .
[SearchableField(IsFilterable = true, IsSortable = true)]
[JsonPropertyName("hotelName")]
public string HotelName { get; set; }
. . .
結構描述也可以包含其他元素,包括提高搜尋分數、自訂分析城市和其他建構的評分設定檔。 不過,基於我們的目的,結構描述並未嚴密定義,只包含在範例資料集中找到的欄位。
在 Program.cs 中
主要程式包含用於建立索引子用戶端、索引、資料來源和索引子的邏輯。 在您可能會執行此程式多次的假設之下,此程式碼會檢查並刪除現有的同名資源。
資料來源物件上會配置專屬於 Azure SQL Database 資源的設定,包括部份或增量索引編製,以使用 Azure SQL 的內建變更偵測功能。 在 Azure SQL 中,來源示範用的飯店資料庫具有名為 IsDeleted 的「虛刪除」資料行。 當此資料行在資料庫中設定為 true 時,索引子就會從 Azure AI 搜尋服務索引中移除對應文件。
Console.WriteLine("Creating data source...");
var dataSource =
new SearchIndexerDataSourceConnection(
"hotels-sql-ds",
SearchIndexerDataSourceType.AzureSql,
configuration["AzureSQLConnectionString"],
new SearchIndexerDataContainer("hotels"));
indexerClient.CreateOrUpdateDataSourceConnection(dataSource);
索引子物件可跨平台使用,不論來源為何,其中的設定、排程和引動過程都相同。 此索引子範例包括排程及用於清除索引子記錄的重設選項,並且會呼叫方法來立即建立並執行索引子。 若要建立或更新索引子,請使用 CreateOrUpdateIndexerAsync。
Console.WriteLine("Creating Azure SQL indexer...");
var schedule = new IndexingSchedule(TimeSpan.FromDays(1))
{
StartTime = DateTimeOffset.Now
};
var parameters = new IndexingParameters()
{
BatchSize = 100,
MaxFailedItems = 0,
MaxFailedItemsPerBatch = 0
};
// Indexer declarations require a data source and search index.
// Common optional properties include a schedule, parameters, and field mappings
// The field mappings below are redundant due to how the Hotel class is defined, but
// we included them anyway to show the syntax
var indexer = new SearchIndexer("hotels-sql-idxr", dataSource.Name, searchIndex.Name)
{
Description = "Data indexer",
Schedule = schedule,
Parameters = parameters,
FieldMappings =
{
new FieldMapping("_id") {TargetFieldName = "HotelId"},
new FieldMapping("Amenities") {TargetFieldName = "Tags"}
}
};
await indexerClient.CreateOrUpdateIndexerAsync(indexer);
索引子執行通常已排程,但在開發期間,您可以使用 RunIndexerAsync 立即執行索引子。
Console.WriteLine("Running Azure SQL indexer...");
try
{
await indexerClient.RunIndexerAsync(indexer.Name);
}
catch (RequestFailedException ex) when (ex.Status == 429)
{
Console.WriteLine("Failed to run indexer: {0}", ex.Message);
}
4 - 建置解決方案
按 F5 以建置及執行方案。 此程式會在偵錯模式中執行。 主控台視窗會報告每項作業的狀態。
您的程式碼會在 Visual Studio 本機執行,並連線到您在 Azure 上的搜尋服務,搜尋服務再連線到 Azure SQL Database 並擷取資料集。 由於要進行的作業很多,所以會有數個潛在的失敗點。 如果您收到錯誤,請先檢查下列條件:
您需要提供的搜尋服務連線資訊為完整 URL。 如果您僅輸入服務名稱,作業會在索引建立時停止,出現連線失敗錯誤。
appsettings.json 中的資料庫連線資訊。 它應該是從入口網站取得的 ADO.NET 連接字串,已修改成包含您的資料庫適用的使用者名稱和密碼。 使用者帳戶必須具有擷取資料的權限。 您的本機用戶端 IP 位址必須獲允許透過防火牆的傳入存取。
資源限制。 回想一下,免費層有三個索引、索引子和資料來源的限制。 最大限制的服務無法建立新的物件。
5 - 搜尋
使用 Azure 入口網站來確認物件的建立,然後使用搜尋總管來查詢索引。
登入 Azure 入口網站,然後在搜尋服務的左側瀏覽窗格中,依序開啟每個頁面以確認物件已完成建立。 [索引]、[索引子] 和 [資料來源] 分別會有 "hotels-sql-idx"、"hotels-sql-indexer" 和 "hotels-sql-ds"。
在 [索引子] 索引標籤上,選取 hotels-sql-idx 索引。 在 [hotels] 頁面上,第一個索引標籤是 [搜尋總管]。
選取 [搜尋] 以發出空白查詢。
您的索引中的三個項目會以 JSON 文件形式傳回。 搜尋總管會以 JSON 傳回文件,以便您檢視整個結構。
接著,切換至 [JSON 檢視],以便輸入查詢參數:
{ "search": "river", "count": true }
此查詢會叫用
river
字詞的全文檢索搜尋,而結果會包含相符文件的計數。 在測試包含數千甚至數百萬份文件的大型索引案例時,傳回相符文件的計數很實用。 在此情況下,只有一份文件符合查詢。最後,輸入參數將搜尋結果限制為感興趣的欄位:
{ "search": "river", "select": "hotelId, hotelName, baseRate, description", "count": true }
查詢回應會縮減為選取的欄位,導致更簡潔的輸出。
重設並重新執行
在開發的早期實驗階段中,若要設計反覆項目,最實用的方法是從 Azure AI 搜尋服務中刪除物件,並讓您的程式碼重建這些物件。 資源名稱是唯一的。 刪除物件可讓您使用相同的名稱加以重新建立。
本教學課程的範例程式碼會檢查是否有現有的物件,並將其刪除,以便您重新執行程式碼。
您也可以使用入口網站來刪除索引、索引子和資料來源。
清除資源
如果您使用自己的訂用帳戶,當專案結束時,建議您移除不再需要的資源。 資源若繼續執行,將需付費。 您可以個別刪除資源,或刪除資源群組以刪除整組資源。
您可以使用左導覽窗格中的 [所有資源] 或 [資源群組] 連結,在入口網站中尋找和管理資源。
下一步
現在您已熟悉 SQL Database 編製索引的基本概念,接下來我們將進一步了解索引子設定。