Share via


Mappa berikade utdata till fält i ett sökindex i Azure AI Search

Indexerarsteg

Den här artikeln beskriver hur du konfigurerar mappningar för utdatafält, definierar en datasökväg mellan minnesinterna datastrukturer som skapats under bearbetning av kompetensuppsättningar och målfält i ett sökindex. En mappning av utdatafält definieras i en indexerare och har följande element:

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

Till skillnad från en fieldMappings definition som mappar en sökväg mellan två fysiska datastrukturer mappar en outputFieldMappings definition minnesintern berikning till fält i ett sökindex.

Mappningar av utdatafält krävs om indexeraren har en bifogad kompetensuppsättning som skapar ny information, till exempel textöversättning eller extrahering av nyckelfraser. Under indexeringskörningen finns AI-genererad information endast i minnet. Om du vill spara den här informationen i ett sökindex måste du tala om för indexeraren var data ska skickas.

Utdatafältmappningar kan också användas för att hämta specifika noder i ett källdokuments komplexa typ. Du kanske till exempel bara vill ha "FullName/LastName" i en multidelad "FullName"-egenskap. När du inte behöver den fullständiga komplexa strukturen kan du platta ut enskilda noder i en kapslad datastruktur och sedan använda en utdatafältmappning för att skicka utdata till en strängsamling i sökindexet.

Mappningar av utdatafält gäller för:

  • Minnesinternt innehåll som skapas av kunskaper eller extraheras av en indexerare. Källfältet är en nod i ett berikat dokumentträd.

  • Sök index. Om du fyller i ett kunskapslager använder du projektioner för konfiguration av datasökväg. Om du fyller i vektorfält används inte utdatafältmappningar.

Mappningar av utdatafält tillämpas efter körning av kunskapsuppsättningar eller efter dokumentsprickor om det inte finns någon associerad kompetensuppsättning.

Definiera en mappning av utdatafält

Utdatafältmappningar läggs till i matrisen outputFieldMappings i en indexeraredefinition, som vanligtvis placeras efter matrisen fieldMappings . En mappning av utdatafält består av tre delar.

"fieldMappings": []
"outputFieldMappings": [
  {
    "sourceFieldName": "/document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],
Property beskrivning
sourceFieldName Obligatoriskt. Anger en sökväg till berikat innehåll. Ett exempel kan vara /document/content. Se Referensanrikningar i en Azure AI Search-kompetensuppsättning för sökvägssyntax och exempel.
targetFieldName Valfritt. Anger sökfältet som tar emot det berikade innehållet. Målfält måste vara enkla fält eller samlingar på den översta nivån. Det kan inte vara en sökväg till ett underfält i en komplex typ. Om du vill hämta specifika noder i en komplex struktur kan du platta ut enskilda noder i minnet och sedan skicka utdata till en strängsamling i ditt index.
mappingFunction Valfritt. Lägger till extra bearbetning som tillhandahålls av mappningsfunktioner som stöds av indexerare. För berikande noder är kodning och avkodning de vanligaste funktionerna.

Du kan använda REST-API:et eller en Azure SDK för att definiera mappningar för utdatafält.

Dricks

Indexerare som skapats av guiden Importera data innehåller mappningar av utdatafält som genereras av guiden. Om du behöver exempel kör du guiden över datakällan för att se den renderade definitionen.

Använd Create Indexer (REST) eller Update Indexer (REST), vilken API-version som helst.

Det här exemplet lägger till entiteter och sentimentetiketter som extraherats från en blobs innehållsegenskap till fält i ett sökindex.

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

För varje mappning av utdatafält anger du platsen för data i det berikade dokumentträdet (sourceFieldName) och namnet på fältet enligt indexet (targetFieldName). Tilldela eventuella mappningsfunktioner som behövs för att transformera innehållet i ett fält innan det lagras i indexet.

Platta ut komplexa strukturer till en strängsamling

Om dina källdata består av kapslad eller hierarkisk JSON kan du inte använda fältmappningar för att konfigurera datasökvägarna. I stället måste ditt sökindex spegla källdatastrukturen för på varje nivå för en fullständig import.

Det här avsnittet beskriver en importprocess som skapar en en-till-en-återspegling av ett komplext dokument på både käll- och målsidan. Därefter används samma källdokument för att illustrera hämtning och utplattande av enskilda noder i strängsamlingar.

Här är ett exempel på ett dokument i Azure Cosmos DB med kapslad JSON:

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

Om du vill indexisera källdokumentet ovan helt skulle du skapa en indexdefinition där fältnamnen, nivåerna och typerna återspeglas som en komplex typ. Eftersom fältmappningar inte stöds för komplexa typer i sökindexet måste indexdefinitionen spegla källdokumentet.

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

Här är en exempelindexeringsdefinition som kör importen (observera att det inte finns några fältmappningar och ingen kompetensuppsättning).

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

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

Resultatet är följande exempelsökningsdokument som liknar originalet i 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"
          ]
        }
      ]
    }
  ]
}

En alternativ återgivning i ett sökindex är att platta ut enskilda noder i källans kapslade struktur till en strängsamling i ett sökindex.

För att utföra den här uppgiften behöver du en outputFieldMappings som mappar en minnesintern nod till en strängsamling i indexet. Även om mappningar av utdatafält främst gäller för kunskapsutdata, kan du också använda dem för att adressera noder efter "dokumentsprickor" där indexeraren öppnar ett källdokument och läser det i minnet.

Nedan visas en exempelindexdefinition som använder strängsamlingar för att ta emot utdata som är utplattade:

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

Här är exempelindexeringsdefinitionen som används outputFieldMappings för att associera den kapslade JSON:en med strängsamlingsfälten. Observera att källfältet använder sökvägssyntaxen för berikande noder, även om det inte finns någon kompetensuppsättning. Berikade dokument skapas i systemet under dokumentsprickor, vilket innebär att du kan komma åt noder i varje dokumentträd så länge dessa noder finns när dokumentet är knäckt.

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

Resultatet från ovanstående definition är följande. Om du förenklar strukturen förloras kontexten i det här fallet. Det finns inte längre några associationer mellan en viss färg och de medier som den är tillgänglig i. Beroende på ditt scenario kan dock ett resultat som liknar det som visas nedan vara exakt vad du behöver.

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

Se även