Indicizzare i dati da Azure Data Lake Storage Gen2

Questo articolo illustra come configurare un indicizzatore che importa contenuto da Azure Data Lake Storage (ADLS) Gen2 e lo rende ricercabile in Azure AI Search. Gli input per l'indicizzatore sono i BLOB, in un singolo contenitore. L'output è un indice di ricerca con contenuto ricercabile e metadati archiviati in singoli campi.

Questo articolo integra Creare un indicizzatore con informazioni specifiche per l'indicizzazione da ADLS Gen2. Esso usa le API REST per illustrare un flusso di lavoro a tre passaggi comune a tutti gli indicizzatori: creare un'origine dati, creare un indice, creare un indicizzatore. L'estrazione di dati si verifica all’invio della richiesta Crea indicizzatore.

Per un esempio di codice in C#, vedere Indicizzare Data Lake Gen2 usando Microsoft Entra ID in GitHub.

Prerequisiti

  • ADLS Gen2 con spazio dei nomi gerarchico abilitato. ADLS Gen2 è disponibile tramite Archiviazione di Azure. Quando si configura un account di archiviazione, è possibile abilitare lo spazio dei nomi gerarchico, organizzando i file in una gerarchia di directory e sottodirectory annidate. Abilitando uno spazio dei nomi gerarchico, si abilita ADLS Gen2.

  • I livelli di accesso per ADLS Gen2 includono accesso frequente, accesso sporadico e archivio. È possibile accedere solo agli indicizzatori di ricerca ad accesso frequente e sporadico.

  • BLOB contenenti testo. Se si dispone di dati binari, è possibile includere l'arricchimento tramite intelligenza artificiale per l'analisi delle immagini. Il contenuto del BLOB non può superare i limiti dell'indicizzatore per il livello di servizio di ricerca.

  • Autorizzazioni di lettura in Archiviazione di Azure. Una stringa di connessione ad “accesso completo” include una chiave che concede l'accesso al contenuto, ma se si usano invece i ruoli di Azure, assicurarsi che l'identità gestita del servizio di ricerca abbia le autorizzazioni di Lettore di Storage Blob Data.

  • Usare un client REST per formulare chiamate REST analoghe a quelle illustrate in questo articolo.

Nota

Azure Data Lake Storage Gen2 implementa un modello di controllo di accesso che supporta sia il controllo degli accessi in base al ruolo di Azure che gli elenchi di controllo di accesso (ACL) di tipo POSIX. Azure AI Search non supporta le autorizzazioni a livello di documento. Tutti gli utenti hanno lo stesso livello di accesso a tutti i contenuti ricercabili e recuperabili nell'indice. Se le autorizzazioni a livello di documento sono un requisito dell'applicazione, prendere in considerazione la limitazione della sicurezza come potenziale soluzione.

Formati di documento supportati

L'indicizzatore ADLS Gen2 può estrarre testo dai formati di documento seguenti:

  • CSV (vedere Indicizzazione di BLOB CSV)
  • EML
  • EPUB
  • GZ
  • HTML
  • JSON (vedere Indicizzazione di BLOB JSON)
  • KML (XML per le rappresentazioni geografiche)
  • Formati di Microsoft Office: DOCX/DOC/DOCM, XLSX/XLS/XLSM, PPTX/PPTM, MSG (messaggi di posta elettronica di Outlook), XML (sia 2003 che 2006 WORD XML)
  • Formati di documento aperti: ODT, ODS, ODP
  • PDF
  • File di testo normale (vedere anche Indicizzazione di testo normale)
  • RTF
  • XML
  • ZIP

Determinare i BLOB da indicizzare

Prima di configurare l'indicizzazione, esaminare i dati di origine per stabilire se devono essere apportate in anticipo eventuali modifiche. Un indicizzatore può indicizzare il contenuto da un contenitore alla volta. Per impostazione predefinita, tutti i BLOB nel contenitore vengono elaborati. Sono disponibili diverse opzioni per un'elaborazione più selettiva:

  • Posizionare i BLOB in una cartella virtuale. Una definizione di origine dati di un indicizzatore include un parametro "query" che può accettare una cartella virtuale. Se si specifica una cartella virtuale, solo i BLOB in tale cartella vengono indicizzati.

  • Includere o escludere BLOB in base al tipo di file. L'elenco dei formati di documento supportati consente di determinare quali BLOB escludere. Ad esempio, è possibile escludere file immagine o audio che non forniscono testo ricercabile. Questa funzionalità viene controllata tramite le impostazioni di configurazione nell'indicizzatore.

  • Includere o escludere BLOB arbitrari. Se si desidera, per qualsiasi motivo, ignorare un BLOB specifico, è possibile aggiungere le seguenti proprietà e valori di metadati ai BLOB nell'archiviazione BLOB. Quando un indicizzatore rileva tale proprietà, ignora il BLOB o il relativo contenuto nell'esecuzione dell'indicizzazione.

    Nome della proprietà Valore proprietà Spiegazione
    "AzureSearch_Skip" "true" Indica all'indicizzatore BLOB di ignorare completamente il BLOB. Non verrà tentata l'estrazione dei metadati né del contenuto. È utile quando un determinato BLOB ha ripetutamente esito negativo e interrompe il processo di indicizzazione.
    "AzureSearch_SkipContent" "true" Ignora il contenuto ed estrae solo i metadati. Ciò equivale all'impostazione "dataToExtract" : "allMetadata" descritta in Impostazioni di configurazione, con ambito limitato a uno specifico BLOB.

Se non si configurano criteri di inclusione o esclusione, l'indicizzatore segnalerà un BLOB non idoneo come errore prima di procedere. Se si verificano abbastanza errori, l'elaborazione potrebbe interrompersi. È possibile specificare la tolleranza di errore nelle impostazioni di configurazione dell'indicizzatore.

Generalmente, un indicizzatore crea un documento di ricerca per ogni BLOB, in cui il contenuto di testo e i metadati vengono acquisiti come campi ricercabili all’interno di un indice. Se i BLOB sono interi file, è possibile analizzarli in più documenti di ricerca. Ad esempio, è possibile analizzare le righe in un file CSV per creare un documento di ricerca per ciascuna riga.

Indicizzazione di metadati BLOB

Anche i metadati di BLOB possono essere indicizzati; questa è un’operazione utile se si ritiene che una delle proprietà dei metadati standard o personalizzate potrà risultare vantaggiosa in filtri e query.

Le proprietà dei metadati specificate dall'utente vengono estratte letteralmente. Per ricevere i valori, è necessario definire il campo nell'indice di ricerca di tipo Edm.String, con lo stesso nome della chiave di metadati del BLOB. Ad esempio, se un BLOB ha una chiave di metadati di Sensitivity con valore High, è necessario definire un campo denominato Sensitivity nell'indice di ricerca, che verrà popolato con il valore High.

Le proprietà dei metadati dei BLOB standard possono essere estratte in campi denominati e tipizzati in modo analogo, come indicato di seguito. L'indicizzatore di BLOB crea automaticamente mapping di campi interni per queste proprietà di metadati BLOB, convertendo il nome con trattini originale ("metadata-storage-name") in un nome equivalente con trattini bassi ("metadata_storage_name").

È comunque necessario aggiungere i campi con trattini bassi alla definizione dell'indice, ma è possibile omettere i mapping dei campi, poiché l'indicizzatore eseguirà l'associazione automaticamente.

  • metadata_storage_name (Edm.String): nome del file del BLOB. Se, ad esempio, è presente un BLOB /my-container/my-folder/subfolder/resume.pdf, il valore di questo campo è resume.pdf.

  • metadata_storage_path (Edm.String): URI completo del BLOB, incluso l'account di archiviazione. Ad esempio, https://myaccount.blob.core.windows.net/my-container/my-folder/subfolder/resume.pdf

  • metadata_storage_content_type (Edm.String): tipo di contenuto specificato dal codice utilizzato per caricare il BLOB. Ad esempio: application/octet-stream.

  • metadata_storage_last_modified (Edm.DateTimeOffset): timestamp dell'ultima modifica per il BLOB. Azure AI Search usa questo timestamp per identificare i BLOB modificati, in modo da evitare di reindicizzare tutto dopo l'indicizzazione iniziale.

  • metadata_storage_size (Edm.Int64): dimensioni del BLOB in byte.

  • metadata_storage_content_md5 (Edm.String): hash MD5 del contenuto del BLOB, se disponibile.

  • metadata_storage_sas_token (Edm.String): token di firma di accesso condiviso temporaneo che può essere usato dalle competenze personalizzate per ottenere l'accesso al BLOB. Questo token non deve essere archiviato per uso successivo poiché potrebbe scadere.

Infine, tutte le proprietà dei metadati specifiche del formato documento dei BLOB indicizzati possono essere rappresentate anche nello schema dell'indice. Per altre informazioni sui metadati specifici del contenuto, vedere Proprietà dei metadati del contenuto.

È importante sottolineare che non è necessario definire i campi per tutte le proprietà precedenti nell'indice di ricerca, ma solo acquisire le proprietà necessarie per l'applicazione.

Definire l'origine dati

La definizione dell'origine dati specifica i dati da indicizzare e credenziali e criteri per identificare modifiche nei dati. Un’origine dati è definita come risorsa indipendente affinché possa essere usata da più indicizzatori.

  1. Creare o aggiornare un'origine dati per impostarne la definizione:

    {
        "name" : "my-adlsgen2-datasource",
        "type" : "adlsgen2",
        "credentials" : { "connectionString" : "DefaultEndpointsProtocol=https;AccountName=<account name>;AccountKey=<account key>;" },
        "container" : { "name" : "my-container", "query" : "<optional-virtual-directory-name>" }
    }
    
  2. Impostare "type" su "adlsgen2" (obbligatorio).

  3. Impostare "credentials" su una stringa di connessione di Archiviazione di Azure. Nella sezione successiva vengono descritti i formati supportati.

  4. Impostare "container" sul contenitore BLOB e usare "query" per specificare eventuali sottocartelle.

Una definizione di origine dati può includere anche criteri di eliminazione temporanea, se si desidera che l'indicizzatore elimini un documento di ricerca quando il documento di origine viene contrassegnato per l'eliminazione.

Credenziali e stringhe di connessione supportate

Gli indicizzatori possono connettersi a un contenitore BLOB usando le connessioni seguenti.

Stringa di connessione dell'account di archiviazione con accesso completo
{ "connectionString" : "DefaultEndpointsProtocol=https;AccountName=<your storage account>;AccountKey=<your account key>;" }
È possibile ottenere la stringa di connessione dalla pagina Account di archiviazione nel portale di Azure selezionando Chiavi di accesso nel riquadro di spostamento sinistro. Assicurarsi di selezionare una stringa di connessione completa e non soltanto una chiave.
Stringa di connessione con identità gestita
{ "connectionString" : "ResourceId=/subscriptions/<your subscription ID>/resourceGroups/<your resource group name>/providers/Microsoft.Storage/storageAccounts/<your storage account name>/;" }
Questa stringa di connessione non richiede una chiave dell'account, ma è necessario aver configurato in precedenza un servizio di ricerca per la connessione tramite un'identità gestita.
Stringa di connessione dell'account di archiviazione con firma di accesso condiviso** (SAS)
{ "connectionString" : "BlobEndpoint=https://<your account>.blob.core.windows.net/;SharedAccessSignature=?sv=2016-05-31&sig=<the signature>&spr=https&se=<the validity end time>&srt=co&ss=b&sp=rl;" }
La firma di accesso condiviso deve avere le autorizzazioni per le operazioni di elenco e lettura per i contenitori e gli oggetti (BLOB).

Nota

Se si usano le credenziali di firma di accesso condiviso, sarà necessario aggiornare periodicamente le credenziali dell'origine dati con firme rinnovate per impedire che scadano. Se le credenziali di firma di accesso condiviso dovessero scadere, l'indicizzatore avrà esito negativo con un messaggio di errore simile al seguente: "Le credenziali specificate nella stringa di connessione non sono valide o sono scadute".

Aggiungere campi di ricerca a un indice

In un indice di ricerca, aggiungere campi per accettare il contenuto e i metadati dei BLOB di Azure.

  1. Creare o aggiornare un indice per definire i campi di ricerca che archivieranno contenuto e metadati BLOB:

    {
        "name" : "my-search-index",
        "fields": [
            { "name": "ID", "type": "Edm.String", "key": true, "searchable": false },
            { "name": "content", "type": "Edm.String", "searchable": true, "filterable": false },
            { "name": "metadata_storage_name", "type": "Edm.String", "searchable": false, "filterable": true, "sortable": true  },
            { "name": "metadata_storage_size", "type": "Edm.Int64", "searchable": false, "filterable": true, "sortable": true  },
            { "name": "metadata_storage_content_type", "type": "Edm.String", "searchable": false, "filterable": true, "sortable": true }     
        ]
    }
    
  2. Creare un campo chiave documento ("chiave": true). Per il contenuto di BLOB, le opzioni migliori sono le proprietà dei metadati.

    • metadata_storage_path (impostazione predefinita) percorso completo dell'oggetto o del file. Il campo chiave ("ID" in questo esempio) verrà popolato con valori di metadata_storage_path, poiché si tratta dell'impostazione predefinita.

    • metadata_storage_name, utilizzabile solo se i nomi sono univoci. Se si vuole usare questo campo come chiave, trasferire "key": true a questa definizione di campo.

    • Proprietà dei metadati personalizzata aggiunta ai BLOB. Questa opzione richiede che il processo di caricamento del BLOB aggiunga la proprietà dei metadati a tutti i BLOB. Poiché la chiave è una proprietà obbligatoria, gli eventuali BLOB che mancano di un valore non potranno essere indicizzati. Se si usa una proprietà di metadati personalizzata come chiave, evitare di apportare modifiche a tale proprietà. Se la proprietà della chiave viene modificata, gli indicizzatori aggiungeranno documenti duplicati per lo stesso BLOB.

    Le proprietà dei metadati includono spesso caratteri, ad esempio / e -, non validi per le chiavi del documento. L'indicizzatore codifica automaticamente la proprietà dei metadati della chiave, senza che sia richiesta alcuna configurazione o mapping dei campi.

  3. Aggiungere un campo "contenuto" per archiviare il testo estratto da ogni file tramite la proprietà "contenuto" del BLOB. Non è necessario usare questo nome, ma in questo modo è possibile sfruttare i mapping dei campi impliciti.

  4. Aggiungere campi per le proprietà dei metadati standard. L'indicizzatore può leggere le proprietà dei metadati personalizzate, le proprietà dei metadati standard e le proprietà dei metadati specifiche del contenuto.

Configurare ed eseguire l'indicizzatore ADLS Gen2

Dopo aver creato l'indice e l'origine dati, è possibile creare l'indicizzatore. La configurazione dell'indicizzatore specifica gli input, i parametri e le proprietà che controllano i comportamenti della fase di esecuzione. È inoltre possibile specificare le parti di un BLOB da indicizzare.

  1. Creare o aggiornare l'indicizzatore assegnandogli un nome e il riferimento all’origine dati e all'indice di destinazione:

    {
      "name" : "my-adlsgen2-indexer",
      "dataSourceName" : "my-adlsgen2-datasource",
      "targetIndexName" : "my-search-index",
      "parameters": {
          "batchSize": null,
          "maxFailedItems": null,
          "maxFailedItemsPerBatch": null,
          "configuration": {
              "indexedFileNameExtensions" : ".pdf,.docx",
              "excludedFileNameExtensions" : ".png,.jpeg",
              "dataToExtract": "contentAndMetadata",
              "parsingMode": "default"
          }
      },
      "schedule" : { },
      "fieldMappings" : [ ]
    }
    
  2. Impostare "batchSize" se il valore predefinito (10 documenti) è sottoutilizzato o sovraccarica le risorse disponibili. Le dimensioni batch predefinite sono specifiche dell'origine dati. L’indicizzazione dei BLOB limita le dimensioni dei batch a 10 documenti, tenendo in considerazione le dimensioni medie maggiori dei documenti.

  3. In "configurazione", controllare quali BLOB vengono indicizzati in base al tipo di file oppure lasciare non specificato per recuperare tutti i BLOB.

    Per "indexedFileNameExtensions", specificare un elenco di estensioni di file delimitato da virgole (precedute da un punto). Eseguire la stessa operazione per "excludedFileNameExtensions" a indicare quali estensioni devono essere ignorate. Se la stessa estensione si trova in entrambi gli elenchi, verrà esclusa dall'indicizzazione.

  4. In "configurazione", impostare "dataToExtract" per controllare quali parti dei BLOB siano indicizzate:

  5. In "configurazione", impostare "parsingMode" se i BLOB devono essere mappati a più documenti di ricerca o se sono costituiti da file di testo normale, documenti JSON o CSV.

  6. Specificare i mapping dei campi se sono presenti differenze nel nome o nel tipo di campo oppure se sono necessarie più versioni di un campo di origine nell'indice di ricerca.

    Nell'indicizzazione di BLOB, è spesso possibile omettere i mapping dei campi, poiché l'indicizzatore dispone di supporto integrato per il mapping delle proprietà dei metadati e del "contenuto" a campi denominati e tipizzati in modo analogo all’interno di un indice. Per le proprietà dei metadati, l'indicizzatore sostituirà automaticamente i trattini - con trattini bassi nell'indice di ricerca.

  7. Per ulteriori informazioni su altre proprietà, vedere Creare un indicizzatore. Per l'elenco completo delle descrizioni dei parametri, vedere Creare un indicizzatore (REST) nell’API REST.

Un indicizzatore viene eseguito automaticamente al momento della sua creazione. È possibile ovviare a questo problema impostando "disabilitato" su true. Per controllare l'esecuzione dell'indicizzatore, eseguire un indicizzatore su richiesta o inserirlo in una pianificazione.

Controllare lo stato dell'indicizzatore

Per monitorare lo stato dell'indicizzatore e la cronologia di esecuzione, inviare una richiesta Ottieni stato dell’indicizzatore:

GET https://myservice.search.windows.net/indexers/myindexer/status?api-version=2024-07-01
  Content-Type: application/json  
  api-key: [admin key]

La risposta include lo stato e il numero di elementi elaborati. Dovrebbe risultare simile all'esempio seguente:

    {
        "status":"running",
        "lastResult": {
            "status":"success",
            "errorMessage":null,
            "startTime":"2024-02-21T00:23:24.957Z",
            "endTime":"2024-02-21T00:36:47.752Z",
            "errors":[],
            "itemsProcessed":1599501,
            "itemsFailed":0,
            "initialTrackingState":null,
            "finalTrackingState":null
        },
        "executionHistory":
        [
            {
                "status":"success",
                "errorMessage":null,
                "startTime":"2024-02-21T00:23:24.957Z",
                "endTime":"2024-02-21T00:36:47.752Z",
                "errors":[],
                "itemsProcessed":1599501,
                "itemsFailed":0,
                "initialTrackingState":null,
                "finalTrackingState":null
            },
            ... earlier history items
        ]
    }

La cronologia di esecuzione contiene fino a 50 esecuzioni completate più recenti in ordine cronologico inverso, in modo che l'esecuzione più recente venga visualizzata per prima.

Gestione degli errori

Gli errori che si verificano comunemente durante l'indicizzazione includono tipi di contenuto non supportati, contenuto mancante o BLOB sovradimensionati.

Per impostazione predefinita, l'indicizzatore BLOB si arresta non appena viene rilevato un BLOB con un tipo di contenuto non supportato, ad esempio un'immagine. È possibile usare il parametro "excludedFileNameExtensions" per ignorare determinati tipi di contenuto. Tuttavia, potrebbe essere necessario procedere con l'indicizzazione anche se si verificano errori e quindi eseguire il debug di singoli documenti in un secondo momento. Per altre informazioni sugli errori dell'indicizzatore, vedere Indicazioni sulla risoluzione dei problemi relativi all'indicizzatore e Errori e avvisi dell'indicizzatore.

Esistono cinque proprietà dell'indicizzatore che controllano la risposta dell'indicizzatore quando si verificano errori.

PUT /indexers/[indexer name]?api-version=2024-07-01
{
  "parameters" : { 
    "maxFailedItems" : 10, 
    "maxFailedItemsPerBatch" : 10,
    "configuration" : { 
        "failOnUnsupportedContentType" : false, 
        "failOnUnprocessableDocument" : false,
        "indexStorageMetadataOnlyForOversizedDocuments": false
    }
  }
}
Parametro Valori validi Descrizione
"maxFailedItems" -1, null o 0, numero intero positivo Continuare l'indicizzazione se si verificano errori in qualsiasi momento dell'elaborazione, durante l'analisi dei BLOB o durante l'aggiunta di documenti a un indice. Impostare queste proprietà sul numero di errori accettabili. Un valore -1 consente l'elaborazione indipendentemente dal numero di errori che si verificano. Altrimenti, il valore è un numero intero positivo.
"maxFailedItemsPerBatch" -1, null o 0, numero intero positivo Come sopra, ma usato per l'indicizzazione batch.
"failOnUnsupportedContentType" true o false Se l'indicizzatore non è in grado di determinare il tipo di contenuto, specificare se continuare o non eseguire il processo.
"failOnUnprocessableDocument" true o false Se l'indicizzatore non è in grado di elaborare un documento con un tipo di contenuto altrimenti supportato, specificare se continuare o non eseguire il processo.
"indexStorageMetadataOnlyForOversizedDocuments" true o false I BLOB sovradimensionati vengono gestiti come errori per impostazione predefinita. Se si imposta questo parametro su true, l'indicizzatore tenterà di indicizzare i metadati anche se il contenuto non può essere indicizzato. Per informazioni sulle limitazione delle dimensioni dei BLOB, vedere Limiti del servizio.

Limiti

  1. A differenza degli indicizzatori BLOB, gli indicizzatori ADLS Gen2 non possono usare token di firma di accesso condiviso a livello di contenitore per enumerare e indicizzare il contenuto da un account di archiviazione. Ciò è dovuto al fatto che l'indicizzatore esegue un controllo per determinare se l'account di archiviazione disponga di spazi dei nomi gerarchici abilitati chiamando l'API Filesystem - Get properties. Per gli account di archiviazione in cui gli spazi dei nomi gerarchici non sono abilitati, è invece consigliabile usare indicizzatori BLOB al fine di garantire un'enumerazione efficiente dei BLOB.

  2. Se la proprietà metadata_storage_path è mappata così da essere il campo chiave dell’indice, non è garantito che i BLOB vengano reindicizzati dopo la ridenominazione di una directory. Se si desidera reindicizzare i BLOB che fanno parte delle directory rinominate, aggiornare i timestamp LastModified per tutti.

Passaggi successivi

Ora è possibile eseguire l'indicizzatore, monitorare lo stato o pianificare l'esecuzione dell'indicizzatore. Gli articoli seguenti si applicano agli indicizzatori che eseguono il pull di contenuto da Archiviazione di Azure: