Azure Search
- Part 5 (使用 .NET SDK
上傳資料至 Azure Search
)可以上傳資料到 Azure Search
index 的方式有二個:
推送資料至 index(Push data to an index)
.NET SDK
或 REST API
拉資料進 index(Pull data into an index)
document
、也可追蹤現有 document
的變更,減少主動管理 index 資料indexers
支援 Blob 儲存體 (預覽)
、DocumentDB
、Azure SQL Database
和 Azure VM 上的 SQL Server
今天就先來看 .NET SDK
的用法
Azure Search Service Key
key Type | 備註 | 用途說明 |
---|---|---|
admin keys(系統管理金鑰) | 主要/次要 | 管理服務、建立/刪除 Index、索引子、資料來源;主要/次要用途相同 |
query keys(查詢金鑰) | - | 提供 client 端用來讀取 index 與 document |
Azure Portal
Azure Search
金鑰
主要管理金鑰
或是 次要管理金鑰
兩者皆可用來建立 index
SearchIndexClient
用來連線至
Azure Search Index
Microsoft.Azure.Search
Install-Package Microsoft.Azure.Search
Microsoft.Azure.Search
及 Microsoft.Azure.Search.Models
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;
資料 --> 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 之外都會被忽略
IndexBatch
IndexBatch.New
使用 IndexAction
集合,可包含不同 action 的 IndexAction
IndexAction
就必需指定 actionIndexBatch.Merge
、IndexBatch.MergeOrUpload
或 IndexBatch.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);
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)));
}
搜尋總管
使用 .NET SDK 將資料上傳到 Azure 搜尋服務 文章後半段,有提供 .NET SDK 如何處理文件,如果有興趣可以去了解其中的機制