Azure AI Search でのデータインポート
Azure AI Search では、クエリは、 検索インデックスに読み込まれたユーザー所有のコンテンツに対して実行されます。 この記事では、インデックスを作成する 2 つの基本的なワークフローについて説明します。プログラムでデータをインデックスにプッシュするワークフローと、検索インデクサーを使用してデータをプルするワークフローです。
どちらの方法でも、外部データ ソースからドキュメントが読み込まれます。 空のインデックスを作成することもできますが、コンテンツを追加するまでクエリは実行できません。
Note
AI エンリッチメントまたは垂直統合がソリューションの要件である場合は、プル モデル (インデクサー) を使用してインデックスを読み込む必要があります。 スキルセットはインデクサーにアタッチされており、独立して実行されることはありません。
インデックスにデータをプッシュする
プッシュ モデルは、API を使用して既存の検索インデックスにドキュメントをアップロードするアプローチです。 ドキュメントは、個別に、またはバッチあたり最大 1,000 個、または 16 MB (どちらか早い方) のバッチでアップロードできます。
主な利点:
データ ソースの種類に制限はありません。 ペイロードは、インデックス スキーマにマップされる JSON ドキュメントで構成する必要がありますが、データはどこからでも取得できます。
実行頻度に制限はありません。 インデックスには、必要に応じて何度でも変更をプッシュすることができます。 待機時間の要件が厳しいアプリケーションの場合 (インデックスが製品在庫の変動と同期する必要がある場合など) は、プッシュ モデルしか使用できません。
接続性とドキュメントの安全な取得が完全に制御下にあります。 これに対し、インデクサー接続は、Azure AI Search で提供されるセキュリティフィーチャーを使用して認証されます。
Azure AI Search インデックスにデータをプッシュする方法
次の API を使用して、1 つまたは複数のドキュメントをインデックスに読み込みます。
- Index Documents (REST API)
- IndexDocumentsAsync (Azure SDK for .NET) または SearchIndexingBufferedSender
- IndexDocumentsBatch (Azure SDK for Python) または SearchIndexingBufferedSender
- IndexDocumentsBatch (Azure SDK for Java) または SearchIndexingBufferedSender
- IndexDocumentsBatch (Azure SDK for JavaScript) または SearchIndexingBufferedSender
Azure portal を使用したデータのプッシュはサポートされていません。
プッシュ API の概要については、以下を参照してください。
- クイックスタート: Azure SDK を使用したフル テキスト検索
- C# チュートリアル: プッシュ API を使用してインデックス作成を最適化する
- REST クイック スタート: PowerShellを使用して Azure AI Search インデックスを作成する
インデックス作成アクション: upload、merge、mergeOrUpload、delete
インデックス作成アクションの種類をドキュメントごとに制御できます。つまり、ドキュメントを全部アップロードするか、既存のドキュメント コンテンツとマージするか、または削除するかを指定できます。
REST API と Azure SDK のどちらを使う場合でも、データのインポートには次のドキュメント操作がサポートされています。
upload。"upsert" と同様に、ドキュメントが新しい場合は挿入され、存在する場合は更新または置換されます。 インデックスに必要な値がドキュメントにない場合、ドキュメント フィールドの値は null に設定されます。
merge。既に存在するドキュメントを更新し、ドキュメントが見つからない場合は失敗します。 マージは既存の値を置き換えます。 そのため、
Collection(Edm.String)
型のフィールドなど、複数の値を含むコレクション フィールドは必ず確認してください。 たとえば、tags
フィールドの値が["budget"]
で始まり、値["economy", "pool"]
でマージを実行した場合、tags
フィールドの最終値は["economy", "pool"]
になります。["budget", "economy", "pool"]
にはなりません。mergeOrUpload。ドキュメントが存在する場合は merge と同様な動作をし、ドキュメントが新しい場合は upload の動作をします。
delete。インデックスから指定したドキュメントを削除します。 個々のフィールドを削除する場合は、代わりに merge を使い、問題のフィールドを null に設定します。
インデックスへのデータのプル
プル モデルでは、"インデクサー" を使用して、サポートされているデータ ソースに接続し、データをインデックスに自動的にアップロードします。 Microsoft のインデクサーは、次のプラットフォームで利用できます。
- Azure BLOB Storage
- Azure Table Storage
- Azure Data Lake Storage Gen2
- Azure Files (プレビュー)
- Azure Cosmos DB
- Azure SQL Database、SQL Managed Instance、および Azure VM 上の SQL Server
- OneLake のファイルとショートカット
- SharePoint Online (プレビュー)
Microsoft パートナーによって開発および保守されているサード パーティ製コネクタを使用できます。 詳細とリンクについては、「データ ソース ギャラリー」を参照してください。
インデクサーは、インデックスをデータ ソース (通常はテーブル、ビュー、または同等の構造体) に接続し、ソース フィールドをインデックスの同等のフィールドにマップします。 実行中、行セットが自動的に JSON に変換され、指定したインデックスに読み込まれます。 すべてのインデクサーはスケジュールをサポートしているため、データの更新頻度を指定できます。 ほとんどのインデクサーは、変更の追跡を提供します (データ ソースでサポートされている場合)。 インデクサーは、新しいドキュメントを認識するだけでなく、既存のドキュメントの変更と削除を追跡するため、インデックス内のデータをアクティブに管理する必要がありません。
Azure AI Search インデックスにデータをプルする方法
インデクサーベースのインデックス作成には、次のツールと API を使用します。
- データ インポート ウィザードまたはデータのインポートとベクトル化ウィザード
- REST API: インデクサーの作成 (REST)、データ ソースの作成 (REST)、インデックスの作成 (REST)
- Azure SDK for .NET: SearchIndexer、SearchIndexerDataSourceConnection、SearchIndex
- Azure SDK for Python: SearchIndexer、SearchIndexerDataSourceConnection、SearchIndex
- Azure SDK for Java: SearchIndexer、SearchIndexerDataSourceConnection、SearchIndex
- Azure SDK for JavaScript: SearchIndexer、SearchIndexerDataSourceConnection、SearchIndex
インデクサーの機能は、Azure portal、REST API、および .NET SDK で公開されています。
Azure portal を使用する利点は、Azure AI Search では通常、ソース データセットのメタデータを読み取ることでデフォルトのインデックス スキーマを生成できることです。
Search エクスプローラーを使用してデータのインポートを検証する
ドキュメントのアップロード時に事前チェックを実行する簡単な方法は、Azure portal で Search エクスプローラーを使用することです。
エクスプローラーを使用すると、コードを記述することなくインデックスを照会できます。 検索エクスペリエンスは、既定の設定 (単純構文、既定の searchMode クエリ パラメーターなど) に基づきます。 結果は JSON で返されるため、ドキュメント全体を確認できます。
JSON ビューの Search エクスプローラーで実行できるクエリの例を次に示します。 "HotelId" は hotels-sample-index のドキュメント キーです。 フィルターには特定のドキュメントのドキュメント ID を指定します。
{
"search": "*",
"filter": "HotelId eq '50'"
}
REST を使っている場合は、この参照クエリで同じ目的を達成できます。