Proiezioni di indici in Azure AI Search

Le proiezioni di indici sono un componente di una definizione del set di competenze che definisce la forma di un indice secondario, supportando un modello di indice uno-a-molti, in cui il contenuto di una pipeline di arricchimento può avere come destinazione più indici.

Le proiezioni di indici prendono contenuti arricchiti da intelligenza artificiale generati da una pipeline di arricchimento e li indicizzano in un indice secondario (diverso da quello di destinazione predefinita di un indicizzatore) nel servizio di ricerca. Le proiezioni di indici consentono inoltre di riorganizzare i dati prima di indicizzarli grazie a un metodo unico che consente di separare una matrice di elementi arricchiti in più documenti di ricerca nell'indice di destinazione, altrimenti nota come indicizzazione "uno-a-molti". L'indicizzazione "uno-a-molti" è utile per scenari di suddivisione in blocchi dei dati, in cui potrebbe essere necessario un indice primario per contenuto non suddiviso in blocchi e un indice secondario per blocchi.

Se si è fatto uso di competenze cognitive in passato, si è già a conoscenza del fatto che i set di competenze creano contenuti arricchiti. I set di competenze passano un documento attraverso una sequenza di arricchimenti che richiamano trasformazioni atomiche, ad esempio il riconoscimento di entità o la traduzione di testo. Per impostazione predefinita, un documento elaborato all'interno di un set di competenze esegue il mapping a un singolo documento nell'indice di ricerca. Ciò significa che se si esegue la suddivisione in blocchi di un testo di input e quindi si eseguono arricchimenti in ogni blocco, il risultato nell'indice quando viene eseguito il mapping tramite outputFieldMappings è una matrice degli arricchimenti generati. Grazie alle proiezioni di indice, si definisce un contesto al quale eseguire il mapping di ogni blocco di dati arricchiti al proprio documento di ricerca. In questo modo, è possibile applicare un mapping uno-a-molti dei dati arricchiti di un documento all'indice di ricerca.

Definizione delle proiezioni di indici

Le proiezioni di indice vengono definite all'interno di una definizione del set di competenze e sono definite principalmente come una matrice di selettori in cui ogni selettore corrisponde a un indice di destinazione diverso nel servizio di ricerca. Ogni selettore richiede i parametri seguenti come parte della propria definizione:

  • targetIndexName: nome dell'indice nel servizio di ricerca in cui viene inserito l'indice dei dati di proiezione dell’indice.
  • parentKeyFieldName: nome del campo nell'indice di destinazione che contiene il valore della chiave per il documento padre.
  • sourceContext: annotazione di arricchimento che definisce la granularità alla quale eseguire il mapping dei dati in singoli documenti di ricerca. Per altre informazioni, vedere Contesto delle competenze e linguaggio di annotazione di input.
  • mappings: matrice di mapping di dati arricchiti a campi nell'indice di ricerca. Ogni mapping è costituito da:
    • name: nome del campo nell'indice di ricerca in cui devono essere indicizzati i dati.
    • source: percorso dell’annotazione di arricchimento da cui devono essere estratti i dati.

Ogni mapping può anche definire ricorsivamente i dati con un campo facoltativo sourceContext e inputs, simile all'archivio conoscenze o alla funzionalità Forma. Questi parametri consentono di modellare i dati da indicizzare in campi di tipo Edm.ComplexType nell'indice di ricerca.

L'indice definito nel parametro targetIndexName presenta i requisiti seguenti:

  • Deve essere già stato creato nel servizio di ricerca prima che venga creato il set di competenze contenente la definizione delle proiezioni di indici.
  • Deve contenere un campo con il nome definito nel parametro parentKeyFieldName. Questo campo deve essere di tipo Edm.String, non può essere il campo chiave e deve essere impostato su true.
  • Il campo chiave deve avere la proprietà ricercabile impostata su true e essere definita con l'analizzatore keyword.
  • I campi devono essere definiti per ognuno degli name definiti in mappings, nessuno dei quali può essere il campo chiave.

Di seguito è riportato un esempio di payload per una definizione di proiezioni di indice che può essere usata per proiettare output di singole pagine dalla competenza Split come documenti personalizzati nell'indice di ricerca.

"indexProjections": {
    "selectors": [
        {
            "targetIndexName": "myTargetIndex",
            "parentKeyFieldName": "ParentKey",
            "sourceContext": "/document/pages/*",
            "mappings": [
                {
                    "name": "chunk",
                    "source": "/document/pages/*"
                }
            ]
        }
    ]
}

Gestione di documenti padre

Poiché le proiezioni di indici generano in pratica documenti "figlio" per ogni documento "padre" eseguito attraverso un set di competenze, sono disponibili anche le opzioni seguenti per gestire l'indicizzazione dei documenti "padre".

  • Per mantenere i documenti padre e figlio in indici separati, è sufficiente assicurarsi che targetIndexName per la definizione dell'indicizzatore sia diverso da targetIndexName definito nel selettore di proiezione dell'indice.

  • Per indicizzare documenti padre e figlio nello stesso indice, è necessario assicurarsi che lo schema per l'indice di destinazione funzioni sia con fieldMappings e outputFieldMappings definiti nella definizione dell’indicizzatore che con mappings nel selettore di proiezione dell'indice. È quindi sufficiente fornire lo stesso targetIndexName per la definizione dell'indicizzatore e il selettore di proiezione dell'indice.

  • Per ignorare documenti padre e indicizzare solo documenti figlio, è comunque necessario specificare un targetIndexName nella definizione dell'indicizzatore (è sufficiente specificare la stessa operazione eseguita per il selettore di proiezione dell'indice). Definire quindi un oggetto parameters diverso accanto alla definizione selectors con una chiave projectionMode impostata su skipIndexingParentDocuments, come illustrato di seguito:

    "indexProjections": {
        "selectors": [
            ...
        ],
        "parameters": {
            "projectionMode": "skipIndexingParentDocuments"
        }
    }
    

Le proiezioni di indici sono disponibili a livello generale. È consigliabile usare l'API stabile più recente.

Ciclo di vita del contenuto

Se l'origine dati dell'indicizzatore supporta il rilevamento di modifiche ed eliminazioni, il processo di indicizzazione può sincronizzare gli indici primari e secondari per rilevare tali modifiche.

Ogni volta che si eseguono l'indicizzatore e il set di competenze, le proiezioni di indice vengono aggiornate se il set di competenze o i dati di origine sono stati modificati. Tutte le modifiche rilevate dall'indicizzatore vengono propagate tramite il processo di arricchimento alle proiezioni nell'indice, assicurandosi che i dati proiettati siano una rappresentazione attuale del contenuto nell'origine dati di origine.

Nota

Anche se è possibile modificare manualmente i dati nei documenti proiettati usando l'API push dell'indice, qualsiasi modifica verrà sovrascritta nella chiamata alla pipeline successiva, presupponendo che il documento nei dati di origine sia aggiornato.

Valore chiave proiettato

Ogni documento di proiezione dell'indice contiene una chiave di identificazione univoca generata dall'indicizzatore per garantire l'univocità e consentire il corretto funzionamento del rilevamento di modifiche ed eliminazioni. Questa chiave contiene i segmenti seguenti:

  • Hash casuale per garantire l'univocità. Questo hash viene modificato se il documento padre viene aggiornato tra le esecuzioni dell'indicizzatore.
  • Chiave del documento padre.
  • Percorso dell’annotazione di arricchimento che identifica il contesto da cui è stato generato il documento.

Ad esempio, se si suddivide un documento padre con il valore chiave "123" in quattro pagine e ognuna di queste pagine viene proiettata come singolo documento tramite proiezioni di indice, la chiave per la terza pagina di testo sarà simile a "01f07abfe7ed_123_pages_2". Se il documento padre viene quindi aggiornato per aggiungere una quinta pagina, la nuova chiave per la terza pagina potrebbe ad esempio essere "9d800bdacc0e_123_pages_2", poiché il valore hash casuale cambia tra le esecuzioni dell'indicizzatore anche se il resto dei dati di proiezione non viene modificato.

Modifiche o aggiunte

Se un documento padre viene modificato in modo che i dati all'interno di un documento di indice proiettato vengano modificati (ad esempio, se una parola è stata modificata in una determinata pagina ma non sono state aggiunte nuove pagine), i dati nell'indice di destinazione per tale proiezione vengono aggiornati in modo da riflettere tale modifica.

Se un documento padre viene modificato in modo da avere nuovi documenti figlio proiettati che non erano presenti in precedenza (ad esempio, se al documento siano state aggiunte una o più pagine di testo), i nuovi documenti figlio vengono aggiunti alla successiva esecuzione dell'indicizzatore.

In entrambi questi casi, tutti i documenti proiettati vengono aggiornati in modo da avere un nuovo valore hash nella chiave, indipendentemente dal fatto che il contenuto specifico sia stato aggiornato.

Deletions

Se un documento padre viene modificato in modo che un documento figlio generato dalle proiezioni di indice non sia più esistente (ad esempio, se un testo viene abbreviato in modo che ci siano meno blocchi), il documento figlio corrispondente nell'indice di ricerca viene eliminato. Anche i documenti figlio rimanenti ottengono la chiave aggiornata in modo da includere un nuovo valore hash, anche se il contenuto non è stato modificato in altro modo.

Se un documento padre viene eliminato completamente dall'origine dati, i documenti figlio corrispondenti vengono eliminati solo se l'eliminazione viene rilevata da dataDeletionDetectionPolicy definito nella definizione dell'origine dati. Se non si dispone di un documento dataDeletionDetectionPolicy configurato e si necessita di eliminare un documento padre dall'origine dati, è necessario eliminare manualmente i documenti figlio se non più necessari.