[Azure] C# 使用 Azure.Search.Documents Azure Blob 搜尋中的 JSON 資料 -重新執行 indexer

2022-07-18

上一篇文章 ( 使用 Azure.Search.Documents Azure Blob 搜尋中的 JSON 資料 -搜尋資料),我們搜尋了索引裡面的資料,其實您在新增一個資料(JSON FILE) 後,其實在每次更新索引的時候,也會把該資料放入索引中

在原本的設定中我們是設定五分鐘會做一次索引,關於設定部分可以參考 使用 Azure.Search.Documents Azure Blob 搜尋中的 JSON 資料 -建立環境




接下來,我們上傳一個檔案上去至 blob 資料中,但是這樣直接搜尋一錠是搜尋不到的,除非你真的很剛好馬上碰到做完索引

上傳一個 JSON, Id: USER9999

AddOneData(9999); private static void AddOneData(int num) { var dir = AppDomain.CurrentDomain.BaseDirectory + "temp" + Path.DirectorySeparatorChar; Directory.CreateDirectory(dir); var u = new User { Birth = new DateTime(2022, 1, 1).AddDays(1), Email = "user" + num + "@gmail.com", Id = "USER" + num, Num = num, Memo = "測試資料" + num, Name = "當麻測試" + num }; System.IO.File.WriteAllText(dir + "data" + num + ".json", Newtonsoft.Json.JsonConvert.SerializeObject(u)); var blobClient = new Azure.Storage.Blobs.BlobClient(ConnectionString, "test1000", "data/" + "data" + num + ".json"); blobClient.Upload(dir + "data" + num + ".json", true); }


重建索引 C# Code:

AddOneData(9999); private static void AddOneData(int num) { var dir = AppDomain.CurrentDomain.BaseDirectory + "temp" + Path.DirectorySeparatorChar; Directory.CreateDirectory(dir); var u = new User { Birth = new DateTime(2022, 1, 1).AddDays(1), Email = "user" + num + "@gmail.com", Id = "USER" + num, Num = num, Memo = "測試資料" + num, Name = "當麻測試" + num }; System.IO.File.WriteAllText(dir + "data" + num + ".json", Newtonsoft.Json.JsonConvert.SerializeObject(u)); var blobClient = new Azure.Storage.Blobs.BlobClient(ConnectionString, "test1000", "data/" + "data" + num + ".json"); blobClient.Upload(dir + "data" + num + ".json", true); }


在重建索引後,你在後 Azure 後台中,可以看到原本都是規律的五分鐘做索引,中間突然插入一個,並且他偵測到有一個檔案

之後搜尋出 USER9999* 就會搜尋到這個資料了

private static void RunIndexer() { var indexer = new Azure.Search.Documents.Indexes.SearchIndexerClient(new Uri(SearchServiceEndPoint), new Azure.AzureKeyCredential(AdminApiKey)); //這是對 indexer 做重新建立 var res = indexer.RunIndexer("azureblob-indexer").Content.ToString(); Console.WriteLine("Rebuild Indexer Result:"); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(res)); }



請注意,官方有提示 有 180 秒這個訊息,所以你即使你用程式呼叫,也不可以太過於頻繁 ,不然會有 Exception

Unhandled exception. Azure.RequestFailedException: On-demand indexer invocation is permitted every 180 seconds for this service tier.

Status: 429

Content:

{"error":{"code":"","message":"On-demand indexer invocation is permitted every 180 seconds for this service tier."}}


reference:

https://docs.microsoft.com/zh-tw/azure/search/search-indexer-overview

https://docs.microsoft.com/zh-tw/azure/search/search-howto-run-reset-indexers?tabs=portal


當麻許的碎念筆記 2014 | Donma Hsu Design.