Kılavuz: REST kullanarak Azure Depolama üzerindeki iç içe geçmiş Markdown bloblarını dizine ekleme

Azure Yapay Zeka Arama, Markdown verilerini nasıl okuyacağını bilen bir indexer kullanarak Azure Blob Depolama'daki Markdown belgelerinin ve dizilerinin dizinini oluşturabilir.

Bu öğreticide Markdown ayrıştırma modunu ve oneToMany kullanarak Markdown dosyalarının dizinini oluşturma işlemleri gösterilmektedir.

Bu öğreticide:

  • Örnek verileri ayarlama ve veri azureblob kaynağını yapılandırma
  • Aranabilir içerik içerecek bir Azure Yapay Zeka Arama dizini oluşturma
  • Kapsayıcıyı okumak ve aranabilir içeriği ayıklamak için dizin oluşturucu oluşturma ve çalıştırma
  • Yeni oluşturduğunuz dizinde arama

Önkoşullar

Not

Bu öğretici için ücretsiz bir arama hizmeti kullanabilirsiniz. Ücretsiz katmanı sizi üç dizin, üç dizin oluşturucu ve üç veri kaynağıyla sınırlar. Bu öğreticide her birinden bir örnek oluşturulur. Başlamadan önce, hizmetinizin yeni kaynakları kabul etmek için yeterli alanı olduğundan emin olun.

Örnek verileri hazırlama

Markdown dosyası oluşturma

Aşağıdaki Markdown dosyasını kopyalayıp adlı sample_markdown.mddosyaya yapıştırın. Örnek veriler, çeşitli Markdown öğelerini içeren tek bir Markdown dosyasıdır. Ücretsiz katmanın depolama sınırları altında kalmak için bir Markdown dosyası seçtik.

# 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!

Dosyayı karşıya yükle ve bağlantı dizesi al

dosyasını Azure Depolama hesabınızdaki bir kapsayıcıya yüklemek için sample_markdown.md yönergeleri izleyin. Depolama hesabının bağlantı dizesini de almanız gerekir. Daha sonra kullanmak üzere bağlantı dizesi ve kapsayıcı adını not edin.

Arama hizmeti URL'si ve API anahtarı kopyalama

Bu öğreticide, Azure Yapay Zeka Arama bağlantıları için bir uç nokta ve API anahtarı gerekir. Bu değerleri Azure portalından alabilirsiniz. Alternatif bağlantı yöntemleri için bkz. Yönetilen kimlikler.

  1. Azure portalında arama hizmetinize gidin.

  2. Sol bölmeden Genel Bakış'ı seçin.

  3. GIBI görünmesi https://my-service.search.windows.netgereken URL'yi not edin.

  4. Sol bölmeden Ayarlar>Anahtarları'nı seçin.

  5. Hizmette tam haklar için bir yönetici anahtarını not edin. İş sürekliliğini sağlamak için biri devredilmesi gerektiğinde kullanılabilen iki değiştirilebilir yönetici anahtarı vardır. nesneleri eklemek, değiştirmek ve silmek için isteklerde iki anahtardan birini kullanabilirsiniz.

     Azure portalındaki URL ve API anahtarlarının ekran görüntüsü.

REST dosyanızı ayarlama

  1. Visual Studio Code'da bir dosya oluşturun.

  2. İstekte kullanılan değişkenler için değerler sağlayın.

    @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. Veya .rest dosya uzantısını kullanarak .http dosyayı kaydedin.

REST istemcisiyle ilgili yardım için bkz . Hızlı Başlangıç: REST kullanarak tam metin arama.

Veri kaynağı oluşturma

Veri Kaynakları - Oluştur (REST API), hangi verilerin dizine alınacağını belirten bir veri kaynağı bağlantısı oluşturur.

### 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
}

İsteği gönderin. Yanıt şöyle görünmelidir:

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
}

Dizin oluşturma

Dizinler - Oluştur (REST API), arama hizmetinizde bir arama dizini oluşturur. Dizin tüm alanları ve bunların özniteliklerini belirtir.

Bire çok ayrıştırmada, arama belgesi ilişkinin 'çok' tarafını tanımlar. Dizinde belirttiğiniz alanlar, arama belgesinin yapısını belirler.

Yalnızca ayrıştırıcının desteklediği Markdown öğeleri için alanlara ihtiyacınız vardır. Bu alanlar şunlardır:

  • content: Belgenin o noktasındaki üst bilgi meta verilerini temel alarak belirli bir konumda bulunan ham Markdown'ı içeren dize.

  • sections: üst bilgi meta verileri için istenen üst bilgi düzeyine kadar alt alanları içeren bir nesne. Örneğin, markdownHeaderDepth olarak ayarlandığında h3, h1, h2 ve h3 dize alanlarını içerir. Bu alanlar, dizindeki bu yapıyı yansıtarak veya /sections/h1, /sections/h2 biçiminde alan eşlemeleri aracılığıyla dizinlenir. Bağlam içi örnekler için aşağıdaki örneklerde yer alan dizin ve dizin oluşturucu yapılandırmalarına bakın. İçeren alt alanları şunlardır:

    • h1 - h1 üst bilgi değerini içeren bir dize. Belgenin bu noktasında ayarlanmadıysa boş dize.
    • (İsteğe bağlı) h2- h2 üst bilgi değerini içeren bir dize. Belgenin bu noktasında ayarlanmadıysa boş dize.
    • (İsteğe bağlı) h3- h3 üst bilgi değerini içeren bir dize. Belgenin bu noktasında ayarlanmadıysa boş dize.
    • (İsteğe bağlı) h4- h4 üst bilgi değerini içeren bir dize. Belgenin bu noktasında ayarlanmadıysa boş dize.
    • (İsteğe bağlı) h5- h5 üst bilgi değerini içeren bir dize. Belgenin bu noktasında ayarlanmadıysa boş dize.
    • (İsteğe bağlı) h6- h6 üst bilgi değerini içeren bir dize. Belgenin bu noktasında ayarlanmadıysa boş dize.
  • ordinal_position: Bölümün belge hiyerarşisi içindeki konumunu gösteren bir tamsayı değeri. Bu alan, 1 sıralı bir konumdan başlayarak ve her içerik bloğu için sıralı olarak artırılarak, bölümleri belgede göründükleri şekilde özgün sıralarında sıralamak için kullanılır.

Bu uygulama, zenginleştirilmiş içerikten dizine eşlemek için dizin oluşturucudaki alan eşlemelerini kullanır. Ayrıştırılmış bire çok belge yapısı hakkında daha fazla bilgi için bkz. Dizin Markdown blobları.

Bu örnek, alan eşlemeleriyle ve alan eşlemeleri olmadan verilerin nasıl dizine yüklenip dizine alınmayacaklarına yönelik örnekler sağlar. Bu durumda, h1 belgenin başlığını içerir ve title adlı bir alanla eşleşir. h2 ve h3 alanları sırasıyla h2_subheader ve h3_subheader ile eşleşir. content ve ordinal_position alanları, Markdown'dan doğrudan bu adlar kullanılarak alanlara ayıklandığı için eşleme gerektirmez. Alan eşlemeleri gerektirmeyen bir tam dizin şeması örneği için bu bölümün sonuna bakın.

### 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}
  ]
}

Alan eşlemesi olmayan bir yapılandırmada dizin şeması

Alan eşlemeleri, zenginleştirilmiş içeriği istediğiniz dizin şekline sığacak şekilde işlemenize ve filtrelemenize olanak sağlar. Ancak zenginleştirilmiş içeriği doğrudan almak isteyebilirsiniz. Bu durumda şema şöyle görünür:

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

Tekrar belirtmek gerekirse, h3 'ye kadar alt alanlarımız sections nesnesinde bulunmaktadır çünkü markdownHeaderDepthh3 olarak ayarlanmıştır.

Bu şemayı kullanıyorsanız, sonraki istekleri uygun şekilde ayarladığınızdan emin olun. Bunu yapmak için alan eşlemelerinin dizin oluşturucu yapılandırmasından kaldırılması ve arama sorgularının ilgili alan adlarını kullanacak şekilde güncelleştirilmesi gerekir.

Dizin oluşturucu oluşturma ve çalıştırma

Dizin Oluşturucular - Oluştur (REST API), arama hizmetinizde bir dizin oluşturucu oluşturur. Dizin oluşturucu veri kaynağına bağlanır, verileri yükler ve dizinler ve isteğe bağlı olarak veri yenilemeyi otomatikleştirmek için bir zamanlama sağlar.

### 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
    }
  ]
}

Önemli noktalar:

  • Dizin oluşturucu yalnızca üst bilgileri h3 kadar ayrıştırıyor. Alt düzey başlıklar (h4, h5, h6) düz metin olarak değerlendirilir ve content alanında gösterilir. Dizin ve alan eşlemelerinin yalnızca derinliğine h3kadar mevcut olmasının nedeni budur.

  • content ve ordinal_position alanları, zenginleştirilmiş içerikte bu adlarla mevcut olduğundan alan eşlemesi gerektirmez.

Sorgu çalıştırma

İlk belge yüklenir yüklenmez aramaya başlayabilirsiniz.

### 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
}

İsteği gönderin. Bu, dizinde alınabilir olarak işaretlenmiş tüm alanları ve belge sayısını döndüren belirtilmeyen bir tam metin arama sorgusudur. Yanıt şöyle görünmelidir:

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

search Dize aramak için bir parametre ekleyin.

### 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
}

İsteği gönderin. Yanıt şöyle görünmelidir:

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

Önemli noktalar:

  • markdownHeaderDepth olarak ayarlandığından h3, h4, h5 ve h6 üst bilgileri düz metin olarak kabul edilir ve bu nedenle content alanında görünürler.

  • Sıra konumu buradadır 4. Bu içerik, toplam 22 içerik bölümünden dördüncü sırada görünür.

Sonuçları daha az alanla sınırlamak için bir select parametre ekleyin. Aramayı daha da daraltmak için bir filter ekleyin.

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

Filtreler için mantıksal işleçleri (ve veya değil) ve karşılaştırma işleçlerini (eq, ne, gt, lt, ge, le) de kullanabilirsiniz. Dize karşılaştırmaları büyük/küçük harfe duyarlıdır. Daha fazla bilgi ve örnek için bkz. Sorgu oluşturma.

Not

$filter parametresi yalnızca dizininizin oluşturulması sırasında filtrelenebilir olarak işaretlenmiş alanlarda çalışır.

Sıfırla ve tekrar çalıştır

İndeksleyiciler, tam bir yeniden başlatma için yürütme geçmişini temizlemek amacıyla sıfırlanabilir. Aşağıdaki istekler dizin oluşturucuyu sıfırlar ve yeniden çalıştırır.

### 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}}

Kaynakları temizleme

Kendi aboneliğinizde çalışırken, bir projenin sonunda artık ihtiyacınız olmayan kaynakları kaldırmak iyi bir fikirdir. Çalışmaya devam eden kaynaklar size pahalıya mal olabilir. Kaynakları tek tek silebilir veya kaynak grubunu silip kaynak kümesinin tamamını silebilirsiniz.

dizinleri, dizin oluşturucuları ve veri kaynaklarını silmek için Azure portalını kullanabilirsiniz.

Sonraki adımlar

Artık Azure Blob dizin oluşturmanın temellerini bildiğinize göre, Azure Depolama Markdown blobları için dizin oluşturucu yapılandırmasına daha yakından bakın: