2016-12-17

Azure Search - Part 5 (使用 .NET SDK 上傳資料至 Azure Search)

可以上傳資料到 Azure Search index 的方式有二個:

  1. 推送資料至 index(Push data to an index)

    • 使用 .NET SDKREST API
    • 可保持較高的資料一致性
    • 可個別或是批次上傳
  2. 拉資料進 index(Pull data into an index)

    • 會檢查支援的資料來源並主動上傳
    • 可以辨識新 document 、也可追蹤現有 document 的變更,減少主動管理 index 資料
    • 透過 indexers 支援 Blob 儲存體 (預覽)DocumentDBAzure SQL DatabaseAzure VM 上的 SQL Server

今天就先來看 .NET SDK 的用法

準備 API Key

Azure Search Service Key

key Type 備註 用途說明
admin keys(系統管理金鑰) 主要/次要 管理服務、建立/刪除 Index、索引子、資料來源;主要/次要用途相同
query keys(查詢金鑰) - 提供 client 端用來讀取 index 與 document
  1. 登入 Azure Portal
  2. 開啟 Azure Search
  3. 點擊 金鑰

1.AZUREKEY

  1. 取得 主要管理金鑰 或是 次要管理金鑰

兩者皆可用來建立 index 1-4ADMINKEY

1. 建立 SearchIndexClient

用來連線至 Azure Search Index

1-1. nuget 安裝 Microsoft.Azure.Search

Install-Package Microsoft.Azure.Search

1-2. using Microsoft.Azure.SearchMicrosoft.Azure.Search.Models

1-3. 建立 SearchIndexClient 執行個體

  • index 的管理與寫入,可以僅用 query key 比較安全
  • 實際測試,還是得用 admin key 授權才會通過
string searchServiceName = "SearchServiceName";//填 AzureServiceName
string queryApiKey = "SearchServiceQueryApiKey";//填 query key
string adminApiKey = "AdminApiKey";//填 AdminKey, 主要/次要 都可以
SearchIndexClient indexClient = new SearchIndexClient(searchServiceName, "hotels", new SearchCredentials(adminApiKey));//使用 queryApiKey 在授權時會出現 fail
  • 如果已有存在的 SearchServiceClient ,可以直接下面這段取得 SearchServiceClient
SearchIndexClient indexClient = serviceClient.Indexes.GetClient("hotels") as SearchIndexClient;

2. 決定要用哪一種 action 進行 index

資料 --> document(含有 key) + property(action:Upload,Merge,MergeOrUpload,Delete) == IndexAction --> IndexAction 集合 -->IndexBatch

Action 說明 必要欄位 注意事項
Upload document 不存在就建立,存在就取代 key,及其他想指定的欄位 更新 document 時,未指定的欄位會設定為 null,即時之前已設定過
Merge 使用指定的欄位更新現有 document。 如果 document 不存在於 index 中,merge 就會失敗。 KEY,及想更新的欄位 merge 中指定的任何欄位將取代文件中現有的欄位,可用來移除個別欄位
MergeOrUpload 有指定 key 的 document 已存在 index 中,則 Merge,否則就 Upload key,及其他想指定的欄位 -
Delete 從 index 中移除指定的 document key 除了 key 之外都會被忽略

3. 建構 IndexBatch

  • 每次 index 處理不得超過 1000 個 document 或是 16 MB (看哪個先滿足)
  • IndexBatch.New 使用 IndexAction 集合,可包含不同 action 的 IndexAction
  • 使用 IndexAction 就必需指定 action
  • 可改用 IndexBatch.MergeIndexBatch.MergeOrUploadIndexBatch.Delete.
var actions =
    new IndexAction<Hotel>[]
    {
        IndexAction.Upload(
            new Hotel()
            {
                HotelId = "1",
                BaseRate = 199.0,
                Description = "Best hotel in town",
                DescriptionFr = "Meilleur hôtel en ville",
                HotelName = "Fancy Stay",
                Category = "Luxury",
                Tags = new[] { "pool", "view", "wifi", "concierge" },
                ParkingIncluded = false,
                SmokingAllowed = false,
                LastRenovationDate = new DateTimeOffset(2010, 6, 27, 0, 0, 0, TimeSpan.Zero),
                Rating = 5,
                Location = GeographyPoint.Create(47.678581, -122.131577)
            }),
        IndexAction.Upload(
            new Hotel()
            {
                HotelId = "2",
                BaseRate = 79.99,
                Description = "Cheapest hotel in town",
                DescriptionFr = "Hôtel le moins cher en ville",
                HotelName = "Roach Motel",
                Category = "Budget",
                Tags = new[] { "motel", "budget" },
                ParkingIncluded = true,
                SmokingAllowed = true,
                LastRenovationDate = new DateTimeOffset(1982, 4, 28, 0, 0, 0, TimeSpan.Zero),
                Rating = 1,
                Location = GeographyPoint.Create(49.678581, -122.131577)
            }),
        IndexAction.MergeOrUpload(
            new Hotel()
            {
                HotelId = "3",
                BaseRate = 129.99,
                Description = "Close to town hall and the river"
            }),
        IndexAction.Delete(new Hotel() { HotelId = "6" })
    };
var batch = IndexBatch.New(actions);

4. 匯入資料

  • Azure Search Service 無法處理 index,會收到 IndexBatchException
  • Azure Search Service loading 過重時就會出現這個錯誤,可以嘗試重試機制
try
{
    indexClient.Documents.Index(batch);
}
catch (IndexBatchException e)
{
    Console.WriteLine(
        "Failed to index some of the documents: {0}",
        String.Join(", ", e.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key)));
}

5. 測試結果

5-1. 開啟搜尋總管

1searchexplorer

5-2. 查詢字串-->搜尋

2searchresult

使用 .NET SDK 將資料上傳到 Azure 搜尋服務 文章後半段,有提供 .NET SDK 如何處理文件,如果有興趣可以去了解其中的機制

參考資料

  1. 上傳資料至 Azure 搜尋服務
  2. 使用 .NET SDK 將資料上傳到 Azure 搜尋服務

沒有留言:

張貼留言