こんにちは、サイオステクノロジーの佐藤 陽です。
今回はAzure Cognitive Searchを使って、Azure Blob Storageに保存されているデータを検索する方法をご紹介します。
—
※2024年6月現在、Cognitive SearchからAI Serchにサービス名が変更になっています。
本記事はCognitive Searchと記載していますが、AI Searchと読み替えていただければと思います。
なお、サービス内容の変更に追従できていない可能性があるため、細かい点に関しては公式ドキュメントを参照ください。
—
Azure Blob Storageはその名の通り、Azureで提供されるストレージサービスです。
様々なファイルが格納可能で、値段もお手頃なこともあり、Azureでは定番のサービスではないでしょうか。
ただ個人的な感想として、デフォルトの機能だけでは検索の面が弱いイメージです。
NoSQLデータベースに保管すれば瞬時に検索可能かもしれませんが、コストが…と渋られる方も多いと思います。
このBlob Storageの検索力を補う方法として、Azure Cognitive Searchというサービスが存在します!
なお、Cognitive SearchはBlob Storage以外にも様々なリソースから検索が可能な強力なサービスですが、今回はあくまでBlob Storageに絞ってお話します。
また、Index Tagsという機能を使った検索方法も別記事で紹介しているのでぜひご覧ください!
準備
サンプルデータ作成
はじめに検索対象となるサンプルデータを用意します。
今回はjson形式のものとしますが、csvでもプレーンテキストでも検索は可能です。
プロフィール情報を持つ3つのjsonファイルを用意しました。
まず、これらをStorageAccountにアップロードします。
今回はStorageExplorerを使って作業していきます。
profile001というコンテナを作成し、そこにアップロードします。
また、各ファイルにcreatedatというMetadataも追加しました。
Azure Cognitive Search作成
AzurePortalのStorageAccountリソースページのAzure Searchブレードを選択し、Cognitive Searchを作成します。
Freeプランでの作成でOKです。
Indexの作成
検索に使われるIndexを作成していきます。
このIndexがCognitiveSearchの肝で、検索の軸となる重要な変数となります。
Import Dataを選択してBlob Storageからデータを読み込んでいきます。
Data Sourceとして、今回はAzure Blob Storageを選択します。
Connection stringはBlob Storageにアクセスする為に必要となる接続用文字列です。
Blob StorageのリソースページのAccessKeyブレードから取得可能です。
Add Cognitive skillsは今回スルーし、Customize target indexの設定を行います。
保存されているjsonファイルの中身やMetadataから、自動でFieldが抽出されてます!!
すごいですね、便利です。
この画面において各Fielidに対して、どのような操作が可能かを設定します。
後に出てくる検索用のクエリの対象になるかが決まります。
今回は主要な値のみを扱うだけの設定にし、Analyzerに関してはStandardを選択しました。
これでIndexの作成は完了です。
Cognitive Searchを使ってみる
検索
実際に検索を行ってみましょう。
今回はREST API経由で検索を行ってみたいと思います。
Postmanで以下の内容で実行します。
主要な部分を抜き出すと
HTTPメソッド | POST |
URL | https://{{cognitive-search resource name}}.search.windows.net/indexes/{{index name}}/docs/search?api-version=2021-04-30-Preview |
Body | { } |
Header |
api-key:{{api key}} |
APIのアクセスキーはKeysブレードに書いてあるのでコピーしてきましょう
APIを実行すると、レスポンスとして3名分の項目が取得できていることが分かります。
次にファイルを絞って検索していきます。
検索用の様々なクエリが用意されており、例えばcountryがJPのユーザーファイルを取得したい場合はbodyの値を以下のようにします。
なおこの時指定するパラメータが、IndexにおけるSearchableの値が有効になっている必要があります。
{ "search": "JP", "searchField": "content/country" }
countryがJPの2名分の値がレスポンスとして含まれます。
もちろん不等号を用いた検索も可能です。
filterクエリと比較演算子を利用します。
なおこの時指定するパラメータが、IndexにおけるFilterableの値が有効になっている必要があります。
{ "search": "JP", "searchField": "content/country", "filter" : "content/age le 50" }
また、取得する項目を絞ることもできます。
selectクエリを利用します。
{ "search": "JP", "searchField": "content/country", "filter": "content/age le 50", "select": "content/name, content/id" }
もちろんMetadataの値の検索も可能ですし、日時での比較も行えます。
{ "search": "JP", "searchField": "content/country", "filter": "createdat ge 2020-04-01T03:01:00Z" }
SQLクエリのような感じで自由にデータを抽出できそうですね。
他にも様々なクエリが用意されているので試してみてください。
データ更新
データソースであるStorageには次々データが追加され、また内容が更新されることも十分想定されます。
例えば今回、Taroさんが40歳になり、最終アクセス日も更新されましたとします。
この時、データソースのデータを更新するだけでは、作成したIndexが更新されません。
Indexerを実行し、変更を反映する必要があります。
(定期的にIndexerを実行する設定もありますが、今回は自分で実行します)
HTTPメソッド | POST |
URL | https://{{cognitive-search resource name}}.search.windows.net/indexers/{{indexer name}}/run?api-version=2021-04-30-Preview |
Body | |
Header |
api-key:{{api key}} |
するとファイル変更が更新され、検索結果も更新されていることが分かります。
まとめ
今回はCognitive Searchを使ったBlob Storageの検索方法をご紹介しました。
冒頭にも書きましたが、Cognitive SearchはBlob Storageに限らず様々なサービスを検索対象とすることができます。
ただ高機能故に、サービスの価格は少しお高めです。
実は、Blob Storageにはもっと安く、簡易的に検索する方法としてIndex tagという機能が存在します。
こちらに関しては、Cognitive Searchとの比較も含めてまた別記事で紹介したいと思います!
→書きました!