Udostępnij za pośrednictwem


Indeksowanie obiektów blob i plików markdown w usłudze Azure AI Search

Uwaga

Ta funkcja jest obecnie w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie jest zalecana w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.

W usłudze Azure AI Search indeksatory dla usług Azure Blob Storage, Azure Files i OneLake obsługują markdown tryb analizowania plików Markdown. Pliki markdown można indeksować na dwa sposoby:

  • Tryb analizowania jeden do wielu, tworząc wiele dokumentów wyszukiwania na plik Markdown
  • Tryb analizowania jeden do jednego, tworząc jeden dokument wyszukiwania dla pliku Markdown

Napiwek

Przejdź do samouczka: wyszukiwanie danych markdown z usługi Azure Blob Storage po zapoznaniu się z tym artykułem.

Wymagania wstępne

  • Obsługiwane źródło danych: Azure Blob Storage, Azure File Storage, OneLake w usłudze Microsoft Fabric.

    W przypadku usługi OneLake upewnij się, że spełniasz wszystkie wymagania indeksatora OneLake.

    Usługa Azure Storage dla indeksatorów obiektów blob i indeksatorów plików to standardowe wystąpienie wydajności (ogólnego przeznaczenia w wersji 2), które obsługuje warstwy dostępu Gorąca i Chłodna.

Parametry trybu analizowania języka Markdown

Parametry trybu analizowania są określane w definicji indeksatora podczas tworzenia lub aktualizowania indeksatora.

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"
    }
  },
}

Indeksator obiektów blob udostępnia submode parametr służący do określania danych wyjściowych struktury dokumentów wyszukiwania. Tryb analizowania języka Markdown udostępnia następujące opcje podmodu:

parsingMode tryb podrzędny Wyszukaj dokument opis
markdown oneToMany Wiele na obiekt blob (ustawienie domyślne) Podział języka Markdown na wiele dokumentów wyszukiwania, z których każda reprezentuje sekcję zawartości (inną niż nagłówek) pliku Markdown. Można pominąć tryb podrzędny, chyba że chcesz przeanalizować jeden do jednego.
markdown oneToOne Jeden na obiekt blob Analizuje język Markdown w jednym dokumencie wyszukiwania, a sekcje są mapowane na określone nagłówki w pliku Markdown.

W przypadku oneToMany podmodu należy przejrzeć temat Indeksowanie jednego obiektu blob, aby utworzyć wiele dokumentów wyszukiwania, aby zrozumieć, jak indeksator obiektów blob obsługuje uściślanie klucza dokumentu dla wielu dokumentów wyszukiwania utworzonych z tego samego obiektu blob.

W kolejnych sekcjach bardziej szczegółowo opisano poszczególne podmody. Jeśli nie znasz klientów i pojęć indeksatora, zobacz Tworzenie indeksatora wyszukiwania. Należy również zapoznać się ze szczegółami podstawowej konfiguracji indeksatora obiektów blob, która nie jest powtarzana w tym miejscu.

Opcjonalne parametry analizowania języka Markdown

W parametrach jest rozróżniana wielkość liter.

Nazwa parametru Dozwolone wartości opis
markdownHeaderDepth h1, , h2, h3, h4, , h5h6(default) Ten parametr określa najgłębszy poziom nagłówka, który jest brany pod uwagę podczas analizowania, co pozwala na elastyczną obsługę struktury dokumentu (na przykład gdy markdownHeaderDepth jest ustawiona na h1, analizator rozpoznaje tylko nagłówki najwyższego poziomu, które zaczynają się od "#", a wszystkie nagłówki niższego poziomu są traktowane jako zwykły tekst). Jeśli nie zostanie określony, wartość domyślna to h6.

To ustawienie można zmienić po początkowym utworzeniu indeksatora, jednak struktura wynikowych dokumentów wyszukiwania może ulec zmianie w zależności od zawartości języka Markdown.

Obsługiwane elementy języka Markdown

Analizowanie języka Markdown spowoduje podzielenie zawartości tylko na podstawie nagłówków. Wszystkie inne elementy, takie jak listy, bloki kodu, tabele itd., są traktowane jako zwykły tekst i przekazywane do pola zawartości.

Przykładowa zawartość języka Markdown

Następująca zawartość języka Markdown jest używana dla przykładów na tej stronie:

# Section 1
Content for section 1.

## Subsection 1.1
Content for subsection 1.1.

# Section 2
Content for section 2.

Korzystanie z trybu analizowania jeden do wielu

Tryb analizowania jeden do wielu analizuje pliki Markdown w wielu dokumentach wyszukiwania, gdzie każdy dokument odpowiada określonej sekcji zawartości pliku Markdown na podstawie metadanych nagłówka w tym momencie dokumentu. Język Markdown jest analizowany na podstawie nagłówków w dokumentach wyszukiwania, które zawierają następującą zawartość:

  • content: ciąg zawierający nieprzetworzone znaczniki Markdown znalezione w określonej lokalizacji na podstawie metadanych nagłówka w tym momencie dokumentu.

  • sections: obiekt zawierający pola podrzędne metadanych nagłówka do żądanego poziomu nagłówka. Na przykład gdy markdownHeaderDepth jest ustawiona wartość h3, zawiera pola ciągów h1, h2i h3. Te pola są indeksowane przez dublowanie tej struktury w indeksie lub mapowania pól w formacie /sections/h1, sections/h2itp. Zobacz konfiguracje indeksu i indeksatora w poniższych przykładach, aby zapoznać się z przykładami w kontekście. Zawarte pola podrzędne to:

    • h1 - Ciąg zawierający wartość nagłówka h1. Pusty ciąg, jeśli nie zostanie ustawiony w tym momencie w dokumencie.
    • (Opcjonalnie) h2- Ciąg zawierający wartość nagłówka h2. Pusty ciąg, jeśli nie zostanie ustawiony w tym momencie w dokumencie.
    • (Opcjonalnie) h3- Ciąg zawierający wartość nagłówka h3. Pusty ciąg, jeśli nie zostanie ustawiony w tym momencie w dokumencie.
    • (Opcjonalnie) h4- Ciąg zawierający wartość nagłówka h4. Pusty ciąg, jeśli nie zostanie ustawiony w tym momencie w dokumencie.
    • (Opcjonalnie) h5- Ciąg zawierający wartość nagłówka h5. Pusty ciąg, jeśli nie zostanie ustawiony w tym momencie w dokumencie.
    • (Opcjonalnie) h6- Ciąg zawierający wartość nagłówka h6. Pusty ciąg, jeśli nie zostanie ustawiony w tym momencie w dokumencie.
  • ordinal_position: wartość całkowita wskazująca położenie sekcji w hierarchii dokumentów. To pole służy do porządkowania sekcji w ich oryginalnej sekwencji, jak są one wyświetlane w dokumencie, począwszy od porządkowej pozycji 1 i przyrostowego sekwencyjnie dla każdego nagłówka.

Schemat indeksu dla analizowania jeden do wielu

Przykładowa konfiguracja indeksu może wyglądać mniej więcej tak:

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

Definicja indeksatora do analizowania "jeden do wielu"

Jeśli nazwy pól i typy danych są wyrównane, indeksator obiektów blob może wywnioskować mapowanie bez jawnego mapowania pól w żądaniu, więc konfiguracja indeksatora odpowiadająca podanej konfiguracji indeksu może wyglądać następująco:

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" }
  },
}

Uwaga

Nie submode trzeba jawnie ustawiać w tym miejscu, ponieważ oneToMany jest to ustawienie domyślne.

Dane wyjściowe indeksatora do analizowania "jeden do wielu"

Ten plik Markdown spowoduje wyświetlenie trzech dokumentów wyszukiwania po indeksowaniu ze względu na trzy sekcje zawartości. Dokument wyszukiwania wynikający z pierwszej sekcji zawartości dostarczonego dokumentu markdown zawiera następujące wartości dla contentelementów , , sectionsh1i 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
  }
}   

Mapowanie pól jeden do wielu w indeksie wyszukiwania

Mapowania pól kojarzą pole źródłowe z polem docelowym w sytuacjach, w których nazwy pól i typy nie są identyczne. Jednak mapowania pól mogą być również używane do dopasowywania części dokumentu markdown i "lift" do pól najwyższego poziomu dokumentu wyszukiwania.

Poniższy przykład ilustruje ten scenariusz. Aby uzyskać więcej informacji na temat mapowań pól w ogóle, zobacz Mapowania pól.

Przyjmij indeks wyszukiwania z następującymi polami: raw_content typu Edm.String, h1_header typu i h2_header typu Edm.StringEdm.String. Aby zamapować znacznik Markdown na żądany kształt, użyj następujących mapowań pól:

"fieldMappings" : [
    { "sourceFieldName" : "/content", "targetFieldName" : "raw_content" },
    { "sourceFieldName" : "/sections/h1", "targetFieldName" : "h1_header" },
    { "sourceFieldName" : "/sections/h2", "targetFieldName" : "h2_header" },
  ]

Wynikowy dokument wyszukiwania w indeksie wygląda następująco:

{
  {
    "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": "",
  }
}

Korzystanie z trybu analizowania jeden do jednego

W trybie analizowania jeden do jednego cały dokument Markdown jest indeksowany jako pojedynczy dokument wyszukiwania, zachowując hierarchię i strukturę oryginalnej zawartości. Ten tryb jest najbardziej przydatny, gdy pliki do indeksowania mają wspólną strukturę, dzięki czemu można użyć tej wspólnej struktury w indeksie, aby umożliwić wyszukiwanie odpowiednich pól.

W definicji indeksatora parsingMode ustaw parametr na "markdown" wartość i użyj opcjonalnego markdownHeaderDepth parametru, aby zdefiniować maksymalną głębokość nagłówka dla fragmentowania. Jeśli nie zostanie określony, wartość domyślna to h6, przechwytując wszystkie możliwe głębokości nagłówka.

Język Markdown jest analizowany na podstawie nagłówków w dokumentach wyszukiwania, które zawierają następującą zawartość:

  • document_content: zawiera pełny tekst języka Markdown jako pojedynczy ciąg. To pole służy jako nieprzetworzona reprezentacja dokumentu wejściowego.

  • sections: tablica obiektów, która zawiera hierarchiczną reprezentację sekcji w dokumencie Markdown. Każda sekcja jest reprezentowana jako obiekt w tej tablicy i przechwytuje strukturę dokumentu w sposób zagnieżdżony odpowiadający nagłówkom i odpowiedniej zawartości. Pola są dostępne za pośrednictwem mapowań pól, odwołując się do ścieżki, na przykład /sections/content. Obiekty w tej tablicy mają następujące właściwości:

    • header_level: ciąg wskazujący poziom nagłówka (h1, h2, h3itp.) w składni języka Markdown. To pole ułatwia zrozumienie hierarchii i struktury zawartości.

    • header_name: ciąg zawierający tekst nagłówka, który pojawia się w dokumencie Markdown. To pole zawiera etykietę lub tytuł sekcji.

    • content: ciąg zawierający zawartość tekstową, która bezpośrednio następuje po nagłówku, aż do następnego nagłówka. To pole przechwytuje szczegółowe informacje lub opis skojarzony z nagłówkiem. Jeśli nie ma zawartości bezpośrednio pod nagłówkiem, jest to pusty ciąg.

    • ordinal_position: wartość całkowita wskazująca położenie sekcji w hierarchii dokumentów. To pole służy do porządkowania sekcji w oryginalnej sekwencji, gdy pojawiają się w dokumencie, począwszy od porządkowego położenia 1 i przyrostowego sekwencyjnie dla każdego bloku zawartości.

    • sections: Tablica zawierająca obiekty reprezentujące podsekcje zagnieżdżone w bieżącej sekcji. Ta tablica jest zgodna z tą samą strukturą co tablica najwyższego poziomu sections , umożliwiająca reprezentację wielu poziomów zagnieżdżonej zawartości. Każdy obiekt podsekcji zawiera header_levelrównież właściwości , header_namecontent, iordinal_position, włączając strukturę rekursywną reprezentującą i hierarchię zawartości języka Markdown.

Oto przykładowy kod Markdown, którego używamy do wyjaśnienia schematu indeksu zaprojektowanego wokół każdego trybu analizowania.

# Section 1
Content for section 1.

## Subsection 1.1
Content for subsection 1.1.

# Section 2
Content for section 2.

Schemat indeksu na potrzeby analizowania jeden do jednego

Jeśli nie używasz mapowań pól, kształt indeksu powinien odzwierciedlać kształt zawartości języka Markdown. Biorąc pod uwagę strukturę przykładowego języka Markdown z dwiema sekcjami i pojedynczą podsekcją, indeks powinien wyglądać podobnie do poniższego przykładu:

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

Definicja indeksatora na potrzeby analizowania jeden do jednego

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",
    }
  }
}

Dane wyjściowe indeksatora do analizy jeden do jednego

Ponieważ indeks języka Markdown, który chcemy indeksować, przechodzi tylko do głębokości h2 ("##"), potrzebujemy sections pól zagnieżdżonych do głębokości 2, aby je dopasować. Ta konfiguracja spowoduje wyświetlenie następujących danych w indeksie:

  "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": []
    }]
  }

Jak widać, położenie porządkowe zwiększa się na podstawie lokalizacji zawartości w dokumencie.

Należy również zauważyć, że jeśli poziomy nagłówka są pomijane w zawartości, struktura wynikowego dokumentu odzwierciedla nagłówki, które znajdują się w zawartości języka Markdown, niekoniecznie zawierające zagnieżdżone sekcje dla h1 kolejnych h6 . Na przykład gdy dokument rozpoczyna się od h2, pierwszym elementem tablicy sekcji najwyższego poziomu jest h2.

Mapowanie pól jeden do jednego w indeksie wyszukiwania

Jeśli chcesz wyodrębnić pola z nazwami niestandardowymi z dokumentu, możesz użyć mapowań pól, aby to zrobić. Korzystając z tego samego przykładu języka Markdown, jak poprzednio, rozważ następującą konfigurację indeksu:

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

Wyodrębnianie określonych pól z analizowanego kodu Markdown jest obsługiwane podobnie do sposobu, w jaki ścieżki dokumentów znajdują się w elementach outputFieldMappings, z wyjątkiem ścieżki zaczyna się od /sections zamiast /document. Na przykład /sections/0/content mapuje zawartość pod elementem na pozycję 0 w tablicy sekcji.

Przykład silnego przypadku użycia może wyglądać mniej więcej tak: wszystkie pliki Markdown mają tytuł dokumentu w pierwszym h1, tytuł podsekcji w pierwszej h2części i podsumowanie w treści końcowego akapitu poniżej końcowego h1. Do indeksowania tylko tej zawartości można użyć następujących mapowań pól:

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

W tym miejscu wyodrębnisz tylko odpowiednie elementy z tego dokumentu. Aby efektywnie korzystać z tej funkcji, dokumenty, które planujesz indeksować, powinny współużytkować tę samą hierarchiczną strukturę nagłówka.

Wynikowy dokument wyszukiwania w indeksie wygląda następująco:

{
  "content": "Content for section 1.\r\n",
  "document_title": "Section 1",
  "opening_subsection_title": "Subsection 1.1",
  "summary_content": "Content for section 2."
}

Uwaga

Te przykłady określają sposób używania tych trybów analizowania w całości z mapowaniami pól lub bez nich, ale można użyć obu tych metod w jednym scenariuszu, jeśli odpowiada to Twoim potrzebom.

Następne kroki