Eseguire il mapping dell'output arricchito ai campi in un indice di ricerca in Ricerca di intelligenza artificiale di Azure

Fasi indicizzatore

Questo articolo illustra come configurare i mapping dei campi di output, definendo un percorso dati tra le strutture di dati in memoria create durante l'elaborazione del set di competenze e i campi di destinazione in un indice di ricerca. Un mapping dei campi di output viene definito in un indicizzatore e include gli elementi seguenti:

"outputFieldMappings": [
  {
    "sourceFieldName": "document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],

A differenza di una fieldMappings definizione che esegue il mapping di un percorso tra due strutture di dati fisici, una outputFieldMappings definizione esegue il mapping degli arricchimenti in memoria ai campi in un indice di ricerca.

I mapping dei campi di output sono necessari se l'indicizzatore dispone di un set di competenze collegato che crea nuove informazioni, ad esempio la traduzione testuale o l'estrazione di frasi chiave. Durante l'esecuzione dell'indicizzatore, le informazioni generate dall'intelligenza artificiale sono disponibili solo in memoria. Per rendere persistenti queste informazioni in un indice di ricerca, è necessario indicare all'indicizzatore dove inviare i dati.

I mapping dei campi di output possono essere usati anche per recuperare nodi specifici nel tipo complesso di un documento di origine. Ad esempio, è possibile usare solo "FullName/LastName" in una proprietà "FullName" in più parti. Quando non è necessaria la struttura complessa completa, è possibile rendere flat singoli nodi in strutture di dati annidate e quindi usare un mapping dei campi di output per inviare l'output a una raccolta di stringhe nell'indice di ricerca.

I mapping dei campi di output si applicano a:

  • Contenuto in memoria creato da competenze o estratto da un indicizzatore. Il campo di origine è un nodo in un albero del documento arricchito.

  • Indici di ricerca. Se si popola un archivio conoscenze, usare le proiezioni per la configurazione del percorso dati. Se si popolano i campi vettoriali, i mapping dei campi di output non vengono usati.

I mapping dei campi di output vengono applicati dopo l'esecuzione del set di competenze o dopo il cracking del documento se non è presente alcun set di competenze associato.

Definire un mapping dei campi di output

I mapping dei campi di output vengono aggiunti alla outputFieldMappings matrice in una definizione dell'indicizzatore, in genere posizionati dopo la fieldMappings matrice. Un mapping dei campi di output è costituito da tre parti.

"fieldMappings": []
"outputFieldMappings": [
  {
    "sourceFieldName": "/document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],
Proprietà Descrizione
sourceFieldName Obbligatorio. Specifica un percorso per il contenuto arricchito. ad esempio /document/content. Per esempi ed esempi, vedere Arricchimenti di riferimento in un set di competenze di Ricerca di intelligenza artificiale di Azure.
targetFieldName Facoltativo. Specifica il campo di ricerca che riceve il contenuto arricchito. I campi di destinazione devono essere campi o raccolte semplici di primo livello. Non può essere un percorso di un sottocampo in un tipo complesso. Se si desidera recuperare nodi specifici in una struttura complessa, è possibile rendere flat i singoli nodi in memoria e quindi inviare l'output a una raccolta di stringhe nell'indice.
mappingFunction Facoltativo. Aggiunge un'elaborazione aggiuntiva fornita dalle funzioni di mapping supportate dagli indicizzatori. Per i nodi di arricchimento, la codifica e la decodifica sono le funzioni usate più di frequente.

È possibile usare l'API REST o Azure SDK per definire i mapping dei campi di output.

Suggerimento

Gli indicizzatori creati dalla procedura guidata Importa dati includono i mapping dei campi di output generati dalla procedura guidata. Se sono necessari esempi, eseguire la procedura guidata sull'origine dati per visualizzare la definizione sottoposta a rendering.

Usare Create Indexer (REST) o Update Indexer (REST), qualsiasi versione dell'API.

In questo esempio vengono aggiunte entità ed etichette del sentiment estratte dalla proprietà del contenuto di un BLOB ai campi in un indice di ricerca.

PUT https://[service name].search.windows.net/indexers/myindexer?api-version=[api-version]
Content-Type: application/json
api-key: [admin key]
{
    "name": "myIndexer",
    "dataSourceName": "myDataSource",
    "targetIndexName": "myIndex",
    "skillsetName": "myFirstSkillSet",
    "fieldMappings": [],
    "outputFieldMappings": [
        {
            "sourceFieldName": "/document/content/organizations/*/description",
            "targetFieldName": "descriptions",
            "mappingFunction": {
                "name": "base64Decode"
            }
        },
        {
            "sourceFieldName": "/document/content/organizations",
            "targetFieldName": "orgNames"
        },
        {
            "sourceFieldName": "/document/content/sentiment",
            "targetFieldName": "sentiment"
        }
    ]
}

Per ogni mapping dei campi di output, impostare la posizione dei dati nell'albero del documento arricchito (sourceFieldName) e il nome del campo come indicato nell'indice (targetFieldName). Assegnare le funzioni di mapping necessarie per trasformare il contenuto di un campo prima che venga archiviato nell'indice.

Rendere flat strutture complesse in una raccolta di stringhe

Se i dati di origine sono costituiti da JSON annidati o gerarchici, non è possibile usare i mapping dei campi per configurare i percorsi dei dati. L'indice di ricerca deve invece eseguire il mirroring della struttura dei dati di origine per a ogni livello per un'importazione completa.

Questa sezione illustra un processo di importazione che produce una reflection uno-a-uno di un documento complesso sia sul lato di origine che su quello di destinazione. Successivamente, usa lo stesso documento di origine per illustrare il recupero e l'appiattimento dei singoli nodi in raccolte di stringhe.

Ecco un esempio di documento in Azure Cosmos DB con JSON annidato:

{
   "palette":"primary colors",
   "colors":[
      {
         "name":"blue",
         "medium":[
            "acrylic",
            "oil",
            "pastel"
         ]
      },
      {
         "name":"red",
         "medium":[
            "acrylic",
            "pastel",
            "watercolor"
         ]
      },
      {
         "name":"yellow",
         "medium":[
            "acrylic",
            "watercolor"
         ]
      }
   ]
}

Se si vuole indicizzare completamente il documento di origine precedente, è necessario creare una definizione di indice in cui i nomi dei campi, i livelli e i tipi vengono riflessi come tipo complesso. Poiché i mapping dei campi non sono supportati per i tipi complessi nell'indice di ricerca, la definizione dell'indice deve eseguire il mirroring del documento di origine.

{
  "name": "my-test-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true},
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "colors", "type": "Collection(Edm.ComplexType)",
      "fields": [
        {
          "name": "name",
          "type": "Edm.String",
          "searchable": true,
          "retrievable": true
        },
        {
          "name": "medium",
          "type": "Collection(Edm.String)",
          "searchable": true,
          "retrievable": true,
        }
      ]
    }
  ]
}

Ecco una definizione dell'indicizzatore di esempio che esegue l'importazione (si noti che non sono presenti mapping di campi e nessun set di competenze).

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-test-index",

  "fieldMappings": [],
  "outputFieldMappings": []
}

Il risultato è il documento di ricerca di esempio seguente, simile all'originale in Azure Cosmos DB.

{
  "value": [
    {
      "@search.score": 1,
      "id": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "palette": "primary colors",
      "colors": [
        {
          "name": "blue",
          "medium": [
            "acrylic",
            "oil",
            "pastel"
          ]
        },
        {
          "name": "red",
          "medium": [
            "acrylic",
            "pastel",
            "watercolor"
          ]
        },
        {
          "name": "yellow",
          "medium": [
            "acrylic",
            "watercolor"
          ]
        }
      ]
    }
  ]
}

Un rendering alternativo in un indice di ricerca consiste nell'appiattire i singoli nodi nella struttura nidificata dell'origine in una raccolta di stringhe in un indice di ricerca.

Per eseguire questa attività, è necessario un oggetto outputFieldMappings che esegue il mapping di un nodo in memoria a una raccolta di stringhe nell'indice. Anche se i mapping dei campi di output si applicano principalmente agli output delle competenze, è anche possibile usarli per indirizzare i nodi dopo il "document cracking" in cui l'indicizzatore apre un documento di origine e lo legge in memoria.

Di seguito è riportata una definizione di indice di esempio, usando raccolte di stringhe per ricevere l'output flat:

{
  "name": "my-new-flattened-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true },
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "color_names", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true },
    { "name": "color_mediums", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true}
  ]
}

Ecco la definizione dell'indicizzatore di esempio, usando outputFieldMappings per associare il codice JSON annidato ai campi della raccolta di stringhe. Si noti che il campo di origine usa la sintassi del percorso per i nodi di arricchimento, anche se non è presente alcun set di competenze. I documenti arricchiti vengono creati nel sistema durante il cracking dei documenti, il che significa che è possibile accedere ai nodi in ogni albero di documenti, purché tali nodi esistano quando il documento viene rotto.

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-new-flattened-index",
  "parameters": {  },
  "fieldMappings": [   ],
  "outputFieldMappings": [
    {
       "sourceFieldName": "/document/colors/*/name",
       "targetFieldName": "color_names"
    },
    {
       "sourceFieldName": "/document/colors/*/medium",
       "targetFieldName": "color_mediums"
    }
  ]
}

I risultati della definizione precedente sono i seguenti. La semplificazione della struttura perde il contesto in questo caso. Non sono più presenti associazioni tra un determinato colore e i supporti in cui è disponibile. Tuttavia, a seconda dello scenario, un risultato simile a quello illustrato di seguito potrebbe essere esattamente quello necessario.

{
  "value": [
    {
      "@search.score": 1,
      "id": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "palette": "primary colors",
      "color_names": [
        "blue",
        "red",
        "yellow"
      ],
      "color_mediums": [
        "[\"acrylic\",\"oil\",\"pastel\"]",
        "[\"acrylic\",\"pastel\",\"watercolor\"]",
        "[\"acrylic\",\"watercolor\"]"
      ]
    }
  ]
}

Vedi anche