Indicizzazione di BLOB e file per produrre più documenti di ricerca
Si applica a: Indicizzatori BLOB, Indicizzatori file
Per impostazione predefinita, un indicizzatore considera il contenuto di un BLOB o di un file come singolo documento di ricerca. Se si desidera ottenere una rappresentazione più granulare in un indice di ricerca, è possibile impostare i valori parsingMode per creare più documenti di ricerca da un BLOB o da un file. I valori parsingMode che generano molti documenti di ricerca includono delimitedText
(per CSV) e jsonArray
o jsonLines
(per JSON).
Quando si usa una di queste modalità di analisi, i nuovi documenti di ricerca che emergono devono avere chiavi di documento univoche e si verifica un problema nel determinare la provenienza di tale valore. Il BLOB padre ha almeno un valore univoco sotto forma di metadata_storage_path property
, ma se contribuisce a tale valore per più documenti di ricerca, la chiave non è più univoca nell'indice.
Per risolvere questo problema, l'indicizzatore BLOB genera un oggetto AzureSearch_DocumentKey
che identifica in modo univoco ogni documento di ricerca figlio creato dal singolo elemento padre BLOB. Questo articolo illustra il funzionamento di questa funzionalità.
Chiave documento uno-a-molti
Ogni documento in un indice viene identificato in modo univoco da una chiave del documento. Se non viene specificata alcuna modalità di analisi e se non è presente alcun mapping dei campi esplicito nella definizione dell'indicizzatore per la chiave del documento di ricerca, l'indicizzatore BLOB esegue automaticamente il mapping di metadata_storage_path property
come chiave del documento. Questo mapping predefinito garantisce che ogni BLOB venga visualizzato come documento di ricerca separato e consente di risparmiare il passaggio di dover creare manualmente questo mapping dei campi (in genere il mapping automatico avviene solo i campi con nomi e tipi identici).
In uno scenario di documento di ricerca uno-a-molti, non è possibile usare una chiave di documento implicita basata su metadata_storage_path property
. Come soluzione alternativa, Azure AI Search può generare una chiave di documento per ogni singola entità estratta da un BLOB. La chiave generata è denominata AzureSearch_DocumentKey
e viene aggiunta a ogni documento di ricerca. L'indicizzatore tiene traccia dei "molti documenti" creati da ciascun BLOB e può destinare gli aggiornamenti all'indice di ricerca quando i dati di origine cambiano nel tempo.
Per impostazione predefinita, quando non vengono specificati mapping dei campi espliciti per il campo dell'indice della chiave, viene eseguito il mapping dell'oggetto AzureSearch_DocumentKey
usando la funzione di mapping dei campi base64Encode
.
Esempio
Si supponga una definizione di indice con i campi seguenti:
id
temperature
pressure
timestamp
Il contenitore BLOB include BLOB con la struttura seguente:
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" }
Quando si crea un indicizzatore e si imposta parsingMode per jsonLines
, senza specificare un mapping dei campi esplicito per il campo chiave, viene applicato in modo implicito il mapping seguente.
{
"sourceFieldName" : "AzureSearch_DocumentKey",
"targetFieldName": "id",
"mappingFunction": { "name" : "base64Encode" }
}
Questa configurazione comporta la disambiguazione delle chiavi del documento, similmente alla figura seguente (ID base64-encoded abbreviato per brevità).
ID | temperatura | pressione | timestamp |
---|---|---|---|
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 |
Mapping dei campi personalizzato per il campo chiave di indice
Presumendo la stessa definizione di indice dell'esempio precedente, si supponga che il contenitore BLOB abbia BLOB con la struttura seguente:
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"
Quando si crea un indicizzatore con delimitedText
parsingMode, potrebbe essere naturale configurare una funzione di mapping dei campi per il campo chiave come indicato di seguito:
{
"sourceFieldName" : "recordid",
"targetFieldName": "id"
}
Tuttavia, questo mapping comporterà la mancata visualizzazione di quattro documenti nell'indice perché il campo recordid
non è univoco tra i BLOB. Quindi per le modalità di analisi "uno-a-molti", è consigliabile usare il mapping dei campi implicito applicato dalla proprietà AzureSearch_DocumentKey
per il campo dell'indice della chiave.
Se si vuole configurare un mapping dei campi esplicito, assicurarsi che sourceField sia distinto per ciascuna singola entità in tutti i BLOB.
Nota
L'approccio usato da AzureSearch_DocumentKey
, per garantire l'univocità per ogni entità estratta è soggetto a modifiche e pertanto per le esigenze dell'applicazione, non è consigliabile basarsi sul valore.
Specificare il campo chiave di indice nei dati
Presumendo la stessa definizione di indice dell'esempio precedente con parsingMode impostato su jsonLines
senza specificare un mapping dei campi esplicito così che i mapping siano come nel primo esempio, si supponga che il contenitore BLOB abbia i BLOB con la struttura seguente:
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"
Si noti che ogni documento contiene il campo id
, definito nell’indice come campo key
. In questo caso, anche se verrà generato un documento univoco AzureSearch_DocumentKey
, non sarà usato come "chiave" per il documento. Invece, il valore del campo id
sarà mappato per il campo key
Analogamente all'esempio precedente, questo mapping comporterà la mancata visualizzazione di quattro documenti nell'indice perché il campo id
non è univoco tra i BLOB. In questo caso, qualsiasi voce JSON che specifica un oggetto id
genererà un'unione nel documento esistente anziché il caricamento di un nuovo documento; inoltre lo stato dell'indice rifletterà la voce di lettura più recente con l'oggetto specificato id
.
Passaggi successivi
Se non si ha familiarità con la struttura di base e il flusso di lavoro dell'indicizzazione BLOB, è necessario rivedere prima Indicizzazione di Archiviazione BLOB di Azure con Azure AI Search. Per altre informazioni sulle modalità di analisi per i diversi tipi di contenuto BLOB, vedere gli articoli seguenti.