Indexera JSON-blobar och filer i Azure AI Search
Gäller för: Blob-indexerare, filindexerare
För blobindexering i Azure AI Search visar den här artikeln hur du anger egenskaper för blobar eller filer som består av JSON-dokument. JSON-filer i Azure Blob Storage eller Azure Files förutsätter vanligtvis något av följande formulär:
- Ett enda JSON-dokument
- Ett JSON-dokument som innehåller en matris med välformade JSON-element
- Ett JSON-dokument som innehåller flera entiteter, avgränsade med en ny rad
Blobindexeraren tillhandahåller en parsingMode
parameter för att optimera utdata från sökdokumentet baserat på JSON-strukturen. Parsningslägen består av följande alternativ:
parsingMode | JSON-dokument | beskrivning |
---|---|---|
json |
En per blob | (standard) Parsar JSON-blobar som ett enda textsegment. Varje JSON-blob blir ett enda sökdokument. |
jsonArray |
Flera per blob | Parsar en JSON-matris i bloben, där varje element i matrisen blir ett separat sökdokument. |
jsonLines |
Flera per blob | Parsar en blob som innehåller flera JSON-entiteter (även en matris), med enskilda element avgränsade med en ny rad. Indexeraren startar ett nytt sökdokument efter varje ny rad. |
För både jsonArray
och jsonLines
bör du granska Indexering av en blob för att skapa många sökdokument för att förstå hur blobindexeraren hanterar tvetydighet för dokumentnyckeln för flera sökdokument som skapats från samma blob.
I indexerarens definition kan du ange fältmappningar för att välja vilka egenskaper för JSON-källdokumentet som ska användas för att fylla i målsökningsindexet . När du till exempel använder jsonArray
parsningsläget, om matrisen finns som en lägre egenskap, kan du ange egenskapen "documentRoot" som anger var matrisen placeras i bloben.
Kommentar
När ett JSON-parsningsläge används förutsätter Azure AI Search att alla blobar använder samma parser (antingen för json
eller jsonArray
jsonLines
). Om du har en blandning av olika filtyper i samma datakälla bör du överväga att använda filnamnsfilter för att styra vilka filer som importeras.
I följande avsnitt beskrivs varje läge mer detaljerat. Om du inte känner till indexerarklienter och begrepp kan du läsa Skapa en sökindexerare. Du bör också känna till informationen om grundläggande blobindexeringskonfiguration, som inte upprepas här.
Indexera enskilda JSON-dokument (ett per blob)
Som standard parsar blobindexerare JSON-blobar som ett enda textsegment, ett sökdokument för varje blob i en container. Om JSON är strukturerad kan sökdokumentet återspegla den strukturen, med enskilda element som representeras som enskilda fält. Anta till exempel att du har följande JSON-dokument i Azure Blob Storage:
{
"article" : {
"text" : "A hopefully useful article explaining how to parse JSON blobs",
"datePublished" : "2020-04-13",
"tags" : [ "search", "storage", "howto" ]
}
}
Blobindexeraren parsar JSON-dokumentet i ett enda sökdokument och läser in ett index genom att matcha "text", "datePublished" och "taggar" från källan mot identiskt namngivna och typerade målindexfält. Med tanke på ett index med fälten "text", "datePublished" och "tags" kan blobindexeraren härleda rätt mappning utan en fältmappning som finns i begäran.
Även om standardbeteendet är ett sökdokument per JSON-blob ändrar inställningen json
parsningsläget de interna fältmappningarna för innehåll, vilket främjar fält inuti content
till faktiska fält i sökindexet. Ett exempel på en indexerares definition för json
parsningsläget kan se ut så här:
POST https://[service name].search.windows.net/indexers?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]
{
"name" : "my-json-indexer",
"dataSourceName" : "my-blob-datasource",
"targetIndexName" : "my-target-index",
"parameters" : { "configuration" : { "parsingMode" : "json" } }
}
Kommentar
Som med alla indexerare bör du förvänta dig att uttryckligen ange enskilda fältmappningar om du inte använder implicita fältmappningar som är tillgängliga för blobinnehåll och metadata, enligt beskrivningen i grundläggande blobindexeringskonfiguration.
json-exempel (JSON-filer för enkel hotell)
Hotel JSON-dokumentdatauppsättningen på GitHub är användbar för att testa JSON-parsning, där varje blob representerar en strukturerad JSON-fil. Du kan ladda upp datafilerna till Blob Storage och använda guiden Importera data för att snabbt utvärdera hur innehållet parsas i enskilda sökdokument.
Datauppsättningen består av fem blobar som var och en innehåller ett hotelldokument med en adresssamling och en rumssamling. Blobindexeraren identifierar båda samlingarna och återspeglar strukturen för indatadokumenten i indexschemat.
Parsa JSON-matriser
Du kan också använda alternativet JSON-matris. Det här alternativet är användbart när blobar innehåller en matris med välformade JSON-objekt och du vill att varje element ska bli ett separat sökdokument. Med hjälp av jsonArrays
skapar följande JSON-blob tre separata dokument, var och en med "id"
och "text"
fält.
[
{ "id" : "1", "text" : "example 1" },
{ "id" : "2", "text" : "example 2" },
{ "id" : "3", "text" : "example 3" }
]
Egenskapen parameters
på indexeraren innehåller värden för parsningsläge. För en JSON-matris bör indexerarens definition se ut ungefär som i följande exempel.
POST https://[service name].search.windows.net/indexers?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]
{
"name" : "my-json-indexer",
"dataSourceName" : "my-blob-datasource",
"targetIndexName" : "my-target-index",
"parameters" : { "configuration" : { "parsingMode" : "jsonArray" } }
}
jsonArrays-exempel
New York Philharmonic JSON-datauppsättningen på GitHub är användbar för att testa JSON-matrisparsning. Du kan ladda upp datafilerna till Blob Storage och använda guiden Importera data för att snabbt utvärdera hur innehållet parsas i enskilda sökdokument.
Datauppsättningen består av åtta blobar, som var och en innehåller en JSON-matris med entiteter, för totalt 100 entiteter. Entiteterna varierar beroende på vilka fält som fylls i, men slutresultatet är ett sökdokument per entitet, från alla matriser, i alla blobar.
Parsa kapslade JSON-matriser
För JSON-matriser med kapslade element kan du ange en documentRoot
för att ange en struktur på flera nivåer. Om dina blobbar till exempel ser ut så här:
{
"level1" : {
"level2" : [
{ "id" : "1", "text" : "Use the documentRoot property" },
{ "id" : "2", "text" : "to pluck the array you want to index" },
{ "id" : "3", "text" : "even if it's nested inside the document" }
]
}
}
Använd den här konfigurationen för att indexeras matrisen som finns i egenskapen level2
:
{
"name" : "my-json-array-indexer",
... other indexer properties
"parameters" : { "configuration" : { "parsingMode" : "jsonArray", "documentRoot" : "/level1/level2" } }
}
Parsa JSON-entiteter avgränsade med nya linjer
Om din blob innehåller flera JSON-entiteter avgränsade med en ny rad och du vill att varje element ska bli ett separat sökdokument använder du jsonLines
.
{ "id" : "1", "text" : "example 1" }
{ "id" : "2", "text" : "example 2" }
{ "id" : "3", "text" : "example 3" }
För JSON-rader bör indexerarens definition se ut ungefär som i följande exempel.
POST https://[service name].search.windows.net/indexers?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]
{
"name" : "my-json-indexer",
"dataSourceName" : "my-blob-datasource",
"targetIndexName" : "my-target-index",
"parameters" : { "configuration" : { "parsingMode" : "jsonLines" } }
}
Mappa JSON-fält till sökfält
Fältmappningar associerar ett källfält med ett målfält i situationer där fältnamnen och typerna inte är identiska. Men fältmappningar kan också användas för att matcha delar av ett JSON-dokument och "lyfta" dem till fält på den översta nivån i sökdokumentet.
I följande exempel illustreras scenariot. Mer information om fältmappningar i allmänhet finns i fältmappningar.
{
"article" : {
"text" : "A hopefully useful article explaining how to parse JSON blobs",
"datePublished" : "2016-04-13"
"tags" : [ "search", "storage", "howto" ]
}
}
Anta ett sökindex med följande fält: text
av typen Edm.String
, date
av typen Edm.DateTimeOffset
och tags
av typen Collection(Edm.String)
. Observera skillnaden mellan "datePublished" i källan och date
fältet i indexet. Om du vill mappa din JSON till önskad form använder du följande fältmappningar:
"fieldMappings" : [
{ "sourceFieldName" : "/article/text", "targetFieldName" : "text" },
{ "sourceFieldName" : "/article/datePublished", "targetFieldName" : "date" },
{ "sourceFieldName" : "/article/tags", "targetFieldName" : "tags" }
]
Källfält anges med JSON-pekarens notation. Du börjar med ett snedstreck för att referera till roten i JSON-dokumentet och väljer sedan önskad egenskap (på godtycklig kapslingsnivå) med hjälp av snedstrecksavgränsad sökväg.
Du kan också referera till enskilda matriselement med hjälp av ett nollbaserat index. Om du till exempel vill välja det första elementet i matrisen "taggar" från exemplet ovan använder du en fältmappning så här:
{ "sourceFieldName" : "/article/tags/0", "targetFieldName" : "firstTag" }
Kommentar
Om "sourceFieldName" refererar till en egenskap som inte finns i JSON-bloben hoppas den mappningen över utan ett fel. Det här beteendet gör att indexering kan fortsätta för JSON-blobar som har ett annat schema (vilket är ett vanligt användningsfall). Eftersom det inte finns någon valideringskontroll kontrollerar du mappningarna noggrant för stavfel så att du inte förlorar dokument av fel anledning.