Zuordnen der angereicherten Ausgabe zu Feldern in einem Suchindex in Azure AI Search

Indexerphasen

In diesem Artikel wird erläutert, wie Sie Ausgabefeldzuordnungen einrichten, die einen Datenpfad zwischen In-Memory-Datenstrukturen, die während der Verarbeitung von Skillsets erstellt wurden, und Zielfelder in einem Suchindex festlegen. Eine Ausgabefeldzuordnung wird in einem Indexer definiert und enthält die folgenden Elemente:

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

Im Gegensatz zu einer fieldMappings-Definition, die einen Pfad zwischen zwei physischen Datenstrukturen zuordnet, werden durch eine outputFieldMappings-Definition In-Memory-Anreicherungen zu Feldern in einem Suchindex zugeordnet.

Ausgabefeldzuordnungen sind erforderlich, wenn Ihr Indexer über ein angefügtes Skillset verfügt, das neue Informationen erstellt, z. B. Textübersetzung oder Schlüsselbegriffserkennung. Während der Indexerausführung sind die von der KI generierten Informationen nur im Arbeitsspeicher vorhanden. Um diese Informationen dauerhaft in einen Suchindex zu übernehmen, müssen Sie dem Indexer mitteilen, wohin die Daten gesendet werden sollen.

Ausgabefeldzuordnungen können auch verwendet werden, um bestimmte Knoten im komplexen Typ eines Quelldokuments abzurufen. Sie könnten in einer mehrteiligen FullName-Eigenschaft zum Beispiel nur „FullName/LastName“ verwenden wollen. Wenn Sie die vollständige komplexe Struktur nicht benötigen, können Sie einzelne Knoten in einer geschachtelten Datenstruktur vereinfachen und dann eine Ausgabefeldzuordnung verwenden, um die Ausgabe an eine Zeichenfolgensammlung in Ihrem Suchindex zu senden.

Ausgabefeldzuordnungen gelten für:

  • Inhalte im Arbeitsspeicher, die von Skills erstellt oder von einem Indexer extrahiert werden. Das Quellfeld ist ein Knoten in einer angereicherten Dokumentenstruktur.

  • Suchindizes. Wenn Sie einen Wissensspeicher auffüllen, verwenden Sie Projektionen für die Datenpfadkonfiguration. Wenn Sie Vektorfelder auffüllen, werden keine Ausgabefeldzuordnungen verwendet.

Die Ausgabefeldzuordnungen werden nach der Skillset-Ausführung oder nach der Dokumententschlüsselung angewendet, wenn kein zugeordnetes Skillset vorhanden ist.

Definieren einer Ausgabefeldzuordnung

Ausgabefeldzuordnungen werden dem outputFieldMappings-Array in einer Indexerdefinition hinzugefügt und in der Regel nach dem fieldMappings-Array platziert. Eine Ausgabefeldzuordnung besteht aus drei Teilen.

"fieldMappings": []
"outputFieldMappings": [
  {
    "sourceFieldName": "/document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],
Eigenschaft Beschreibung
sourceFieldName Erforderlich. Gibt einen Pfad zum angereicherten Inhalt an. Ein Beispiel wäre /document/content. Weitere Informationen zur Pfadsyntax und Beispiele finden Sie unter Referenzanreicherungen in einem Azure KI-Suche-Skillset.
targetFieldName Optional. Gibt das Suchfeld an, das den angereicherten Inhalt empfängt. Zielfelder müssen einfache Felder oder Sammlungen auf oberster Ebene sein. Es kann kein Pfad zu einem Unterfeld in einem komplexen Typ sein. Wenn Sie bestimmte Knoten in einer komplexen Struktur abrufen möchten, können Sie einzelne Knoten im Arbeitsspeicher vereinfachen und dann die Ausgabe an eine Zeichenfolgensammlung in Ihrem Index senden.
mappingFunction Optional. Fügt zusätzliche Verarbeitung durch von Indexern unterstützte Zuordnungsfunktionen hinzu. Bei Anreicherungsknoten sind Codierung und Decodierung die am häufigsten verwendeten Funktionen.

Zum Definieren von Ausgabefeldzuordnungen können Sie die REST-API oder ein Azure SDK verwenden.

Tipp

Vom Datenimport-Assistenten erstellte Indexer umfassen vom Assistenten generierte Ausgabefeldzuordnungen. Wenn Sie Beispiele benötigen, führen Sie den Assistenten über Ihre Datenquelle aus, um die gerenderte Definition anzuzeigen.

Verwenden Sie Create Indexer (REST) oder Update Indexer (REST), eine beliebige API-Version.

In diesem Beispiel werden Entitäten und Stimmungsbezeichnungen aus der Inhaltseigenschaft eines Blobs extrahiert und zu Feldern in einem Suchindex hinzugefügt.

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"
        }
    ]
}

Legen Sie für jede Ausgabefeldzuordnung den Speicherort der Daten der angereicherten Dokumentstruktur (sourceFieldName) und den Namen des im Index referenzierten Feldes (targetFieldName) fest. Weisen Sie alle Zuordnungsfunktionen zu, die benötigt werden, um den Inhalt eines Felds zu transformieren, bevor es im Index gespeichert wird.

Vereinfachen komplexer Strukturen in eine Zeichenfolgensammlung

Wenn Ihre Quelldaten aus geschachtelten oder hierarchischen JSON-Daten bestehen, können Sie keine Feldzuordnungen verwenden, um die Datenpfade einzurichten. Stattdessen muss ihr Suchindex für einen vollständigen Import die Quelldatenstruktur jeder Ebene spiegeln.

In diesem Abschnitt werden Sie durch einen Importprozess geführt, der eine 1-1-Spiegelung eines komplexen Dokuments auf Quell- und Zielseite erzeugt. Als Nächstes wird das gleiche Quelldokument verwendet, um den Abruf und die Vereinfachung einzelner Knoten in Zeichenfolgensammlungen zu veranschaulichen.

Im Folgenden finden Sie ein Beispiel für ein Dokument in Azure Cosmos DB mit geschachtelten JSON-Daten:

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

Wenn Sie das obige Quelldokument vollständig indizieren möchten, erstellen Sie eine Indexdefinition, in der die Feldnamen, Ebenen und Typen als komplexer Typ dargestellt werden. Da Feldzuordnungen für komplexe Typen im Suchindex nicht unterstützt werden, muss ihre Indexdefinition das Quelldokument spiegeln.

{
  "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,
        }
      ]
    }
  ]
}

Nachfolgend finden Sie ein Beispiel für eine Indexerdefinition zur Ausführung des Imports (beachten Sie, dass keine Feldzuordnungen und kein Skillset vorhanden sind).

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

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

Das Ergebnis ist das folgende Beispielsuchdokument, ähnlich dem Original 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"
          ]
        }
      ]
    }
  ]
}

Ein alternatives Rendering in einem Suchindex besteht darin, einzelne Knoten in der geschachtelten Struktur der Quelle in eine Zeichenfolgensammlung in einem Suchindex zu vereinfachen.

Um diese Aufgabe auszuführen, benötigen Sie einen outputFieldMappings, der einen In-Memory-Speicherknoten einer Zeichenfolgensammlung im Index zuordnet. Die Ausgabefeldzuordnungen werden zwar hauptsächlich auf Skillausgaben angewendet, Sie können sie aber auch verwenden, um Knoten nach der „Dokumententschlüsselung“ zu adressieren, bei der der Indexer ein Quelldokument öffnet und es in den Arbeitsspeicher liest.

Nachfolgend finden Sie ein Beispiel für eine Indexdefinition, die Zeichenfolgensammlungen verwendet, um eine vereinfachte Ausgabe zu erhalten:

{
  "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}
  ]
}

Nachfolgend finden Sie ein Beispiel für eine Indexerdefinition, die outputFieldMappings verwendet, um die geschachtelten JSON-Daten den Feldern der Zeichenfolgensammlung zuzuordnen. Beachten Sie, dass das Quellfeld die Pfadsyntax für Anreicherungsknoten verwendet, obwohl kein Skillset vorhanden ist. Angereicherte Dokumente werden während der Dokumententschlüsselung im System erstellt. Das bedeutet, Sie können auf Knoten in jeder Dokumentstruktur zugreifen, solange diese Knoten vorhanden sind, wenn das Dokument entschlüsselt wird.

{
  "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"
    }
  ]
}

Die Ergebnisse der obigen Definition sehen wie folgt aus. Bei der Vereinfachung der Struktur geht in diesem Fall Kontext verloren. Es gibt keine Zuordnungen zwischen einer bestimmten Farbe und den Medien, in der sie verfügbar ist. Je nach Ihrem Szenario kann ein Ergebnis ähnlich dem unten gezeigten jedoch genau das sein, was Sie brauchen.

{
  "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\"]"
      ]
    }
  ]
}

Siehe auch