Mappa berikade utdata till fält i ett sökindex i Azure AI Search
Den här artikeln beskriver hur du konfigurerar mappningar för utdatafält, definierar en datasökväg mellan minnesintern data som genereras under bearbetning av kompetensuppsättningar och målfält i ett sökindex. Under indexeringskörningen finns kunskapsgenererad 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.
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 ordagranna källfält och indexfält mappar en outputFieldMappings
definition minnesintern berikning till fält i ett sökindex.
Förutsättningar
Indexerare, index, datakälla och kompetensuppsättning.
Indexfält måste vara enkla eller översta fält. Du kan inte mata ut till en komplex typ. Men om du har en komplex typ kan du använda en utdatafältdefinition för att platta ut delar av den komplexa typen och skicka dem till en samling i ett sökindex.
När du ska använda en mappning av utdatafält
Utdatafältmappningar krävs om indexeraren har en bifogad kompetensuppsättning som skapar ny information som du vill ha i ditt index. Exempel:
- Vektorer från inbäddningsfärdigheter
- OCR-text (optisk teckenigenkänning) från bildkunskaper
- Platser, organisationer eller personer från entitetsigenkänningskunskaper
Utdatafältmappningar kan också användas för att:
Skapa flera kopior av ditt genererade innehåll (en-till-många-utdatafältmappningar).
Platta ut ett källdokuments komplexa typ. Anta till exempel att källdokument har en komplex typ, till exempel en adress för flera delar, och att du bara vill ha staden. Du kan använda en utdatafältmappning för att platta ut en kapslad datastruktur och sedan använda en mappning av utdatafält för att skicka utdata till en strängsamling i sökindexet.
Mappningar av utdatafält gäller endast för sökindex. Om du fyller i ett kunskapslager använder du projektioner för konfiguration av datasökväg.
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.
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 utdatafältmappningarna i indexeraren.
Använd Create Indexer eller Create or Update Indexer eller en motsvarande metod i en Azure SDK. Här är ett exempel på en indexeraredefinition.
{ "name": "myindexer", "description": null, "dataSourceName": "mydatasource", "targetIndexName": "myindex", "schedule": { }, "parameters": { }, "fieldMappings": [], "outputFieldMappings": [], "disabled": false, "encryptionKey": { } }
Fyll i matrisen
outputFieldMappings
för att ange mappningarna. En fältmappning består av tre delar."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. targetFieldName
är alltid namnet på fältet i sökindexet.sourceFieldName
är en sökväg till en nod i det berikade dokumentet. Det är utdata från en färdighet. Sökvägen börjar alltid med /document, och om du indexerar från en blob är sökvägens andra element /content. Det tredje elementet är värdet som genereras av färdigheten. Mer information och exempel finns i Referensberikningar i en Azure AI Search-kompetensuppsättning.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.
{ "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" } ] }
Tilldela eventuella mappningsfunktioner som behövs för att transformera innehållet i ett fält innan det lagras i indexet. För berikande noder är kodning och avkodning de vanligaste funktionerna.
Mappning av ett-till-många-utdatafält
Du kan använda en mappning av utdatafält för att dirigera ett enda källfält till flera fält i ett sökindex. Du kan göra detta för jämförelsetestning eller om du vill ha fält med olika attribut.
Anta en kompetensuppsättning som genererar inbäddningar för ett vektorfält och ett index som har flera vektorfält som varierar beroende på algoritm- och komprimeringsinställningar. I indexeraren mappar du inbäddningsfärdighetens utdata till vart och ett av de flera vektorfälten i ett sökindex.
"outputFieldMappings": [
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_hnsw" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_eknn" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_narrow" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_no_stored" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_scalar" }
]
Källfältsökvägen är kunskapsutdata. I det här exemplet är utdata text_vector. Målnamnet är en valfri egenskap. Om du inte ger utdatamappningen ett målnamn skulle sökvägen bäddas in eller mer exakt, /document/content/embedding.
{
"name": "test-vector-size-ss",
"description": "Generate embeddings using AOAI",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"name": "#1",
"description": null,
"context": "/document/content",
"resourceUri": "https://my-demo-eastus.openai.azure.com",
"apiKey": null,
"deploymentId": "text-embedding-ada-002",
"dimensions": 1536,
"modelName": "text-embedding-ada-002",
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "embedding",
"targetName": "text_vector"
}
],
"authIdentity": null
}
]
}
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 indexeras fullständigt i det här källdokumentet skapar du 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 exempelindexerardefinition 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": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
"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 även använda dem för att adressera noder efter dokumentsprickor där indexeraren öppnar ett källdokument och läser det i minnet.
Följande exempelindexdefinition 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 definitionen ä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 ett resultat som liknar följande exempel dock vara exakt vad du behöver.
{
"value": [
{
"@search.score": 1,
"id": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
"palette": "primary colors",
"color_names": [
"blue",
"red",
"yellow"
],
"color_mediums": [
"[\"acrylic\",\"oil\",\"pastel\"]",
"[\"acrylic\",\"pastel\",\"watercolor\"]",
"[\"acrylic\",\"watercolor\"]"
]
}
]
}