こんにちは、サイオステクノロジーの佐藤 陽です。
今回はIndex Tagsを使ったBlob Storageの検索方法についてご紹介します。
前回の「Azure Blob Storageのファイルを検索してみる ~Azure Cognitive Search編~」ではCognitive Searchを使った検索方法をご紹介しました。
今回紹介するIndex Tagsは、より簡易的で、安価な検索方法です。
はじめに
Index Tagsの概要を掴むため、はじめはStorage Explorerを使った検索方法を紹介します。
その次に実装ベースでの検索を紹介したいと思います。
では早速見ていきましょう!
Storage Explorer
タグの設定
まず初めに、検索対象となるサンプルファイルを用意します。
前回と同様のプロフィール情報を持つjsonファイルを用意し、Blob Storageへアップロードします。
ファイル上で右クリックし、「タグの編集」を選択します。
なお、IndexTagsと似た項目としてMetadataという項目がありますが、そちらと間違えないようにします。
(Metadataはプロパティ画面から設定可能)
すると、タグの設定画面が出てくるので適当なタグ付けを行います。
今回はnameとcreatedatという2項目を追加しました。
他のファイルに関しても適当なタグ付けを行います
hanako.json name:hanako createdat:2022-10-26T10:03:04+9:00 jiro.json name:jiro createdat:2022-10-21T10:03:04+9:00 taro.json name:taro createdat:2022-09-26T10:03:04+9:00
タグ情報を用いた検索
ではこれらのファイルを実際に検索してみたいと思います。
Storage Explorerの画面右端にフィルタを示すボタンがあります。
これを押すと、タグを使って検索するウィンドウが出てきます。
例えばnameタグで検索する場合、
フィルターを
[name = hanako]
に設定して適用ボタンを押します。
するとエクスプローラーにhanako.jsonのみが表示されます。
日時に関しても検索できます。
[createdat >= 2020-10-01]
ただし、DatetimeOffset型ではなく、あくまで文字列として比較されている点に注意してください!
Offset情報などは正確に検索できない場合があります。
Index Tagsを用いた検索方法の雰囲気は伝わりましたでしょうか?
では次に、実際にアプリケーションに組み込む際の実装例についてもご紹介します。
実装ベースでの設定/検索
先ほどまではStorage Explorer上でのタグ付けおよび、検索を行いましたが、もちろんソースコードレベルでも行えます。
今回は.NET環境を題材に行います。
タグの設定
ファイルアップロード時にタグをつけた状態でアップロードします。
タグはDictionary型として定義し、アップロード関数の引数に与えます。
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Newtonsoft.Json;
var connectionString = "DefaultEndpointsProtocol=https;AccountName=*********";
var serviceClient = new BlobServiceClient(connectionString);
var container = serviceClient.GetBlobContainerClient("indextagsearch");
Profile saburou = new()
{
id = "123123",
name = "Sios Saburo",
country = "JP",
last_access = DateTimeOffset.Now,
age = 30,
skill = new Skill()
{
language = Array.Empty<string>(),
framework = Array.Empty<object>(),
experience_year = 10
}
};
var blob = container.GetBlobClient("saburo.json");
var options = new BlobUploadOptions
{
Tags = new Dictionary<string, string>
{
{ "name", "saburo" },
{ "createdat", DateTimeOffset.Now.ToString() }
}
};
var json = JsonConvert.SerializeObject(saburou);
await blob.UploadAsync(BinaryData.FromString(json), options);
public class Profile
{
public string id { get; set; }
public string name { get; set; }
public string country { get; set; }
public DateTimeOffset last_access { get; set; }
public int age { get; set; }
public Skill skill { get; set; }
}
public class Skill
{
public string[] language { get; set; }
public object[] framework { get; set; }
public int experience_year { get; set; }
}
※Containerはファイルが保存されているコンテナ名を指定してください
※ConnectionStringはリソースから引っ張ってきてください
タグ情報を用いた検索
次にタグ情報を使った検索を行います。
使用するクエリを文字列として定義しておき、FindBlobsByTagssAsyncメソッドを利用して検索します。
taggedBlobItemクラスで取得されるため、そこからコンテナ名とファイル名を取り出します。
この2つが分かれば、blob自体を取得可能になりますね。
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
var connectionString = "DefaultEndpointsProtocol=https;AccountName=*********";
var serviceClient = new BlobServiceClient(connectionString);
var query = @"""createdat"" >= '2022-10-01'";
var blobs = new List<TaggedBlobItem>();
await foreach (TaggedBlobItem taggedBlobItem in serviceClient.FindBlobsByTagsAsync(query))
{
blobs.Add(taggedBlobItem);
}
foreach(var blob in blobs)
{
Console.WriteLine($"containername: {blob.BlobContainerName} blobname: { blob.BlobName }");
}
ここで一つポイントがあります。
検索時にコンテナを指定していません!
つまりIndex Tagsではコンテナをまたいだファイルの検索が可能です。
試しに新たに”subcontiner”というコンテナを作成し、こちらにもsaburo.jsonをアップロードしてみましょう。
※仮にStorage Explorer上でファイルをコピーする場合、IndexTagsが消失するため気を付けてください!
再度検索してみると、コンテナを跨いで検索出来ていることが分かります。
まとめ
今回はBlobStorageにおけるIndex Tagsを用いた検索方法を紹介しました。
前回ご紹介したCognitive Searchと比較し
- 事前にタグを設定する必要がある
- タグ数に限りがある(10個まで)
- タグのkey/valueの文字数に上限がある(key:128文字, value:256文字)
- 検索速度が劣る
- ファイル内容の抽出などが行えない
etc.
といったように多く劣る点はありますが、コスト面では大きなアドバンテージがあります。
検索はしたいけどコストも抑えたい…という人にとっては選択肢にあがるのではないでしょうか?
是非システムに合わせて最適な選択をしてみてください。