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
Tip
Pokračujte k kurzu: Po kontrole tohoto článku si projděte data Markdownu ze služby Azure Blob Storage .
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 , , h5 h6(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á h1 hodnota , 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 h6 je . |
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 nastavenamarkdownHeaderDepth
hodnotah3
, obsahuje řetězcová poleh1
,h2
ah3
. 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/h2
atd. 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
, h1
sections
a 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.String
a 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 h6
zachytá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
,h3
atd.) 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 obsahujeheader_level
také , ,header_name
content
aordinal_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 h1
pododdílu , název pododdílu v prvním h2
a souhrn v obsahu konečného odstavce pod posledním h1
odstavcem . 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.