Sdílet prostřednictvím


Indexování objektů blob a souborů Markdownu ve službě Azure AI Search

Poznámka:

Tato funkce je v současné době ve verzi Public Preview. Tato verze Preview je poskytována bez smlouvy o úrovni služeb a nedoporučuje se pro produkční úlohy. Některé funkce se nemusí podporovat nebo mohou mít omezené možnosti. Další informace najdete v dodatečných podmínkách použití pro verze Preview v Microsoft Azure.

Ve službě Azure AI Search podporují indexery pro Azure Blob Storage, Soubory Azure a OneLake markdown režim analýzy souborů Markdown. Soubory Markdownu je možné indexovat dvěma způsoby:

  • Režim analýzy 1:N, vytvoření více dokumentů hledání na soubor Markdownu
  • Režim analýzy 1:1, vytvoření jednoho vyhledávacího dokumentu na soubor Markdownu

Požadavky

  • Podporovaný zdroj dat: Azure Blob Storage, Azure File Storage, OneLake v Microsoft Fabric.

    V případě OneLake se ujistěte, že splňujete všechny požadavky indexeru OneLake.

    Azure Storage pro indexery objektů blob a indexery souborů je standardní instance výkonu (pro obecné účely v2), která podporuje horkou a studenou úroveň přístupu.

Parametry režimu analýzy Markdownu

Parametry režimu analýzy se zadají v definici indexeru při vytváření nebo aktualizaci indexeru.

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

Indexer objektů blob poskytuje submode parametr pro určení výstupu struktury vyhledávacích dokumentů. Režim analýzy Markdownu nabízí následující možnosti dílčího režimu:

parsingMode dílčí vid Hledat v dokumentu Popis
markdown oneToMany Více objektů blob na objekt blob (výchozí) Rozdělí Markdown do více prohledávacích dokumentů, z nichž každý představuje oddíl obsahu (neheader) souboru Markdownu. Dílčí režim můžete vynechat, pokud nechcete parsovat 1:1.
markdown oneToOne Jeden na objekt blob Parsuje Markdown do jednoho vyhledávacího dokumentu s oddíly namapovanými na konkrétní záhlaví v souboru Markdownu.

V oneToMany případě dílčího režimu byste měli zkontrolovat indexování jednoho objektu blob a vytvořit mnoho vyhledávacích dokumentů , abyste pochopili, jak indexer objektů blob zpracovává nejednoznačnost klíče dokumentu pro více prohledávacích dokumentů vytvořených ze stejného objektu blob.

Další části popisují jednotlivé dílčímody podrobněji. Pokud neznáte klienty a koncepty indexeru, přečtěte si téma Vytvoření indexeru vyhledávání. Měli byste být také obeznámeni s podrobnostmi základní konfigurace indexeru objektů blob, která se zde neopakuje.

Volitelné parametry analýzy Markdownu

Parametry rozlišují malá a velká písmena.

Název parametru Povolené hodnoty Popis
markdownHeaderDepth h1, h2, h3, h4, , h5h6(default) Tento parametr určuje nejnižší úroveň záhlaví, která se při analýze považuje, což umožňuje flexibilní zpracování struktury dokumentu (například pokud markdownHeaderDepth je nastavená h1hodnota , analyzátor rozpoznává pouze hlavičky nejvyšší úrovně, které začínají na "#", a všechny hlavičky nižší úrovně se považují za prostý text). Pokud není zadáno, výchozí hodnota h6je .

Toto nastavení lze po počátečním vytvoření indexeru změnit, ale struktura výsledných vyhledávacích dokumentů se může v závislosti na obsahu Markdownu změnit.

Podporované prvky Markdownu

Analýza Markdownu rozdělí obsah jenom na základě záhlaví. Všechny ostatní prvky, jako jsou seznamy, bloky kódu, tabulky atd., se považují za prostý text a předají se do pole obsahu.

Ukázkový obsah Markdownu

Následující obsah Markdownu se používá pro příklady na této stránce:

# Section 1
Content for section 1.

## Subsection 1.1
Content for subsection 1.1.

# Section 2
Content for section 2.

Použití režimu analýzy 1:N

Režim analýzy 1:N parsuje soubory Markdownu do více vyhledávacích dokumentů, kde každý dokument odpovídá určitému oddílu obsahu souboru Markdownu na základě metadat záhlaví v tomto okamžiku v dokumentu. Markdown se analyzuje na základě hlaviček do vyhledávacích dokumentů, které obsahují následující obsah:

  • content: Řetězec, který obsahuje nezpracovaný Markdown nalezený v určitém umístění, na základě metadat záhlaví v tomto okamžiku v dokumentu.

  • sections: Objekt, který obsahuje podpole pro metadata záhlaví až do požadované úrovně záhlaví. Pokud je například nastavena markdownHeaderDepth hodnota h3, obsahuje řetězcová pole h1, h2a h3. Tato pole jsou indexována zrcadlením této struktury v indexu, nebo prostřednictvím mapování polí ve formátu /sections/h1, sections/h2atd. Příklady v kontextu najdete v následujících ukázkách v konfiguracích indexu a indexeru. Obsažená dílčí pole jsou:

    • h1 – Řetězec obsahující hodnotu hlavičky h1. Prázdný řetězec, pokud není v tomto okamžiku v dokumentu nastaven.
    • (Volitelné) h2– Řetězec obsahující hodnotu záhlaví h2. Prázdný řetězec, pokud není v tomto okamžiku v dokumentu nastaven.
    • (Volitelné) h3– Řetězec obsahující hodnotu hlavičky h3. Prázdný řetězec, pokud není v tomto okamžiku v dokumentu nastaven.
    • (Volitelné) h4– Řetězec obsahující hodnotu hlavičky h4. Prázdný řetězec, pokud není v tomto okamžiku v dokumentu nastaven.
    • (Volitelné) h5– Řetězec obsahující hodnotu hlavičky h5. Prázdný řetězec, pokud není v tomto okamžiku v dokumentu nastaven.
    • (Volitelné) h6– Řetězec obsahující hodnotu záhlaví h6. Prázdný řetězec, pokud není v tomto okamžiku v dokumentu nastaven.
  • ordinal_position: Celočíselná hodnota označující pozici oddílu v hierarchii dokumentů. Toto pole slouží k seřazení oddílů v jejich původní sekvenci, jak se zobrazují v dokumentu, počínaje pořadovou pozicí 1 a postupně se pro každou hlavičku zvýší.

Schéma indexu pro parsování 1:N

Příklad konfigurace indexu může vypadat nějak takto:

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

Definice indexeru pro parsování 1:N

Pokud jsou názvy polí a datové typy zarovnané, může indexer objektů blob odvodit mapování bez explicitního mapování polí, které je přítomné v požadavku, takže konfigurace indexeru odpovídající zadané konfiguraci indexu může vypadat takto:

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

Poznámka:

Tady submode není nutné explicitně nastavit, protože oneToMany je výchozí.

Výstup indexeru pro parsování 1:N

Výsledkem tohoto souboru Markdownu jsou tři dokumenty hledání po indexování, a to kvůli třem oddílům obsahu. Vyhledávací dokument, který je výsledkem prvního oddílu obsahu poskytnutého dokumentu Markdownu, by obsahoval následující hodnoty pro content, h1sectionsa 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
  }
}   

Mapování polí 1:N v indexu vyhledávání

Mapování polí přidruží zdrojové pole k cílovému poli v situacích, kdy názvy a typy polí nejsou identické. Mapování polí se ale dá použít také ke shodě částí dokumentu Markdownu a jejich "zvednutí" do polí nejvyšší úrovně hledaného dokumentu.

Ilustruje to následující vzorový scénář. Další informace o mapování polí obecně naleznete v tématu mapování polí.

Předpokládejme index vyhledávání s následujícími poli: raw_content typu Edm.String, h1_header typu Edm.Stringa h2_header typu Edm.String. K namapování Markdownu na požadovaný obrazec použijte následující mapování polí:

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

Výsledný vyhledávací dokument v indexu by vypadal takto:

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

Použití režimu analýzy 1:1

V režimu analýzy 1:1 se celý dokument Markdownu indexuje jako jeden vyhledávací dokument a zachová hierarchii a strukturu původního obsahu. Tento režim je nejužitečnější, když soubory, které se mají indexovat, sdílejí společnou strukturu, abyste mohli tuto společnou strukturu v indexu použít k prohledání příslušných polí.

V definici indexeru parsingMode nastavte hodnotu "markdown" volitelného parametru markdownHeaderDepth a definujte maximální hloubku nadpisu pro blokování dat. Pokud není zadáno, ve výchozím nastavení se h6zachytává všechny možné hloubky záhlaví.

Markdown se analyzuje na základě hlaviček do vyhledávacích dokumentů, které obsahují následující obsah:

  • document_content: Obsahuje celý text Markdownu jako jeden řetězec. Toto pole slouží jako nezpracovaná reprezentace vstupního dokumentu.

  • sections: Pole objektů, které obsahuje hierarchické znázornění oddílů v dokumentu Markdownu. Každý oddíl je reprezentován jako objekt v rámci tohoto pole a zachycuje strukturu dokumentu vnořeným způsobem, který odpovídá záhlavím a jejich příslušnému obsahu. Pole jsou přístupná prostřednictvím mapování polí odkazováním na cestu, například /sections/content. Objekty v tomto poli mají následující vlastnosti:

    • header_level: Řetězec, který označuje úroveň záhlaví (h1, h2, h3atd.) v syntaxi Markdownu. Toto pole pomáhá porozumět hierarchii a strukturování obsahu.

    • header_name: Řetězec obsahující text záhlaví, který se zobrazí v dokumentu Markdownu. Toto pole obsahuje popisek nebo název oddílu.

    • content: Řetězec obsahující textový obsah, který bezprostředně následuje za záhlavím, až do další hlavičky. Toto pole zachycuje podrobné informace nebo popis přidružený k hlavičce. Pokud není žádný obsah přímo pod záhlavím, jedná se o prázdný řetězec.

    • ordinal_position: Celočíselná hodnota označující pozici oddílu v hierarchii dokumentů. Toto pole slouží k seřazení oddílů v původní sekvenci, jak se zobrazují v dokumentu, počínaje pořadovou pozicí 1 a postupně se pro každý blok obsahu zvýší.

    • sections: Pole, které obsahuje objekty představující pododdíly vnořené pod aktuálním oddílem. Toto pole se řídí stejnou strukturou jako pole nejvyšší úrovně sections , což umožňuje znázornění více úrovní vnořeného obsahu. Každý objekt pododdílu obsahuje header_leveltaké , , header_namecontenta ordinal_position vlastnosti, které umožňují rekurzivní strukturu, která představuje a hierarchii obsahu Markdownu.

Tady je ukázkový Markdown, který používáme k vysvětlení schématu indexu navrženého pro každý režim analýzy.

# Section 1
Content for section 1.

## Subsection 1.1
Content for subsection 1.1.

# Section 2
Content for section 2.

Schéma indexu pro analýzu 1:1

Pokud nepoužíváte mapování polí, měl by tvar indexu odrážet tvar obsahu Markdownu. Vzhledem k struktuře ukázkového Markdownu se dvěma oddíly a jedním dílčím oddílem by měl index vypadat podobně jako v následujícím příkladu:

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

Definice indexeru pro analýzu 1:1

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

Výstup indexeru pro parsování 1:1

Protože Markdown, který chceme indexovat, přejde jenom do hloubky h2 (##), potřebujeme sections pole vnořená do hloubky 2, aby se shodovala. Výsledkem této konfigurace by byla následující data v indexu:

  "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 vidíte, pořadí pořadí se zvýší na základě umístění obsahu v dokumentu.

Je také třeba poznamenat, že pokud jsou úrovně záhlaví vynechány v obsahu, pak struktura výsledného dokumentu odráží hlavičky, které jsou přítomné v obsahu Markdownu, nemusí nutně obsahovat vnořené oddíly po h1 h6 sobě jdoucí. Například když dokument začíná na h2, pak první prvek v poli oddílů nejvyšší úrovně je h2.

Mapování polí 1:1 v indexu vyhledávání

Pokud chcete z dokumentu extrahovat pole s vlastními názvy, můžete k tomu použít mapování polí. Použití stejné ukázky Markdownu jako předtím zvažte následující konfiguraci indexu:

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

Extrahování konkrétních polí z analyzovaného Markdownu se zpracovává podobně jako cesty k dokumentu ve outputFieldMappings, s výjimkou cesty k cestě začíná /sections místo /document. /sections/0/content Například by se namapoval na obsah pod položkou na pozici 0 v poli oddílů.

Příklad silného případu použití může vypadat nějak takto: všechny soubory Markdownu mají název dokumentu v prvním h1pododdílu , název pododdílu v prvním h2a souhrn v obsahu konečného odstavce pod posledním h1odstavcem . K indexování pouze tohoto obsahu můžete použít následující mapování polí:

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

Tady byste z tohoto dokumentu extrahovali jenom relevantní části. Aby bylo možné tuto funkci efektivně používat, měly by dokumenty, které plánujete indexovat, sdílet stejnou hierarchickou strukturu záhlaví.

Výsledný vyhledávací dokument v indexu by vypadal takto:

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

Poznámka:

Tyto příklady určují, jak tyto režimy analýzy používat zcela s mapováním polí nebo bez nich, ale pokud to vyhovuje vašim potřebám, můžete obojí využít v jednom scénáři.

Další kroky