Markdown-blobs en -bestanden indexeren in Azure AI Search
Notitie
Deze functie is momenteel beschikbaar als openbare preview-versie. Deze preview wordt aangeboden zonder service level agreement en wordt niet aanbevolen voor productieworkloads. Misschien worden bepaalde functies niet ondersteund of zijn de mogelijkheden ervan beperkt. Zie Aanvullende gebruiksvoorwaarden voor Microsoft Azure-previews voor meer informatie.
In Azure AI Search ondersteunen indexeerfuncties voor Azure Blob Storage, Azure Files en OneLake een markdown
parseermodus voor Markdown-bestanden. Markdown-bestanden kunnen op twee manieren worden geïndexeerd:
- Een-op-veel-parseringsmodus, waarbij u meerdere zoekdocumenten per Markdown-bestand maakt
- Een-op-een-parseermodus, waarbij één zoekdocument per Markdown-bestand wordt gemaakt
Tip
Ga verder met de zelfstudie: Markdown-gegevens zoeken uit Azure Blob Storage nadat u dit artikel hebt bekeken.
Vereisten
Een ondersteunde gegevensbron: Azure Blob Storage, Azure File Storage, OneLake in Microsoft Fabric.
Voor OneLake moet u voldoen aan alle vereisten van de OneLake-indexeerfunctie.
Azure Storage voor blob-indexeerfuncties en bestandsindexeerfuncties is een standaardexemplaren (algemeen gebruik v2) die dynamische en statische toegangslagen ondersteunt.
Parameters voor de Markdown-parseringsmodus
Parameters voor de parseermodus worden opgegeven in een indexeerfunctiedefinitie wanneer u een indexeerfunctie maakt of bijwerkt.
POST https://[service name].search.windows.net/indexers?api-version=2024-11-01-preview
Content-Type: application/json
api-key: [admin key]
{
"name": "my-markdown-indexer",
"dataSourceName": "my-blob-datasource",
"targetIndexName": "my-target-index",
"parameters": {
"configuration": {
"parsingMode": "markdown",
"markdownParsingSubmode": "oneToMany",
"markdownHeaderDepth": "h6"
}
},
}
De blob-indexeerfunctie biedt een submode
parameter om de uitvoer van de structuur van de zoekdocumenten te bepalen. De Markdown-parseringsmodus biedt de volgende opties voor submode:
parsingMode | submode | Document zoeken | Beschrijving |
---|---|---|---|
markdown |
oneToMany |
Meerdere per blob | (standaard) Hiermee wordt de Markdown opgesplitst in meerdere zoekdocumenten, die elk een inhoudssectie (niet-koptekst) van het Markdown-bestand vertegenwoordigen. U kunt submodus weglaten, tenzij u een-op-een-parseren wilt. |
markdown |
oneToOne |
Eén per blob | Parseert de Markdown in één zoekdocument, met secties die zijn toegewezen aan specifieke headers in het Markdown-bestand. |
Voor oneToMany
submodus moet u het indexeren van één blob controleren om veel zoekdocumenten te produceren om te begrijpen hoe de blobindexeerfunctie de ondubbelzinnigheid van de documentsleutel afhandelt voor meerdere zoekdocumenten die zijn geproduceerd uit dezelfde blob.
In latere secties wordt elke submodus gedetailleerder 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.
Optionele Markdown-parseringsparameters
Parameters zijn hoofdlettergevoelig.
Parameternaam | Toegestane waarden | Beschrijving |
---|---|---|
markdownHeaderDepth |
h1 , , h2 h3 , h4 , , , h5 h6(default) |
Deze parameter bepaalt het laagste headerniveau dat wordt overwogen bij het parseren, waardoor flexibele verwerking van documentstructuur mogelijk is (bijvoorbeeld wanneer markdownHeaderDepth deze is ingesteld h1 , herkent de parser alleen kopteksten op het hoogste niveau die beginnen met '#', en alle kopteksten op lager niveau worden behandeld als tekst zonder opmaak). Als dit niet is opgegeven, wordt deze standaard ingesteld op h6 . |
Deze instelling kan worden gewijzigd na het maken van de indexeerfunctie, maar de structuur van de resulterende zoekdocumenten kan veranderen, afhankelijk van de Markdown-inhoud.
Ondersteunde Markdown-elementen
Met Markdown-parsering wordt alleen inhoud gesplitst op basis van headers. Alle andere elementen, zoals lijsten, codeblokken, tabellen enzovoort, worden behandeld als tekst zonder opmaak en doorgegeven aan een inhoudsveld.
Voorbeeld van Markdown-inhoud
De volgende Markdown-inhoud wordt gebruikt voor de voorbeelden op deze pagina:
# Section 1
Content for section 1.
## Subsection 1.1
Content for subsection 1.1.
# Section 2
Content for section 2.
Een-op-veel-parsingmodus gebruiken
De een-op-veel-parseringsmodus parseert Markdown-bestanden in meerdere zoekdocumenten, waarbij elk document overeenkomt met een specifieke inhoudssectie van het Markdown-bestand op basis van de metagegevens van de koptekst op dat moment in het document. De Markdown wordt geparseerd op basis van headers in zoekdocumenten die de volgende inhoud bevatten:
content
: Een tekenreeks die de onbewerkte Markdown bevat die op een specifieke locatie is gevonden, op basis van de metagegevens van de header op dat moment in het document.sections
: Een object met subvelden voor de metagegevens van de header tot het gewenste headerniveau. WanneermarkdownHeaderDepth
bijvoorbeeld is ingesteld oph3
, bevat tekenreeksveldenh1
enh2
h3
. Deze velden worden geïndexeerd door deze structuur in de index te spiegelen, of door veldtoewijzingen in de indeling/sections/h1
,sections/h2
enzovoort. Zie index- en indexeerfuncties in de volgende voorbeelden voor voorbeelden in context. De subvelden zijn:h1
- Een tekenreeks met de h1-headerwaarde. Lege tekenreeks als deze niet is ingesteld op dit punt in het document.- (Optioneel)
h2
- Een tekenreeks met de h2-headerwaarde. Lege tekenreeks als deze niet is ingesteld op dit punt in het document. - (Optioneel)
h3
- Een tekenreeks die de h3-headerwaarde bevat. Lege tekenreeks als deze niet is ingesteld op dit punt in het document. - (Optioneel)
h4
- Een tekenreeks met de h4-headerwaarde. Lege tekenreeks als deze niet is ingesteld op dit punt in het document. - (Optioneel)
h5
- Een tekenreeks met de h5-headerwaarde. Lege tekenreeks als deze niet is ingesteld op dit punt in het document. - (Optioneel)
h6
- Een tekenreeks met de h6-headerwaarde. Lege tekenreeks als deze niet is ingesteld op dit punt in het document.
ordinal_position
: Een geheel getal dat de positie van de sectie in de documenthiërarchie aangeeft. Dit veld wordt gebruikt voor het rangschikken van de secties in de oorspronkelijke volgorde zoals ze worden weergegeven in het document, beginnend met een rangschikking van 1 en het sequentieel verhogen van elke koptekst.
Indexschema voor een-op-veel-parsering
Een voorbeeld van een indexconfiguratie ziet er ongeveer als volgt uit:
{
"name": "my-markdown-index",
"fields": [
{
"name": "id",
"type": "Edm.String",
"key": true
},
{
"name": "content",
"type": "Edm.String",
},
{
"name": "ordinal_position",
"type": "Edm.Int32"
},
{
"name": "sections",
"type": "Edm.ComplexType",
"fields": [
{
"name": "h1",
"type": "Edm.String"
},
{
"name": "h2",
"type": "Edm.String"
}]
}]
}
Definitie van indexeerfunctie voor een-op-veel-parsering
Als veldnamen en gegevenstypen worden uitgelijnd, kan de blob-indexeerfunctie de toewijzing afleiden zonder expliciete veldtoewijzing in de aanvraag, zodat een indexeerfunctieconfiguratie die overeenkomt met de opgegeven indexconfiguratie er als volgt uitziet:
POST https://[service name].search.windows.net/indexers?api-version=2024-11-01-preview
Content-Type: application/json
api-key: [admin key]
{
"name": "my-markdown-indexer",
"dataSourceName": "my-blob-datasource",
"targetIndexName": "my-target-index",
"parameters": {
"configuration": { "parsingMode": "markdown" }
},
}
Notitie
De submode
instellingen hoeven hier niet expliciet te worden ingesteld omdat oneToMany
dit de standaardinstelling is.
Indexeerfunctieuitvoer voor parseren van één-op-veel
Dit Markdown-bestand zou resulteren in drie zoekdocumenten na het indexeren, vanwege de drie inhoudssecties. Het zoekdocument dat het resultaat is van de eerste inhoudssectie van het opgegeven Markdown-document, bevat de volgende waarden voorcontent
, sections
enh1
h2
:
{
{
"content": "Content for section 1.\r\n",
"sections": {
"h1": "Section 1",
"h2": ""
},
"ordinal_position": 1
},
{
"content": "Content for subsection 1.1.\r\n",
"sections": {
"h1": "Section 1",
"h2": "Subsection 1.1"
},
"ordinal_position": 2
},
{
"content": "Content for section 2.\r\n",
"sections": {
"h1": "Section 2",
"h2": ""
},
"ordinal_position": 3
}
}
Een-op-veel-velden toewijzen in een zoekindex
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 Markdown-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.
Stel dat u een zoekindex gebruikt met de volgende velden: raw_content
van het type Edm.String
, h1_header
van het type Edm.String
en h2_header
van het type Edm.String
. Als u uw Markdown wilt toewijzen aan de gewenste vorm, gebruikt u de volgende veldtoewijzingen:
"fieldMappings" : [
{ "sourceFieldName" : "/content", "targetFieldName" : "raw_content" },
{ "sourceFieldName" : "/sections/h1", "targetFieldName" : "h1_header" },
{ "sourceFieldName" : "/sections/h2", "targetFieldName" : "h2_header" },
]
Het resulterende zoekdocument in de index ziet er als volgt uit:
{
{
"raw_content": "Content for section 1.\r\n",
"h1_header": "Section 1",
"h2_header": "",
},
{
"raw_content": "Content for section 1.1.\r\n",
"h1_header": "Section 1",
"h2_header": "Subsection 1.1",
},
{
"raw_content": "Content for section 2.\r\n",
"h1_header": "Section 2",
"h2_header": "",
}
}
Een-op-een-parseermodus gebruiken
In de een-op-een-parseermodus wordt het hele Markdown-document geïndexeerd als één zoekdocument, waarbij de hiërarchie en structuur van de oorspronkelijke inhoud behouden blijven. Deze modus is het handigst wanneer de bestanden die moeten worden geïndexeerd een gemeenschappelijke structuur delen, zodat u deze gemeenschappelijke structuur in de index kunt gebruiken om de relevante velden doorzoekbaar te maken.
Stel in de definitie van de indexeerfunctie de parsingMode
optionele "markdown"
markdownHeaderDepth
parameter in en gebruik deze om de maximale kopdiepte voor segmentering te definiëren. Als dit niet is opgegeven, wordt h6
standaard ingesteld op het vastleggen van alle mogelijke headerdiepten.
De Markdown wordt geparseerd op basis van headers in zoekdocumenten die de volgende inhoud bevatten:
document_content
: Bevat de volledige Markdown-tekst als één tekenreeks. Dit veld fungeert als een onbewerkte weergave van het invoerdocument.sections
: Een matrix met objecten die de hiërarchische weergave van de secties in het Markdown-document bevatten. Elke sectie wordt weergegeven als een object in deze matrix en legt de structuur van het document vast op een geneste manier die overeenkomt met de kopteksten en de bijbehorende inhoud. De velden zijn toegankelijk via veldtoewijzingen door bijvoorbeeld/sections/content
te verwijzen naar het pad. De objecten in deze matrix hebben de volgende eigenschappen:header_level
: Een tekenreeks die het niveau van de header (h1
,h2
,h3
enzovoort) aangeeft in de Markdown-syntaxis. Dit veld helpt bij het begrijpen van de hiërarchie en het structureren van de inhoud.header_name
: Een tekenreeks die de tekst van de koptekst bevat zoals deze wordt weergegeven in het Markdown-document. Dit veld bevat een label of titel voor de sectie.content
: Een tekenreeks met tekstinhoud die direct volgt op de koptekst, tot aan de volgende koptekst. In dit veld worden de gedetailleerde informatie of beschrijving vastgelegd die aan de koptekst is gekoppeld. Als er geen inhoud rechtstreeks onder een koptekst staat, is dit een lege tekenreeks.ordinal_position
: Een geheel getal dat de positie van de sectie in de documenthiërarchie aangeeft. Dit veld wordt gebruikt voor het ordenen van de secties in de oorspronkelijke volgorde zoals ze worden weergegeven in het document, beginnend met een rangschikking van 1 en het sequentieel verhogen van elk inhoudsblok.sections
: Een matrix die objecten bevat die subsecties vertegenwoordigen die zijn genest onder de huidige sectie. Deze matrix volgt dezelfde structuur als de matrix op het hoogste niveausections
, zodat u meerdere niveaus van geneste inhoud kunt weergeven. Elk subsectieobject bevatheader_level
ook ,header_name
encontent
ordinal_position
eigenschappen, waardoor een recursieve structuur wordt ingeschakeld die de Markdown-inhoud vertegenwoordigt en hiërarchie.
Hier volgt het Markdown-voorbeeld dat we gebruiken om een indexschema uit te leggen dat is ontworpen rond elke parseringsmodus.
# Section 1
Content for section 1.
## Subsection 1.1
Content for subsection 1.1.
# Section 2
Content for section 2.
Indexschema voor een-op-een-parsering
Als u geen veldtoewijzingen gebruikt, moet de vorm van de index de vorm van de Markdown-inhoud weerspiegelen. Gezien de structuur van markdown met de twee secties en één subsectie, moet de index er ongeveer uitzien als in het volgende voorbeeld:
{
"name": "my-markdown-index",
"fields": [
{
"name": "document_content",
"type": "Edm.String",
{
"name": "sections",
"type": "Edm.ComplexType",
"fields": [
{
"name": "header_level",
"type": "Edm.String",
},
{
"name": "header_name",
"type": "Edm.String",
},
{
"name": "content",
"type": "Edm.String"
},
{
"name": "ordinal_position",
"type": "Edm.Int"
},
{
"name": "sections",
"type": "Edm.ComplexType",
"fields": [
{
"name": "header_level",
"type": "Edm.String",
},
{
"name": "header_name",
"type": "Edm.String",
},
{
"name": "content",
"type": "Edm.String"
},
{
"name": "ordinal_position",
"type": "Edm.Int"
}]
}]
}
}
Definitie van indexeerfunctie voor een-op-een-parsering
POST https://[service name].search.windows.net/indexers?api-version=2024-11-01-preview
Content-Type: application/json
api-key: [admin key]
{
"name": "my-markdown-indexer",
"dataSourceName": "my-blob-datasource",
"targetIndexName": "my-target-index",
"parameters": {
"configuration": {
"parsingMode": "markdown",
"markdownParsingSubmode": "oneToOne",
}
}
}
Indexeerfunctieuitvoer voor een-op-een parseren
Omdat de Markdown die we willen indexeren alleen naar een diepte van h2
('##') gaat, hebben we velden nodig sections
die zijn genest op een diepte van 2 om die te vinden. Deze configuratie resulteert in de volgende gegevens in de index:
"document_content": "# Section 1\r\nContent for section 1.\r\n## Subsection 1.1\r\nContent for subsection 1.1.\r\n# Section 2\r\nContent for section 2.\r\n",
"sections": [
{
"header_level": "h1",
"header_name": "Section 1",
"content": "Content for section 1.",
"ordinal_position": 1,
"sections": [
{
"header_level": "h2",
"header_name": "Subsection 1.1",
"content": "Content for subsection 1.1.",
"ordinal_position": 2,
}]
}],
{
"header_level": "h1",
"header_name": "Section 2",
"content": "Content for section 2.",
"ordinal_position": 3,
"sections": []
}]
}
Zoals u kunt zien, wordt de rangtelpositie verhoogd op basis van de locatie van de inhoud in het document.
Er moet ook worden opgemerkt dat als koptekstniveaus in de inhoud worden overgeslagen, de structuur van het resulterende document de kopteksten weerspiegelt die aanwezig zijn in de Markdown-inhoud, niet noodzakelijkerwijs geneste secties bevatten voor h1
h6
opeenvolgende. Wanneer het document bijvoorbeeld begint h2
, is h2
het eerste element in de matrix met secties op het hoogste niveau.
Een-op-een-velden toewijzen in een zoekindex
Als u velden met aangepaste namen uit het document wilt extraheren, kunt u veldtoewijzingen gebruiken om dit te doen. Houd rekening met de volgende indexconfiguratie met hetzelfde Markdown-voorbeeld als voorheen:
{
"name": "my-markdown-index",
"fields": [
{
"name": "document_content",
"type": "Edm.String",
},
{
"name": "document_title",
"type": "Edm.String",
},
{
"name": "opening_subsection_title"
"type": "Edm.String",
}
{
"name": "summary_content",
"type": "Edm.String",
}
]
}
Het extraheren van specifieke velden uit de geparseerde Markdown wordt verwerkt op dezelfde manier als de documentpaden in outputFieldMappings, behalve het pad begint met /sections
in plaats van /document
. Zo wordt bijvoorbeeld /sections/0/content
toegewezen aan de inhoud onder het item op positie 0 in de sectiematrix.
Een voorbeeld van een sterk gebruiksvoorbeeld kan er ongeveer als volgt uitzien: alle Markdown-bestanden hebben een documenttitel in de eerste h1
, een subsectietitel in de eerste h2
en een samenvatting in de inhoud van de laatste alinea onder de laatste alinea h1
. U kunt de volgende veldtoewijzingen gebruiken om alleen die inhoud te indexeren:
"fieldMappings" : [
{ "sourceFieldName" : "/content", "targetFieldName" : "raw_content" },
{ "sourceFieldName" : "/sections/0/header_name", "targetFieldName" : "document_title" },
{ "sourceFieldName" : "/sections/0/sections/header_name", "targetFieldName" : "opening_subsection_title" },
{ "sourceFieldName" : "/sections/1/content", "targetFieldName" : "summary_content" },
]
Hier haalt u alleen de relevante stukken uit dat document op. Als u deze functionaliteit het effectiefst wilt gebruiken, moeten documenten die u wilt indexeren dezelfde hiërarchische headerstructuur delen.
Het resulterende zoekdocument in de index ziet er als volgt uit:
{
"content": "Content for section 1.\r\n",
"document_title": "Section 1",
"opening_subsection_title": "Subsection 1.1",
"summary_content": "Content for section 2."
}
Notitie
In deze voorbeelden wordt aangegeven hoe u deze parseringsmodi volledig kunt gebruiken met of zonder veldtoewijzingen, maar u kunt beide in één scenario gebruiken als dat aan uw behoeften voldoet.