Handleiding: Geneste Markdown-blobs indexeren uit Azure Storage met REST

Opmerking

Azure AI Zoeken is beschikbaar via de Azure-portal, REST API's en Azure-SDK's. Het vormt ook een basis voor Foundry IQ, de beheerde kennislaag die bedrijfsinhoud transformeert in herbruikbare, machtigingsbewuste knowledge bases voor agents in de Microsoft Foundry-portal.

Azure AI Zoeken kunt Markdown-documenten en -matrices indexeren in Azure Blob Storage met behulp van een indexer die weten hoe Markdown-gegevens moeten worden gelezen.

In deze zelfstudie leert u hoe u Markdown-bestanden indexeert met behulp van de oneToMany Markdown-parseringsmodus en de REST API's van de Search Service.

In deze zelfstudie gaat u het volgende doen:

  • Voorbeeldgegevens instellen en een azureblob gegevensbron configureren
  • Een Azure AI Zoeken index maken om doorzoekbare inhoud te bevatten
  • Een indexeerfunctie maken en uitvoeren om de container te lezen en doorzoekbare inhoud te extraheren
  • Zoeken in de index die u zojuist hebt gemaakt

Voorwaarden

Opmerking

U kunt een gratis zoekservice gebruiken voor deze zelfstudie. De gratis laag beperkt u tot drie indexen, drie indexeerfuncties en drie gegevensbronnen. In deze zelfstudie maakt u een van beide. Voordat u begint, moet u ervoor zorgen dat uw service ruimte heeft om de nieuwe resources te accepteren.

Voorbeeldgegevens voorbereiden

Een Markdown-bestand maken

Kopieer en plak de volgende Markdown in een bestand met de naam sample_markdown.md. De voorbeeldgegevens zijn één Markdown-bestand met verschillende Markdown-elementen. We hebben één Markdown-bestand gekozen om onder de opslaglimieten van de gratis laag te blijven.

# Project Documentation

## Introduction
This document provides a complete overview of the **Markdown Features** used within this project. The following sections demonstrate the richness of Markdown formatting, with examples of lists, tables, links, images, blockquotes, inline styles, and more.

---

## Table of Contents
1. [Headers](#headers)
2. [Introduction](#introduction)
3. [Basic Text Formatting](#basic-text-formatting)
4. [Lists](#lists)
5. [Blockquotes](#blockquotes)
6. [Images](#images)
7. [Links](#links)
8. [Tables](#tables)
9. [Code Blocks and Inline Code](#code-blocks-and-inline-code)
10. [Horizontal Rules](#horizontal-rules)
11. [Inline Elements](#inline-elements)
12. [Escaping Characters](#escaping-characters)
13. [HTML Elements](#html-elements)
14. [Emojis](#emojis)
15. [Footnotes](#footnotes)
16. [Task Lists](#task-lists)
17. [Conclusion](#conclusion)

---

## Headers
Markdown supports six levels of headers. Use `#` to create headers:
"# Project Documentation" at the top of the document is an example of an h1 header.
"## Headers" above is an example of an h2 header.
### h3 example
#### h4 example
##### h5 example
###### h6 example
This is an example of content underneath a header.

## Basic Text Formatting
You can apply various styles to your text:
- **Bold**: Use double asterisks or underscores: `**bold**` or `__bold__`.
- *Italic*: Use single asterisks or underscores: `*italic*` or `_italic_`.
- ~~Strikethrough~~: Use double tildes: `~~strikethrough~~`.

## Lists

### Ordered List
1. First item  
2. Second item  
3. Third item  

### Unordered List
- Item A  
- Item B  
- Item C  

### Nested List
1. Parent item  
   - Child item  
   - Child item  

## Blockquotes
> This is a blockquote.  
> Blockquotes are great for emphasizing important information.  
>> Nested blockquotes are also possible!

## Images
![Markdown Logo](https://markdown-here.com/img/icon256.png)

## Links
[Visit Markdown Guide](https://www.markdownguide.org)

## Tables

| Syntax      | Description | Example       |
|-------------|-------------|---------------|
| Header      | Title       | Header Cell   |
| Paragraph   | Text block  | Row Content   |

## Code Blocks and Inline Code

### Inline Code
Use backticks to create `inline code`.

### Code Block
```javascript
// JavaScript example
function greet(name) {
  console.log(`Hello, ${name}!`);
}
greet('World');
```

## Horizontal Rules
Use three or more dashes or underscores to create a horizontal rule.

---
___

## Inline Elements
Sometimes, it’s useful to include `inline code` to highlight code-like content.  

You can also emphasize text like *this* or make it **bold**.

## Escaping Characters
To render special Markdown characters, use backslashes:
- \*Asterisks\*
- \#Hashes\#
- \[Brackets\]

## HTML Elements
You can mix HTML tags with Markdown:

<table>
  <tr>
    <th>HTML Table</th>
    <th>With Markdown</th>
  </tr>
  <tr>
    <td>Row 1</td>
    <td>Data 1</td>
  </tr>
</table>

## Emojis
Markdown supports some basic emojis:
- :smile: 😄  
- :rocket: 🚀  
- :checkered_flag: 🏁  

## Footnotes
This is an example of a footnote[^1]. Footnotes allow you to add notes without cluttering the main text.

[^1]: This is the content of the footnote.

## Task Lists
- [x] Complete the introduction  
- [ ] Add more examples  
- [ ] Review the document 

## Conclusion
Markdown is a lightweight yet powerful tool for writing documentation. It supports a variety of formatting options while maintaining simplicity and readability.

Thank you for reviewing this example!

Upload het bestand en verkrijg een verbindingsreeks

Volg eze instructies om het bestand sample_markdown.md te uploaden naar een container in uw Azure Storage-account. U moet ook de verbindingstekenreeks van het opslagaccount ophalen. Noteer de verbindingsreeks en de containernaam voor later gebruik.

Een URL en API-sleutel van een zoekservice kopiëren

Voor deze zelfstudie is voor verbindingen met Azure AI Zoeken een eindpunt en een API-sleutel vereist. U kunt deze waarden ophalen via de Azure-portal. Zie Beheerde identiteiten voor alternatieve verbindingsmethoden.

  1. Ga naar uw zoekservice in de Azure portal.

  2. Selecteer Overzicht in het linkerdeelvenster.

  3. Noteer de URL, die eruit moet zien als https://my-service.search.windows.net.

  4. Selecteer Instellingen>Sleutels in het linkerdeelvenster.

  5. Noteer een beheerderssleutel voor volledige rechten op de service. Er zijn twee uitwisselbare adminsleutels, voorzien om bedrijfscontinuïteit te garanderen voor het geval u er een moet vervangen. U kunt een van beide sleutels gebruiken voor aanvragen voor het toevoegen, wijzigen en verwijderen van objecten.

    Schermopname van de URL- en API-sleutels in de Azure portal.

Uw REST-bestand instellen

  1. Maak een bestand in Visual Studio Code.

  2. Geef waarden op voor variabelen die in de aanvraag worden gebruikt.

    @baseUrl = PUT-YOUR-SEARCH-SERVICE-ENDPOINT-HERE
    @apiKey = PUT-YOUR-ADMIN-API-KEY-HERE
    @storageConnectionString = PUT-YOUR-STORAGE-CONNECTION-STRING-HERE
    @blobContainer = PUT-YOUR-CONTAINER-NAME-HERE
    
  3. Sla het bestand op met behulp van een .rest of .http bestandsextensie.

Zie quickstart: Zoeken in volledige tekst met REST voor hulp bij de REST-client.

Een gegevensbron maken

Gegevensbronnen: met create (REST API) wordt een gegevensbronverbinding gemaakt die aangeeft welke gegevens moeten worden geïndexeert.

### Create a data source
POST {{baseUrl}}/datasources?api-version=2026-04-01  HTTP/1.1
Content-Type: application/json
api-key: {{apiKey}}

{
    "name" : "sample-markdown-ds",
    "description": null,
    "type": "azureblob",
    "subtype": null,
    "credentials": {
        "connectionString": "{{storageConnectionString}}"
    },
    "container": {
        "name": "{{blobContainer}}",
        "query": null
    },
    "dataChangeDetectionPolicy": null,
    "dataDeletionDetectionPolicy": null
}

Verzend de aanvraag. Het antwoord moet er als volgt uitzien:

HTTP/1.1 201 Created
Transfer-Encoding: chunked
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; charset=utf-8
ETag: "0x8DCF52E926A3C76"
Location: https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net:443/datasources('sample-markdown-ds')?api-version=2026-04-01
Server: Microsoft-IIS/10.0
Strict-Transport-Security: max-age=2592000, max-age=15724800; includeSubDomains
Preference-Applied: odata.include-annotations="*"
OData-Version: 4.0
request-id: 0714c187-217e-4d35-928a-5069251e5cba
elapsed-time: 204
Date: Fri, 25 Oct 2024 19:52:35 GMT
Connection: close

{
  "@odata.context": "https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net/$metadata#datasources/$entity",
  "@odata.etag": "\"0x8DCF52E926A3C76\"",
  "name": "sample-markdown-ds",
  "description": null,
  "type": "azureblob",
  "subtype": null,
  "credentials": {
    "connectionString": null
  },
  "container": {
    "name": "markdown-container",
    "query": null
  },
  "dataChangeDetectionPolicy": null,
  "dataDeletionDetectionPolicy": null,
  "encryptionKey": null,
  "identity": null
}

Een index maken

Indexen - Maken (REST API) maakt een zoekindex voor uw zoekservice. Een index geeft alle velden en de bijbehorende kenmerken aan.

Bij een-op-veel parseren definieert het zoekdocument de 'veel'-kant van de relatie. De velden die u in de index opgeeft, bepalen de structuur van het zoekdocument.

U hebt alleen velden nodig voor de Markdown-elementen die door de parser worden ondersteund. Deze velden zijn:

  • 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. Wanneer markdownHeaderDepth bijvoorbeeld is ingesteld op h3, bevat tekenreeksvelden h1en h2h3. 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 de index- en indexeerfunctieconfiguraties in de volgende voorbeelden voor voorbeelden in context. De subvelden zijn:

    • h1 - Een tekenreeks met de h1-kopwaarde. 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 om de secties in hun oorspronkelijke volgorde te rangschikken zoals ze worden weergegeven in het document, beginnend met een ordinale positie van 1 en vervolgens sequentieel verhoogd voor elk inhoudsblok.

Deze implementatie maakt gebruik van veldtoewijzingen in de indexer om de verrijkte inhoud aan de index te koppelen. Voor meer informatie over de geparseerde een-op-veel-documentstructuur, zie Markdown-blobs indexeren.

In dit voorbeeld ziet u voorbeelden van het indexeren van gegevens met en zonder veldtoewijzingen. In dit geval bevat h1 de titel van het document en wordt deze toegewezen aan een veld met de naam title. De h2 velden en h3 velden zijn toegewezen aan h2_subheader respectievelijk h3_subheader. Voor de content velden en ordinal_position velden is geen toewijzing vereist, omdat ze rechtstreeks uit Markdown worden geëxtraheerd in velden die deze namen gebruiken. Zie het einde van deze sectie voor een voorbeeld van een volledig indexschema waarvoor geen veldtoewijzingen nodig zijn.

### Create an index
POST {{baseUrl}}/indexes?api-version=2026-04-01  HTTP/1.1
Content-Type: application/json
api-key: {{apiKey}}

{
  "name": "sample-markdown-index",  
  "fields": [
    {"name": "id", "type": "Edm.String", "key": true, "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true},
    {"name": "content", "type": "Edm.String", "key": false, "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true},
    {"name": "title", "type": "Edm.String", "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true},
    {"name": "h2_subheader", "type": "Edm.String", "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true},
    {"name": "h3_subheader", "type": "Edm.String", "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true},
    {"name": "ordinal_position", "type": "Edm.Int32", "searchable": false, "retrievable": true, "filterable": true, "facetable": true, "sortable": true}
  ]
}

Indexschema in een configuratie zonder veldtoewijzingen

Met veldtoewijzingen kunt u verrijkte inhoud bewerken en filteren zodat deze in de gewenste indexshape past. Het is echter mogelijk dat u de verrijkte inhoud rechtstreeks wilt gebruiken. In dat geval ziet het schema er als volgt uit:

{
  "name": "sample-markdown-index",
  "fields": [
    {"name": "id", "type": "Edm.String", "key": true, "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true},
    {"name": "content", "type": "Edm.String", "key": false, "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true},
    {"name": "sections", 
      "type": "Edm.ComplexType", 
      "fields": [
        {"name": "h1", "type": "Edm.String", "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true},
        {"name": "h2", "type": "Edm.String", "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true},
        {"name": "h3", "type": "Edm.String", "searchable": true, "retrievable": true, "filterable": true, "facetable": true, "sortable": true}
      ]
    },
    {"name": "ordinal_position", "type": "Edm.Int32", "searchable": false, "retrievable": true, "filterable": true, "facetable": true, "sortable": true}
  ]
}

Om te herhalen, hebben we subvelden tot h3 in het sectie-object, omdat markdownHeaderDepth is ingesteld op h3.

Als u dit schema gebruikt, moet u latere aanvragen dienovereenkomstig aanpassen. Hiervoor moet u de veldtoewijzingen uit de configuratie van de indexeerfunctie verwijderen en zoekquery's bijwerken om de bijbehorende veldnamen te gebruiken.

Een indexeerfunctie maken en uitvoeren

Indexeerfuncties: met create (REST API) maakt u een indexeerfunctie voor uw zoekservice. Een indexeerfunctie maakt verbinding met de gegevensbron, laadt en indexeert gegevens en biedt desgewenst een planning voor het automatiseren van de gegevensvernieuwing.

### Create and run an indexer
POST {{baseUrl}}/indexers?api-version=2026-04-01  HTTP/1.1
Content-Type: application/json
api-key: {{apiKey}}

{
  "name": "sample-markdown-indexer",
  "dataSourceName": "sample-markdown-ds",
  "targetIndexName": "sample-markdown-index",
  "parameters" : { 
    "configuration": { 
      "parsingMode": "markdown",
      "markdownParsingSubmode": "oneToMany",
      "markdownHeaderDepth": "h3"
      }
    },
  "fieldMappings" : [ 
    {
      "sourceFieldName": "/sections/h1",
      "targetFieldName": "title",
      "mappingFunction": null
    }
  ]
}

Belangrijkste punten:

  • De indexeerfunctie parseert alleen headers tot h3. Eventuele kopteksten op een lager niveau (h4,h5,h6) worden behandeld als tekst zonder opmaak en worden weergegeven in het content veld. Daarom bestaan de index- en veldtoewijzingen alleen tot een diepte van h3.

  • De velden content en ordinal_position vereisen geen veldtoewijzing omdat ze met deze namen in de verrijkte inhoud bestaan.

Queries uitvoeren

U kunt beginnen met zoeken zodra het eerste document is geladen.

### Query the index
POST {{baseUrl}}/indexes/sample-markdown-index/docs/search?api-version=2026-04-01  HTTP/1.1
Content-Type: application/json
api-key: {{apiKey}}
  
{
  "search": "*",
  "count": true
}

Verzend de aanvraag. Dit is een niet-opgegeven zoekquery voor volledige tekst die alle velden retourneert die zijn gemarkeerd als ophaalbaar in de index, samen met een aantal documenten. Het antwoord moet er als volgt uitzien:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
Strict-Transport-Security: max-age=2592000, max-age=15724800; includeSubDomains
Preference-Applied: odata.include-annotations="*"
OData-Version: 4.0
request-id: 6b94e605-55e8-47a5-ae15-834f926ddd14
elapsed-time: 77
Date: Fri, 25 Oct 2024 20:22:58 GMT
Connection: close

{
  "@odata.context": "https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net/indexes('sample-markdown-index')/$metadata#docs(*)",
  "@odata.count": 22,
  "value": [
    <22 search documents here>
  ]
}

Voeg een search parameter toe om te zoeken naar een tekenreeks.

### Query the index
POST {{baseUrl}}/indexes/sample-markdown-index/docs/search?api-version=2026-04-01  HTTP/1.1
Content-Type: application/json
api-key: {{apiKey}}
  
{
  "search": "h4",
  "count": true
}

Verzend de aanvraag. Het antwoord moet er als volgt uitzien:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
Strict-Transport-Security: max-age=2592000, max-age=15724800; includeSubDomains
Preference-Applied: odata.include-annotations="*"
OData-Version: 4.0
request-id: ec5d03f1-e3e7-472f-9396-7ff8e3782105
elapsed-time: 52
Date: Fri, 25 Oct 2024 20:26:29 GMT
Connection: close

{
  "@odata.context": "https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net/indexes('sample-markdown-index')/$metadata#docs(*)",
  "@odata.count": 1,
  "value": [
    {
      "@search.score": 0.8744742,
      "section_id": "aHR0cHM6Ly9hcmphZ2Fubmpma2ZpbGVzLmJsb2IuY29yZS53aW5kb3dzLm5ldC9tYXJrZG93bi10dXRvcmlhbC9zYW1wbGVfbWFya2Rvd24ubWQ7NA2",
      "content": "#### h4 example\r\n##### h5 example\r\n###### h6 example\r\nThis is an example of content underneath a header.\r\n",
      "title": "Project Documentation",
      "h2_subheader": "Headers",
      "h3_subheader": "h3 example",
      "ordinal_position": 4
    }
  ]
}

Belangrijkste punten:

  • Omdat de markdownHeaderDepth waarden zijn ingesteld op h3, worden de h4, h5en h6 kopteksten behandeld als tekst zonder opmaak, zodat ze in het content veld worden weergegeven.

  • Ordinale positie hier is 4. Deze inhoud wordt vierde van de 22 totale inhoudssecties weergegeven.

Voeg een select parameter toe om de resultaten te beperken tot minder velden. Voeg een filter toe om de zoekopdracht verder te verfijnen.

### Query the index
POST {{baseUrl}}/indexes/sample-markdown-index/docs/search?api-version=2026-04-01  HTTP/1.1
Content-Type: application/json
api-key: {{apiKey}}
  
{
  "search": "Markdown",
  "count": true,
  "select": "title, content, h2_subheader",
  "filter": "h2_subheader eq 'Conclusion'"
}
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
Strict-Transport-Security: max-age=2592000, max-age=15724800; includeSubDomains
Preference-Applied: odata.include-annotations="*"
OData-Version: 4.0
request-id: a6f9bd46-a064-4e28-818f-ea077618014b
elapsed-time: 35
Date: Fri, 25 Oct 2024 20:36:10 GMT
Connection: close

{
  "@odata.context": "https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net/indexes('sample-markdown-index')/$metadata#docs(*)",
  "@odata.count": 1,
  "value": [
    {
      "@search.score": 1.1029507,
      "content": "Markdown is a lightweight yet powerful tool for writing documentation. It supports a variety of formatting options while maintaining simplicity and readability.\r\n\r\nThank you for reviewing this example!",
      "title": "Project Documentation",
      "h2_subheader": "Conclusion"
    }
  ]
}

Voor filters kunt u ook logische operators (en, of niet) en vergelijkingsoperators (eq, ne, gt, lt, ge, le) gebruiken. Tekenreeksvergelijkingen zijn hoofdlettergevoelig. Zie Een query maken voor meer informatie en voorbeelden.

Opmerking

De $filter parameter werkt alleen op velden die zijn gemarkeerd als filterbaar bij het maken van uw index.

Opnieuw instellen en opnieuw uitvoeren

Indexers kunnen opnieuw worden ingesteld voor het wissen van de uitvoeringsgeschiedenis, waarmee een volledige herhaling kan worden uitgevoerd. De volgende verzoeken resetten en herstarten de indexeerfunctie.

### Reset the indexer
POST {{baseUrl}}/indexers/sample-markdown-indexer/reset?api-version=2026-04-01  HTTP/1.1
api-key: {{apiKey}}

### Run the indexer
POST {{baseUrl}}/indexers/sample-markdown-indexer/run?api-version=2026-04-01  HTTP/1.1
api-key: {{apiKey}}

### Check indexer status 
GET {{baseUrl}}/indexers/sample-markdown-indexer/status?api-version=2026-04-01  HTTP/1.1
api-key: {{apiKey}}

Resources opschonen

Wanneer u in uw eigen abonnement werkt, is het aan het einde van een project een goed idee om de resources te verwijderen die u niet meer nodig hebt. Hulpbronnen die blijven draaien, kunnen voor u geld kosten. U kunt resources afzonderlijk verwijderen of de resourcegroep verwijderen om de hele set resources te verwijderen.

U kunt de Azure-portal gebruiken om indexen, indexeerfuncties en gegevensbronnen te verwijderen.

Volgende stappen

Nu u bekend bent met de basisprincipes van Azure Blob-indexering, gaat u dieper in op de configuratie van de indexeerfunctie voor Markdown-blobs in Azure Storage: