Azure Blob Storageのファイルを検索してみる ~Index Tags編~

★★★ イベント情報 ★★★
◇【参加登録受付中】Kong Summit, Japan 2022◇
今年は12月15日に開催決定!最新情報とデモとともにKongと事例/ユースケースのご紹介などAPIエコノミーやマイクロサービスに関心のある開発者の方にとっては必見です。ぜひお申し込みください!イベントの詳細・お申込はこちら

★★★ Live配信告知 ★★★
◇11月29日開催 19:00~ 世界一わかりみの深いクラウドネイティブon Azure◇
テーマは「Web App for ContainersとKeycloakで最速OpenID Connect」です!

◇11月30日開催 17:00〜 知ってると ちょっと便利なコマンド集◇
知っていると少し効率の上がるようなコマンドをいくつかご紹介します!

こんにちは、サイオステクノロジーの佐藤 陽です。
今回はIndex Tagsを使ったBlob Storageの検索方法についてご紹介します。

前回の「Azure Blob Storageのファイルを検索してみる ~Azure Cognitive Search編~」ではCognitive Searchを使った検索方法をご紹介しました。
今回紹介するIndex Tagsは、より簡易的で、安価な検索方法です。

Azure Blob Storageのファイルを検索してみる ~Azure Cognitive Search編~

はじめに

Index Tagsの概要を掴むため、はじめはStorage Explorerを使った検索方法を紹介します。
その次に実装ベースでの検索を紹介したいと思います。

では早速見ていきましょう!

Storage Explorer

タグの設定

まず初めに、検索対象となるサンプルファイルを用意します。
前回と同様のプロフィール情報を持つjsonファイルを用意し、Blob Storageへアップロードします。

ファイル上で右クリックし、「タグの編集」を選択します。
なお、IndexTagsと似た項目としてMetadataという項目がありますが、そちらと間違えないようにします。
(Metadataはプロパティ画面から設定可能)

すると、タグの設定画面が出てくるので適当なタグ付けを行います。
今回はnamecreatedatという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.

といったように多く劣る点はありますが、コスト面では大きなアドバンテージがあります。
検索はしたいけどコストも抑えたい…という人にとっては選択肢にあがるのではないでしょうか?

是非システムに合わせて最適な選択をしてみてください。





ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!


ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる