Part 3で学ぶこと
Part 1, 2では、データの入れ方とインデックスの設計を学びました。
Part 3では、データ取り込みの自動化と、検索以外の用途でのデータ活用について見ていきます:
- インデクサーの詳細機能
- スキルセットとAIエンリッチメント
- ナレッジストアとは?
- データ分析への活用
インデクサー: データ取り込みのプロフェッショナル
インデクサーをもう一度おさらい
Part 1で「データを自動で取ってきてくれるお助けロボット」と説明しましたね。
もう少し正確に言うと:
- データソースからデータを読み取る
- 必要に応じてAI処理(エンリッチメント)を実行
- 検索インデックスに自動でロードする
- これら全てを自動化・スケジュール化できる
インデクサーが担当する4つのステージ
インデクサーは、データを取り込む際に4つのステージを順番に実行します。
ステージ1: ドキュメント解析
何をする? ファイルを開いてコンテンツを取り出す
対応フォーマット:
- テキスト形式: JSON, CSV, TXT, HTML
- オフィス形式: PDF, Word, Excel, PowerPoint
- 画像形式: JPEG, PNG, BMP, TIFF
例えば:
入力: PDFファイル
├─ テキスト
├─ 埋め込み画像
└─ メタデータ
出力: 全て抽出される!
画像抽出の注意点:
- デフォルトでは無効
- 有効化すると追加料金がかかる
-
imageActionプロパティで制御
ステージ2: フィールドマッピング
何をする? ソースのフィールドを、インデックスのフィールドに対応付ける
基本ルール:
- 名前とデータ型が同じなら自動マッピング
- 異なる場合は明示的に指定
例:
"fieldMappings": [
{
"sourceFieldName": "ProductID",
"targetFieldName": "id"
},
{
"sourceFieldName": "ProductName",
"targetFieldName": "name"
}
]
こんな時に使う:
- ソースとインデックスでフィールド名が違う
- データ型の変換が必要
- 1つのソースフィールドを複数のインデックスフィールドに
ステージ3: スキルセットの実行 (オプション)
何をする? AIを使ってコンテンツを分析・変換
これが超重要! 後で詳しく説明します。
ステージ4: 出力フィールドマッピング
何をする? スキルセットの出力を、インデックスフィールドに対応付ける
ステージ2との違い:
- ステージ2: データソース → インデックス
- ステージ4: スキルセット出力 → インデックス
例:
"outputFieldMappings": [
{
"sourceFieldName": "/document/keyPhrases",
"targetFieldName": "keywords"
},
{
"sourceFieldName": "/document/sentiment",
"targetFieldName": "sentimentScore"
}
]
インデクサーの便利機能
1. 変更検出: 賢い差分更新
どうやって変更を検出するの?
データソースによって方法が異なります:
Blob Storageの場合:
-
LastModifiedタイムスタンプを見る - 自動で有効
- 設定不要!
SQL Databaseの場合:
-
High Water Mark方式 - 変更日時列が必要
設定例:
{
"dataChangeDetectionPolicy": {
"@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
"highWaterMarkColumnName": "UpdatedDate"
}
}
こんな感じで動く:
初回実行: 全データ読み込み (1万件)
→ LastUpdated の最大値を記録: 2024-01-15
2回目実行: LastUpdated > 2024-01-15 のみ読み込み (100件)
→ 差分のみ処理で超効率的!
2. 削除検出: 消えたデータも追跡
問題: ソースからデータが削除されても、インデックスには残ってしまう
解決策: 削除検出ポリシー
方式1: ソフト削除
データに「削除フラグ」を立てる方式
設定例:
{
"dataDeletionDetectionPolicy": {
"@odata.type": "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
"softDeleteColumnName": "IsDeleted",
"softDeleteMarkerValue": "true"
}
}
こう動く:
商品テーブル:
ID | Name | IsDeleted
1 | りんご | false
2 | みかん | true ← これがインデックスから削除される
3 | バナナ | false
3. スケジュール実行: おまかせ自動化
設定できる実行間隔:
- 最短: 5分ごと
- 最長: 自由(例: 毎週月曜日)
設定例:
{
"schedule": {
"interval": "PT2H", // 2時間ごと
"startTime": "2024-01-01T00:00:00Z"
}
}
間隔の書き方 (ISO 8601形式):
-
PT5M: 5分 -
PT1H: 1時間 -
PT24HorP1D: 1日 -
P7D: 7日
実用例:
| ユースケース | 推奨間隔 | 理由 |
|---|---|---|
| ECサイト在庫 | 5~15分 | リアルタイム性重視 |
| ニュース記事 | 30分~1時間 | 鮮度とコストのバランス |
| 社内文書 | 1日1回 | 更新頻度が低い |
| アーカイブ | 週1回 | ほぼ変更なし |
4. エラーハンドリングとリトライ
インデクサーは賢い:
- エラーが起きても止まらない
- スキップ可能なエラーの上限を設定できる
- 自動リトライ機能
設定例:
{
"parameters": {
"maxFailedItems": 10,
"maxFailedItemsPerBatch": 5,
"batchSize": 100
}
}
意味:
- 最大10件のエラーまで許容
- 1バッチあたり5件のエラーまで許容
- 一度に100件ずつ処理
スキルセット: AIパワーを解放しよう
スキルセットって何?
一言で言うと: AIの能力をパイプラインに追加する機能
イメージ:
通常のインデクサー:
ファイル読み込み → インデックスへ
スキルセット付きインデクサー:
ファイル読み込み → AI処理 → インデックスへ
↓
OCR, 翻訳, 要約, etc.
組み込みスキルの種類
Azure AI Searchには、すぐに使える組み込みスキルがたくさん!
1. テキスト系スキル
キーフレーズ抽出
{
"@odata.type": "#Microsoft.Skills.Text.KeyPhraseExtractionSkill",
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "keyPhrases",
"targetName": "keywords"
}
]
}
何ができる?
- 文章から重要なキーワードを自動抽出
- 例: "Azure AI Searchは強力な検索エンジンです"
→ キーワード: ["Azure AI Search", "検索エンジン"]
言語検出
{
"@odata.type": "#Microsoft.Skills.Text.LanguageDetectionSkill",
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "languageCode",
"targetName": "language"
}
]
}
何ができる?
- テキストが何語で書かれているか自動判定
- 対応: 100以上の言語
テキスト翻訳
{
"@odata.type": "#Microsoft.Skills.Text.TranslationSkill",
"defaultToLanguageCode": "ja",
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "translatedText",
"targetName": "contentJa"
}
]
}
何ができる?
- 自動翻訳
- 多言語ドキュメントを日本語化
感情分析
{
"@odata.type": "#Microsoft.Skills.Text.SentimentSkill",
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "score",
"targetName": "sentimentScore"
}
]
}
何ができる?
- テキストがポジティブ/ネガティブか判定
- スコア: 0(超ネガティブ) ~ 1(超ポジティブ)
- 用途: レビュー分析、SNS監視
2. 画像系スキル
OCR (文字認識)
{
"@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
"defaultLanguageCode": "ja",
"inputs": [
{
"name": "image",
"source": "/document/normalized_images/*"
}
],
"outputs": [
{
"name": "text",
"targetName": "extractedText"
}
]
}
何ができる?
- 画像からテキストを抽出
- 例: スキャンしたPDF、写真の看板、手書きメモ
画像分析
{
"@odata.type": "#Microsoft.Skills.Vision.ImageAnalysisSkill",
"visualFeatures": ["tags", "description", "faces"],
"inputs": [
{
"name": "image",
"source": "/document/normalized_images/*"
}
],
"outputs": [
{
"name": "tags",
"targetName": "imageTags"
},
{
"name": "description",
"targetName": "imageDescription"
}
]
}
何ができる?
- 画像の内容を説明
- タグ付け
- 顔認識
3. ベクトル系スキル
埋め込み生成 (Embedding)
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"resourceUri": "https://YOUR-OPENAI.openai.azure.com",
"deploymentId": "text-embedding-ada-002",
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "embedding",
"targetName": "contentVector"
}
]
}
何ができる?
- テキストをベクトル(数値配列)に変換
- ベクトル検索に必須
- 統合ベクトル化と呼ばれる
4. ユーティリティ系スキル
テキスト分割 (Chunking)
{
"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"textSplitMode": "pages",
"maximumPageLength": 5000,
"pageOverlapLength": 500,
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "textItems",
"targetName": "pages"
}
]
}
何ができる?
- 長い文書を小さなチャンクに分割
- RAGに必須!
Shaperスキル
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"inputs": [
{
"name": "title",
"source": "/document/title"
},
{
"name": "content",
"source": "/document/content"
},
{
"name": "keywords",
"source": "/document/keyPhrases"
}
],
"outputs": [
{
"name": "output",
"targetName": "shapedData"
}
]
}
何ができる?
- データの形を整える
- 複数フィールドを1つにまとめる
- ナレッジストアで必須
スキルセットの実践例
シナリオ: 多言語の製品レビューを分析
{
"name": "review-skillset",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Text.LanguageDetectionSkill",
"inputs": [{"name": "text", "source": "/document/review"}],
"outputs": [{"name": "languageCode", "targetName": "language"}]
},
{
"@odata.type": "#Microsoft.Skills.Text.TranslationSkill",
"defaultToLanguageCode": "ja",
"inputs": [{"name": "text", "source": "/document/review"}],
"outputs": [{"name": "translatedText", "targetName": "reviewJa"}]
},
{
"@odata.type": "#Microsoft.Skills.Text.SentimentSkill",
"inputs": [{"name": "text", "source": "/document/reviewJa"}],
"outputs": [{"name": "score", "targetName": "sentiment"}]
},
{
"@odata.type": "#Microsoft.Skills.Text.KeyPhraseExtractionSkill",
"inputs": [{"name": "text", "source": "/document/reviewJa"}],
"outputs": [{"name": "keyPhrases", "targetName": "keywords"}]
}
]
}
この処理で何が起こる?
- 英語のレビュー: "This product is amazing!"
- 言語検出: "en" (英語)
- 日本語翻訳: "この製品は素晴らしい!"
- 感情分析: 0.95 (超ポジティブ!)
- キーワード抽出: ["製品", "素晴らしい"]
→ 全て自動で処理!
スキルセットのコスト
重要: スキルセットを使うと追加料金が発生します
料金体系:
- 無料枠: 1日20トランザクション
- 有料: Azure AI Servicesマルチサービスリソースが必要
コスト削減のTips:
- 必要なスキルだけ使う
- キャッシュ機能を活用 (プレビュー)
- テスト時は小さなデータセットで
ナレッジストア: データを検索以外にも活用しよう
ナレッジストアって何?
一言で言うと: スキルセットで処理したデータを、Azure Storageに保存する機能
検索インデックスとの違い:
| 項目 | 検索インデックス | ナレッジストア |
|---|---|---|
| 保存先 | Azure AI Search | Azure Storage |
| 用途 | 検索 | 分析・加工 |
| アクセス | 検索クエリのみ | 自由 (Storage API) |
| データ形式 | 検索用 | テーブル・JSON・ファイル |
イメージ:
インデクサー + スキルセット
├─→ 検索インデックス (検索用)
└─→ ナレッジストア (分析用)
ナレッジストアの3つの形式
1. テーブルプロジェクション
保存先: Azure Table Storage
こんな時に使う:
- Power BIで分析
- Excelで集計
- SQLのようにクエリしたい
例:
{
"knowledgeStore": {
"storageConnectionString": "...",
"projections": [
{
"tables": [
{
"tableName": "reviews",
"generatedKeyName": "reviewId",
"source": "/document/reviews/*"
},
{
"tableName": "keywords",
"generatedKeyName": "keywordId",
"source": "/document/reviews/*/keywords/*"
}
]
}
]
}
}
結果:
reviewsテーブル:
reviewId | productId | content | sentiment
1 | A001 | Great! | 0.9
2 | A002 | Not bad | 0.6
keywordsテーブル:
keywordId | reviewId | keyword
1 | 1 | Great
2 | 1 | Quality
3 | 2 | Okay
2. オブジェクトプロジェクション
保存先: Azure Blob Storage (JSON)
こんな時に使う:
- データサイエンス
- 機械学習のトレーニングデータ
- 外部システムへのエクスポート
例:
{
"objects": [
{
"storageContainer": "enriched-docs",
"source": "/document"
}
]
}
結果: 各ドキュメントが1つのJSONファイルに
{
"id": "doc1",
"content": "...",
"language": "ja",
"keywords": ["技術", "革新"],
"sentiment": 0.8
}
3. ファイルプロジェクション
保存先: Azure Blob Storage (バイナリファイル)
こんな時に使う:
- PDFから抽出した画像を保存
- OCR処理した画像を保存
- 正規化された画像を保存
例:
{
"files": [
{
"storageContainer": "extracted-images",
"source": "/document/normalized_images/*"
}
]
}
ナレッジストアの実践例
シナリオ: ホテルレビューを分析してPower BIで可視化
ステップ1: スキルセット定義
{
"name": "hotel-review-skillset",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Text.SentimentSkill",
"inputs": [{"name": "text", "source": "/document/review"}],
"outputs": [{"name": "score", "targetName": "sentiment"}]
},
{
"@odata.type": "#Microsoft.Skills.Text.KeyPhraseExtractionSkill",
"inputs": [{"name": "text", "source": "/document/review"}],
"outputs": [{"name": "keyPhrases", "targetName": "keywords"}]
},
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"inputs": [
{"name": "hotelId", "source": "/document/hotelId"},
{"name": "review", "source": "/document/review"},
{"name": "sentiment", "source": "/document/sentiment"},
{"name": "keywords", "source": "/document/keywords"}
],
"outputs": [{"name": "output", "targetName": "shaped"}]
}
],
"knowledgeStore": {
"storageConnectionString": "...",
"projections": [
{
"tables": [
{
"tableName": "HotelReviews",
"source": "/document/shaped"
}
]
}
]
}
}
ステップ2: インデクサー実行
インデクサーが実行されると:
- データソースからレビュー読み込み
- 感情分析実行
- キーワード抽出
- Table Storageに保存
ステップ3: Power BIで可視化
Power BIからTable Storageに接続:
接続 → Azure Table Storage
→ テーブル選択: HotelReviews
→ データ読み込み
作成できるレポート例:
- ホテル別の平均感情スコア
- よく出るキーワードのワードクラウド
- 時系列での感情推移
- ネガティブレビューの自動抽出
ナレッジストアの便利な使い方
1. Storage Explorerで確認
Azure Portal または Storage Explorer を使って:
- テーブルの中身を確認
- JSONファイルをダウンロード
- 画像を表示
2. Azure Data Factoryで加工
さらに別のシステムへデータを送る:
ナレッジストア (Storage)
↓
Azure Data Factory
↓
SQL Database / Synapse / 他システム
3. 機械学習のトレーニングデータ
ナレッジストア
↓
Azure Machine Learning
↓
カスタムモデル学習
監視とトラブルシューティング
インデクサーの状態確認
Azure Portalで:
- 検索サービス → インデクサー
- 状態列を確認:
- ✅ 成功
- ⚠ 警告付き成功
- ❌ 失敗
REST APIで:
GET https://[service-name].search.windows.net/indexers/[indexer-name]/status?api-version=2024-07-01
よくあるエラーと対処法
エラー1: "データソースに接続できません"
原因:
- 接続文字列が間違っている
- ネットワーク設定の問題
- アクセス権限がない
対処法:
- 接続文字列を再確認
- ファイアウォール設定を確認
- Managed Identityの権限を確認
エラー2: "フィールドマッピングエラー"
原因:
- ソースとターゲットのデータ型が合わない
- 必須フィールドに値がない
対処法:
- フィールドマッピングを見直す
- データ型変換を追加
- デフォルト値を設定
エラー3: "スキル実行エラー"
原因:
- Azure AI Servicesのクォータ超過
- 不正なスキル設定
対処法:
- クォータを確認・増量
- スキル定義を見直す
- エラーログを詳しく確認
パフォーマンスチューニング
1. バッチサイズの調整
{
"parameters": {
"batchSize": 100 // デフォルトは1000
}
}
小さくする時:
- ドキュメントが大きい
- スキルセットが重い
- メモリ不足エラーが出る
大きくする時:
- ドキュメントが小さい
- スキルセットがない
- 処理速度を上げたい
2. 並列実行
検索サービスは、検索ユニット数に応じて並列実行されます:
Basic tier:
- 1つのインデクサーのみ実行
Standard tier (S1~S3):
- 検索ユニット数 × 3 まで並列実行
- 例: S1で3レプリカ = 9並列
3. インデクサーのリセット
定期的なメンテナンス:
POST https://[service-name].search.windows.net/indexers/[indexer-name]/reset?api-version=2024-07-01
こんな時に:
- スキルセットを大幅変更した
- 全データを再処理したい
- 変更検出がおかしい
Part 3のまとめ
押さえておきたいポイント:
📌 インデクサーは4つのステージ
- ドキュメント解析
- フィールドマッピング
- スキルセット実行
- 出力フィールドマッピング
📌 スキルセットでAI機能を追加
- OCR, 翻訳, 感情分析, etc.
- 組み合わせて強力なパイプライン
- コストに注意
📌 ナレッジストアは分析の味方
- テーブル: Power BI連携
- オブジェクト: データサイエンス
- ファイル: 画像保存
📌 運用時の監視が重要
- 状態の定期確認
- エラーログの分析
- パフォーマンスチューニング
全3部のまとめ
Azure AI Searchのデータ管理、完全制覇できましたね!
Part 1: データの入れ方(プッシュ vs プル)
Part 2: インデックス設計とベクトル検索
Part 3: 自動化と分析活用
おすすめの学習順:
- Azure Portalで簡単なインデックス作成
- Blob Storageからインデクサーで取り込み
- スキルセットを追加してAI処理
- ナレッジストアでPower BI連携
さらに学びたい方へ
公式ドキュメント:
おすすめトピック:
- セマンティック検索
- ハイブリッド検索
- セキュリティとアクセス制御
- コスト最適化
長い記事をお読みいただきありがとうございました!この記事が役に立ったら、ぜひ「いいね」をお願いします!
質問や「こんな記事も書いて欲しい」というリクエストがあれば、コメントでお知らせください!