0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Azure AI Searchのデータ管理完全ガイド - Part 3: インデクサーとナレッジストアを使いこなそう

Last updated at Posted at 2025-10-31

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時間
  • PT24H or P1D: 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"}]
    }
  ]
}

この処理で何が起こる?

  1. 英語のレビュー: "This product is amazing!"
  2. 言語検出: "en" (英語)
  3. 日本語翻訳: "この製品は素晴らしい!"
  4. 感情分析: 0.95 (超ポジティブ!)
  5. キーワード抽出: ["製品", "素晴らしい"]

→ 全て自動で処理!

スキルセットのコスト

重要: スキルセットを使うと追加料金が発生します

料金体系:

  • 無料枠: 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: インデクサー実行

インデクサーが実行されると:

  1. データソースからレビュー読み込み
  2. 感情分析実行
  3. キーワード抽出
  4. 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で:

  1. 検索サービス → インデクサー
  2. 状態列を確認:
    • ✅ 成功
    • ⚠ 警告付き成功
    • ❌ 失敗

REST APIで:

GET https://[service-name].search.windows.net/indexers/[indexer-name]/status?api-version=2024-07-01

よくあるエラーと対処法

エラー1: "データソースに接続できません"

原因:

  • 接続文字列が間違っている
  • ネットワーク設定の問題
  • アクセス権限がない

対処法:

  1. 接続文字列を再確認
  2. ファイアウォール設定を確認
  3. Managed Identityの権限を確認

エラー2: "フィールドマッピングエラー"

原因:

  • ソースとターゲットのデータ型が合わない
  • 必須フィールドに値がない

対処法:

  1. フィールドマッピングを見直す
  2. データ型変換を追加
  3. デフォルト値を設定

エラー3: "スキル実行エラー"

原因:

  • Azure AI Servicesのクォータ超過
  • 不正なスキル設定

対処法:

  1. クォータを確認・増量
  2. スキル定義を見直す
  3. エラーログを詳しく確認

パフォーマンスチューニング

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: 自動化と分析活用

おすすめの学習順:

  1. Azure Portalで簡単なインデックス作成
  2. Blob Storageからインデクサーで取り込み
  3. スキルセットを追加してAI処理
  4. ナレッジストアでPower BI連携

さらに学びたい方へ

公式ドキュメント:

おすすめトピック:

  • セマンティック検索
  • ハイブリッド検索
  • セキュリティとアクセス制御
  • コスト最適化

長い記事をお読みいただきありがとうございました!この記事が役に立ったら、ぜひ「いいね」をお願いします!

質問や「こんな記事も書いて欲しい」というリクエストがあれば、コメントでお知らせください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?