JSON-blobs en -bestanden indexeren in Azure AI Search

Van toepassing op: Blob-indexeerfuncties, bestandsindexeerfuncties

In dit artikel leest u hoe u eigenschappen instelt voor blobs of bestanden die bestaan uit JSON-documenten voor blobindexering in Azure AI Search. JSON-bestanden in Azure Blob Storage of Azure Files gaan meestal uit van een van deze formulieren:

  • Eén JSON-document
  • Een JSON-document met een matrix van goed gevormde JSON-elementen
  • Een JSON-document met meerdere entiteiten, gescheiden door een nieuwe regel

De blob-indexeerfunctie biedt een parsingMode parameter voor het optimaliseren van de uitvoer van het zoekdocument op basis van JSON-structuur. Parseringsmodi bestaan uit de volgende opties:

parsingMode JSON-document Beschrijving
json Eén per blob (standaard) Parseert JSON-blobs als één stuk tekst. Elke JSON-blob wordt één zoekdocument.
jsonArray Meerdere per blob Parseert een JSON-matrix in de blob, waarbij elk element van de matrix een afzonderlijk zoekdocument wordt.
jsonLines Meerdere per blob Parseert een blob die meerdere JSON-entiteiten (ook een matrix) bevat, met afzonderlijke elementen gescheiden door een nieuwe regel. De indexeerfunctie start een nieuw zoekdocument na elke nieuwe regel.

Voor beide jsonArray en jsonLinesmoet u het indexeren van één blob controleren om veel zoekdocumenten te produceren om te begrijpen hoe de blobindexeerfunctie omgaat met ondubbelzinnigheid van de documentsleutel voor meerdere zoekdocumenten die zijn geproduceerd uit dezelfde blob.

In de definitie van de indexeerfunctie kunt u desgewenst veldtoewijzingen instellen om te kiezen welke eigenschappen van het bron-JSON-document worden gebruikt om de doelzoekindex te vullen. Wanneer u bijvoorbeeld de jsonArray parseringsmodus gebruikt en de matrix bestaat als een eigenschap op een lager niveau, kunt u een eigenschap documentRoot instellen die aangeeft waar de matrix in de blob wordt geplaatst.

Notitie

Wanneer een JSON-parseringsmodus wordt gebruikt, gaat Azure AI Search ervan uit dat alle blobs dezelfde parser gebruiken (voor jsonjsonArray , of jsonLines). Als u een combinatie van verschillende bestandstypen in dezelfde gegevensbron hebt, kunt u overwegen om filters voor bestandsextensies te gebruiken om te bepalen welke bestanden worden geïmporteerd.

In de volgende secties wordt elke modus uitgebreider beschreven. Als u niet bekend bent met indexeerfunctieclients en -concepten, raadpleegt u Een zoekindexeerfunctie maken. U moet ook bekend zijn met de details van de basisconfiguratie van de blob-indexeerfunctie, die hier niet wordt herhaald.

Eén JSON-documenten indexeren (één per blob)

Blob-indexeerfuncties parseren standaard JSON-blobs als één stuk tekst, één zoekdocument voor elke blob in een container. Als de JSON is gestructureerd, kan het zoekdocument die structuur weerspiegelen, waarbij afzonderlijke elementen worden weergegeven als afzonderlijke velden. Stel dat u het volgende JSON-document hebt in Azure Blob Storage:

{
    "article" : {
        "text" : "A hopefully useful article explaining how to parse JSON blobs",
        "datePublished" : "2020-04-13",
        "tags" : [ "search", "storage", "howto" ]    
    }
}

De blob-indexeerfunctie parseert het JSON-document in één zoekdocument, laadt een index door 'tekst', 'datePublished' en 'tags' uit de bron te vergelijken met identiek benoemde en getypte doelindexvelden. Gezien een index met de velden 'text', 'datePublished' en 'tags', kan de blob-indexeerfunctie de juiste toewijzing afleiden zonder dat er een veldtoewijzing aanwezig is in de aanvraag.

Hoewel het standaardgedrag één zoekdocument per JSON-blob is, verandert het instellen van de json parseringsmodus de interne veldtoewijzingen voor inhoud, waardoor velden in content de werkelijke velden in de zoekindex worden gepromoot. Een voorbeeld van een indexeerfunctiedefinitie voor de json parseringsmodus kan er als volgt uitzien:

POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-json-indexer",
    "dataSourceName" : "my-blob-datasource",
    "targetIndexName" : "my-target-index",
    "parameters" : { "configuration" : { "parsingMode" : "json" } }
}

Notitie

Net als bij alle indexeerfuncties moet u, net als voor alle indexeerfuncties, expliciet afzonderlijke veldtoewijzingen opgeven, tenzij u de impliciete veldtoewijzingen gebruikt die beschikbaar zijn voor blob-inhoud en metagegevens, zoals beschreven in de standaardconfiguratie van de blob-indexeerfunctie.

json-voorbeeld (JSON-bestanden met één hotel)

De JSON-documentgegevensset van het hotel op GitHub is handig voor het testen van JSON-parsering, waarbij elke blob een gestructureerd JSON-bestand vertegenwoordigt. U kunt de gegevensbestanden uploaden naar Blob Storage en de wizard Gegevens importeren gebruiken om snel te evalueren hoe deze inhoud wordt geparseerd in afzonderlijke zoekdocumenten.

De gegevensset bestaat uit vijf blobs, elk met een hoteldocument met een adresverzameling en een verzameling ruimten. De blob-indexeerfunctie detecteert zowel verzamelingen als weerspiegelt de structuur van de invoerdocumenten in het indexschema.

JSON-matrices parseren

U kunt ook de JSON-matrixoptie gebruiken. Deze optie is handig wanneer blobs een matrix met goed opgemaakte JSON-objecten bevatten en u wilt dat elk element een afzonderlijk zoekdocument wordt. Met behulp van jsonArraysde volgende JSON-blob produceert de volgende JSON-blob drie afzonderlijke documenten, elk met "id" en "text" velden.

[
    { "id" : "1", "text" : "example 1" },
    { "id" : "2", "text" : "example 2" },
    { "id" : "3", "text" : "example 3" }
]

De parameters eigenschap in de indexeerfunctie bevat parseringsmoduswaarden. Voor een JSON-matrix moet de definitie van de indexeerfunctie er ongeveer uitzien als in het volgende voorbeeld.

POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
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-voorbeeld

De JSON-gegevensset New York Philharmonische JSON op GitHub is handig voor het testen van JSON-matrixparsering. U kunt de gegevensbestanden uploaden naar Blob Storage en de wizard Gegevens importeren gebruiken om snel te evalueren hoe deze inhoud in afzonderlijke zoekdocumenten wordt geparseerd.

De gegevensset bestaat uit acht blobs, elk met een JSON-matrix met entiteiten, voor een totaal van 100 entiteiten. De entiteiten variëren van de velden die worden ingevuld, maar het eindresultaat is één zoekdocument per entiteit, van alle matrices, in alle blobs.

Geneste JSON-matrices parseren

Voor JSON-matrices met geneste elementen kunt u een documentRoot opgeven om een structuur met meerdere niveaus aan te geven. Als uw blobs er bijvoorbeeld als volgt uitzien:

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

Gebruik deze configuratie om de matrix in de level2 eigenschap te indexeren:

{
    "name" : "my-json-array-indexer",
    ... other indexer properties
    "parameters" : { "configuration" : { "parsingMode" : "jsonArray", "documentRoot" : "/level1/level2" } }
}

JSON-entiteiten parseren, gescheiden door nieuwe lijnen

Als uw blob meerdere JSON-entiteiten bevat, gescheiden door een nieuwe regel en u wilt dat elk element een afzonderlijk zoekdocument wordt, gebruikt jsonLinesu .

{ "id" : "1", "text" : "example 1" }
{ "id" : "2", "text" : "example 2" }
{ "id" : "3", "text" : "example 3" }

Voor JSON-regels moet de definitie van de indexeerfunctie er ongeveer uitzien als in het volgende voorbeeld.

POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-json-indexer",
    "dataSourceName" : "my-blob-datasource",
    "targetIndexName" : "my-target-index",
    "parameters" : { "configuration" : { "parsingMode" : "jsonLines" } }
}

JSON-velden toewijzen aan zoekvelden

Veldtoewijzingen koppelen een bronveld aan een doelveld in situaties waarin de veldnamen en -typen niet identiek zijn. Veldtoewijzingen kunnen echter ook worden gebruikt om delen van een JSON-document te vergelijken en ze op te tillen in velden op het hoogste niveau van het zoekdocument.

Dit wordt geïllustreerd in het volgende voorbeeldscenario. Zie veldtoewijzingen voor meer informatie over veldtoewijzingen in het algemeen.

{
    "article" : {
        "text" : "A hopefully useful article explaining how to parse JSON blobs",
        "datePublished" : "2016-04-13"
        "tags" : [ "search", "storage", "howto" ]    
    }
}

Stel dat u een zoekindex gebruikt met de volgende velden: text van het type Edm.String, date van het type Edm.DateTimeOffseten tags van het type Collection(Edm.String). Let op de discrepantie tussen 'datePublished' in de bron en date het veld in de index. Gebruik de volgende veldtoewijzingen om uw JSON toe te wijzen aan de gewenste shape:

"fieldMappings" : [
    { "sourceFieldName" : "/article/text", "targetFieldName" : "text" },
    { "sourceFieldName" : "/article/datePublished", "targetFieldName" : "date" },
    { "sourceFieldName" : "/article/tags", "targetFieldName" : "tags" }
    ]

Bronvelden worden opgegeven met behulp van de JSON Pointer-notatie . U begint met een slash om te verwijzen naar de hoofdmap van uw JSON-document en vervolgens de gewenste eigenschap (op willekeurig nestniveau) te kiezen met behulp van een door slash gescheiden pad.

U kunt ook naar afzonderlijke matrixelementen verwijzen met behulp van een index op basis van nul. Als u bijvoorbeeld het eerste element van de matrix Tags uit het bovenstaande voorbeeld wilt kiezen, gebruikt u een veldtoewijzing als volgt:

{ "sourceFieldName" : "/article/tags/0", "targetFieldName" : "firstTag" }

Notitie

Als 'sourceFieldName' verwijst naar een eigenschap die niet bestaat in de JSON-blob, wordt die toewijzing zonder een fout overgeslagen. Met dit gedrag kan indexering worden voortgezet voor JSON-blobs met een ander schema (dit is een veelvoorkomend gebruiksscenario). Omdat er geen validatiecontrole is, controleert u de toewijzingen zorgvuldig op typefouten, zodat u geen documenten kwijtraakt om de verkeerde reden.

Volgende stappen