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

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

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

Azure Blob Storageのファイルを検索してみる ~Azure AI 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.

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

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

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

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

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です