BLOB およびファイルにインデックスを作成して複数の検索ドキュメントを生成する

適用対象: BLOB インデクサーファイル インデクサー

既定では、インデクサーによって、BLOB またはファイルのコンテンツが単一の検索ドキュメントとして扱われます。 検索インデックスで BLOB をより詳細に表現する場合は、1 つの BLOB またはファイルから複数の検索ドキュメントを作成するように parsingMode 値を設定できます。 多くの検索ドキュメントを生成する parsingMode 値には、delimitedText (CSV の場合)、jsonArray または jsonLines (JSON の場合) が含まれます。

これらの解析モードのいずれかを使用する場合、出現する新しい検索ドキュメントには一意のドキュメント キーが必要であり、その値の取得元を決定する際に問題が発生します。 親 BLOB には metadata_storage_path property の形式で一意の値が少なくとも 1 つ含まれていますが、その値が複数の検索ドキュメントに提供される場合、そのキーはインデックス内で一意ではなくなります。

この問題に対処するために、BLOB インデクサーでは、1 つの BLOB 親から作成された各子検索ドキュメントを一意に識別する AzureSearch_DocumentKey を生成します。 この記事では、この動作のしくみについて説明します。

一対多のドキュメント キー

インデックス内の各ドキュメントは、ドキュメント キーによって一意に識別されます。 解析モードが指定されず、検索ドキュメント キーのインデクサー定義に明示的なフィールド マッピングがない場合、BLOB インデクサーでは metadata_storage_path property をドキュメント キーとして自動的にマップします。 この既定のマッピングにより、各 BLOB が個別の検索ドキュメントとして表示されるようになり、このフィールド マッピングを自分で作成する手間が省けます (通常は、同じ名前と型を持つフィールドのみが自動的にマップされます)。

一対多の検索ドキュメント シナリオでは、metadata_storage_path property に基づく暗黙的なドキュメント キーを使用することはできません。 回避策として、Azure AI 検索では、BLOB から抽出された個々のエンティティのドキュメント キーを生成できます。 生成されたキーは AzureSearch_DocumentKey という名前で、各検索ドキュメントに追加されます。 インデクサーでは、各 BLOB から作成された "多数のドキュメント" を追跡し、ソース データが時間の経過と同時に変化したときに検索インデックスの更新を対象にすることができます。

既定では、キー インデックス フィールドに対して明示的なフィールド マッピングが指定されていない場合、base64Encode フィールド マッピング関数を使用して、AzureSearch_DocumentKey がそれにマップされます。

次のフィールドのインデックス定義があるとします。

  • id
  • temperature
  • pressure
  • timestamp

BLOB コンテナーには次の構造の BLOB があります。

Blob1.json

{ "temperature": 100, "pressure": 100, "timestamp": "2024-02-13T00:00:00Z" }
{ "temperature" : 33, "pressure" : 30, "timestamp": "2024-02-14T00:00:00Z" }

Blob2.json

{ "temperature": 1, "pressure": 1, "timestamp": "2023-01-12T00:00:00Z" }
{ "temperature" : 120, "pressure" : 3, "timestamp": "2022-05-11T00:00:00Z" }

インデクサーを作成し、キー フィールドに対して明示的なフィールド マッピングを指定せずに、parsingModejsonLines に設定すると、以下のマッピングが暗黙的に適用されます。

{
    "sourceFieldName" : "AzureSearch_DocumentKey",
    "targetFieldName": "id",
    "mappingFunction": { "name" : "base64Encode" }
}

このセットアップでは、次の図のように明確なドキュメント キーが生成されます (簡潔にするために、base64 でエンコードされた ID が短縮されています)。

ID 温度 pressure タイムスタンプ
aHR0 ...YjEuanNvbjsx 100 100 2024-02-13T00:00:00Z
aHR0 ...YjEuanNvbjsy 33 30 2024-02-14T00:00:00Z
aHR0 ...YjIuanNvbjsx 1 1 2023-01-12T00:00:00Z
aHR0 ...YjIuanNvbjsy 120 3 2022-05-11T00:00:00Z

インデックス キー フィールドのカスタム フィールド マッピング

前述の例と同じインデックス定義があり、BLOB コンテナーに次の構造の BLOB があるとします。

Blob1.json

recordid, temperature, pressure, timestamp
1, 100, 100,"2024-02-13T00:00:00Z" 
2, 33, 30,"2024-02-14T00:00:00Z" 

Blob2.json

recordid, temperature, pressure, timestamp
1, 1, 1,"20123-01-12T00:00:00Z" 
2, 120, 3,"2022-05-11T00:00:00Z" 

delimitedTextparsingMode でインデクサーを作成するときに、以下のようにキー フィールドにフィールド マッピング関数を設定するのは自然だと思われるかもしれません。

{
    "sourceFieldName" : "recordid",
    "targetFieldName": "id"
}

しかし、このマッピングでは、インデックスに 4 つのドキュメントは表示されません。recordid フィールドは BLOB 全体で一意ではないためです。 そのため、"1 対多" の解析モードでは、AzureSearch_DocumentKey プロパティからキー インデックス フィールドに適用される暗黙的なフィールド マッピングを利用することをお勧めします。

明示的なフィールド マッピングを設定する場合は、BLOB 全体の個々のエンティティの sourceField がそれぞれ固有であることを確認してください。

Note

抽出されたエンティティごとの一意性を確保するために AzureSearch_DocumentKey で使用される手法は変更される可能性があるため、アプリケーションのニーズに応じて、その値に依存しないようにしてください。

データ内のインデックス キー フィールドを指定する

インデックス定義が前の例と同じで、明示的なフィールド マッピングが指定されずに parsingModejsonLines に設定されているとし (そのため、マッピングは最初の例のようになります)、BLOB コンテナーに、次の構造の BLOB があるとします。

Blob1.json

id, temperature, pressure, timestamp
1, 100, 100,"2024-02-13T00:00:00Z" 
2, 33, 30,"2024-02-14T00:00:00Z"

Blob2.json

id, temperature, pressure, timestamp
1, 1, 1,"2023-01-12T00:00:00Z" 
2, 120, 3,"2022-05-11T00:00:00Z" 

各ドキュメントに id フィールドが含まれることに注意してください。このフィールドは、インデックスで key フィールドとして定義されます。 このような場合、ドキュメント固有の AzureSearch_DocumentKey が生成されても、これはドキュメントの "キー" として使用されません。 代わりに、id フィールドの値が key フィールドにマップされます

以前の例と同様、このマッピングでは、インデックスに 4 つのドキュメントは表示されません。id フィールドは BLOB 全体で一意ではないためです。 この場合、id を指定する json エントリによって、新しいドキュメントのアップロードではなく、既存のドキュメントのマージが行なわれ、インデックスの状態には、id が指定された最新の読み取りエントリが反映されます。

次のステップ

BLOB インデックス作成の基本的な構造とワークフローにまだ慣れていない場合は、最初に Azure AI Search を使用した Azure Blob Storage のインデックス作成 を確認する必要があります。 さまざまな種類の BLOB コンテンツ タイプ の解析モードに関する詳細については、次の記事を参照してください。