Definieren einer Indexprojektion für die Parent-Child-Indizierung

Hinweis

Azure KI-Suche ist über das Azure Portal, REST-APIs und Azure SDKs verfügbar. Es unterstützt auch Foundry IQ, die verwaltete Wissensschicht, die Unternehmensinhalte in wiederverwendbare, berechtigungsfähige Wissensbasen für Agenten im Microsoft Foundry-Portal transformiert.

Wenn Sie Inhalte für ein RAG-Muster oder eine Vektorisierung aufteilen, können Sie eine Indexprojektion angeben, um die 1:n-Indizierung zu steuern, wobei Quellinhalt (eins) auf einen oder mehrere Indizes (viele) projiziert wird. Die Absicht einer Indexprojektion besteht darin, zu steuern, ob Elemente des übergeordneten Dokuments, wie z. B. ein Dateiname oder ein Erstellungsdatum, berücksichtigt werden.

  • Wiederholen Sie dies für jedes Kind (jeden Abschnitt) in einem einzelnen Index
  • Werden als eigenständige Suchdokumente im selben Index indiziert
  • Oder werden in separate Indizes aufgenommen

Es wird empfohlen, die übergeordneten Felder in einem einzigen Index zu wiederholen, da unterschiedliche Dokumentformen oder das Aufteilen von Inhalten in zwei Indizes schwierig abzufragen sein kann, insbesondere bei der klassischen Suche, bei der Index-Joins nicht unterstützt werden.

In Azure KI-Suche wird das Chunking von den Skills durchgeführt und hängt somit von den Indexern ab. Um eine Indexprojektion zu definieren, geben Sie sie in einem Skillset an.

Voraussetzungen

Das Skillset enthält die Indexer-Projektion, die sich auf die Daten für die 1:n-Indizierung auswirkt. Ein Skillset könnte auch andere Fähigkeiten haben, z. B. eine Einbettungskompetenz wie AzureOpenAIEmbedding , wenn Ihr Szenario integrierte Vektorisierung umfasst.

Auswählen eines Ansatzes

Indexprojektionen generieren "untergeordnete" Dokumente (Blöcke) für jedes "übergeordnete" Dokument. Wählen Sie aus, wie übergeordnete Inhalte behandelt werden sollen:

Ansatz Beschreibung Konfiguration
Einzelner Index, wiederholte übergeordnete Felder (empfohlen) Übergeordnete Felder wiederholen sich für jeden Teil. Alle Dokumente weisen eine einheitliche Form auf. Legen Sie sowohl die Index- targetIndexName als auch die Indexprojektion targetIndexName auf denselben Index fest. Setze projectionMode auf skipIndexingParentDocuments.
Einzelner Index, gemischte Dokumentformen Übergeordnete Dokumente und Segment-Dokumente koexistieren. Übergeordnete Dokumente haben null Datenblockfelder. Legen Sie beide targetIndexName Werte auf denselben Index fest. Setzen Sie projectionMode auf includeIndexingParentDocuments (oder lassen Sie es weg, da es die Standardeinstellung ist).
Mindestens zwei separate Indizes Übergeordneter Index für Metadatenabfragen, untergeordneter Index für die Suche. Keine Abfragezeit-Verknüpfungen. Legen Sie den Indexer targetIndexName auf den übergeordneten Index fest. Legen Sie die Indexprojektion targetIndexName auf den untergeordneten Index fest. Das Array selectors bestimmt die Menge und Zusammensetzung des untergeordneten Indexes.

Verwenden Sie für die meisten RAG-Szenarien den ersten Ansatz. Siehe das beispiel classic RAG.

  1. Erstellen Sie einen Index , der für Blöcke entwickelt wurde, wobei die übergeordneten Felder enthalten sind.
  2. Erstellen Sie ein Skillset mit einer Segmentierungsfertigkeit und indexProjections.
  3. Erstellen Sie einen Indexer , der auf Ihre unterstützte Datenquelle zeigt.

Wenn Ihre Datenquelle die Änderungsnachverfolgung unterstützt, synchronisiert der Indexer Änderungen automatisch.

Erstellen eines Indexes für die 1:n-Indizierung

Unabhängig davon, ob Sie einen Index für Chunks erstellen, die übergeordnete Werte wiederholen, oder separate Indizes für die Platzierung von Eltern-Kind-Feldern, ist der primäre Index für die Suche auf Datenchunks ausgelegt. Das Indexschema muss über die folgenden Felder verfügen:

  • Ein Dokumentschlüsselfeld, das jedes Dokument eindeutig identifiziert. Er muss als Typ Edm.String mit dem keyword Analyzer definiert werden.

  • Ein Feld, das jedes Segment mit dem übergeordneten Element verknüpft. Er muss vom Typ Edm.Stringsein. Es kann nicht das Dokumentschlüsselfeld sein und muss auf "true" festgelegt sein filterable . Es wird in den Beispielen als parent_id und als projizierter Schlüsselwert in diesem Artikel bezeichnet.

  • Andere Felder für Inhalte, z. B. Text- oder vektorisierte Blockfelder.

Ein Index muss für den Suchdienst vorhanden sein, bevor Sie das Skillset erstellen oder den Indexer ausführen. Die selectors, die Sie im Skillset definieren, sollte diese Felder enthalten.

Einzelnes Indexschema einschließlich übergeordneter und untergeordneter Felder

Ein einzelner Index, der um Segmente mit wiederholtem übergeordnetem Inhalt für jedes Segment entworfen wurde, ist das vorherrschende Muster für RAG- und Vektorsuchszenarien. Die Möglichkeit, den richtigen übergeordneten Inhalt jedem Block zuzuordnen, wird über Indexprojektionen aktiviert.

Das folgende Schema ist ein Beispiel, das die Anforderungen für Indexprojektionen erfüllt. In diesem Beispiel:

  • Übergeordnete Felder sind die parent_id und der Titel, und sie wiederholen sich für jeden Abschnitt.
  • Untergeordnete Felder sind die Blöcke mit und ohne Vektor. Die chunk_id ist die Dokument-ID dieses Indexes.

Sie können das Azure-Portal, REST-APIs oder ein Azure SDK verwenden, um einen Index zu erstellen.

Verwenden Sie einen REST-Client oder die Azure-Portal-Index-Aktion und die JSON-Option, um den Index zu erstellen.

{
    "name": "my_consolidated_index",
    "fields": [
        {"name": "chunk_id", "type": "Edm.String", "key": true, "filterable": true, "analyzer": "keyword"},
        {"name": "parent_id", "type": "Edm.String", "filterable": true},
        {"name": "title", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "retrievable": true},
        {"name": "chunk", "type": "Edm.String","searchable": true,"retrievable": true},
        {"name": "chunk_vector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": false, "stored": false, "dimensions": 1536, "vectorSearchProfile": "hnsw"}
    ],
    "vectorSearch": {
        "algorithms": [{"name": "hnsw", "kind": "hnsw", "hnswParameters": {}}],
        "profiles": [{"name": "hnsw", "algorithm": "hnsw"}]
    }
}

Hinzufügen von Indexprojektionen zu einem Skillset

Indexprojektionen werden in einer Skillsetdefinition definiert und in erster Linie als Array von selectorsdefiniert, wobei jeder Selektor einem anderen Zielindex für den Suchdienst entspricht. Dieser Abschnitt beginnt mit Syntax und Beispielen für Kontext, gefolgt von Parameterreferenz.

Indexprojektionen sind allgemein verfügbar. Wir empfehlen die neueste stabile API:

Hier ist eine Beispielnutzlast für eine Indexprojektionsdefinition, mit der Sie einzelne Seiten projizieren können, die vom Textaufteilungsskill als eigene Dokumente im Suchindex ausgegeben werden.

Wenn das übergeordnete Dokument Berechtigungsmetadaten für den Zugriff auf Dokumentenebene enthält, z. B. metadata_user_ids, metadata_group_ids oder metadata_spo_site_url, schließen Sie diese Felder in mappings ein. Jeder Block muss sie erben, damit Abfragezeitberechtigungsfilter angewendet werden. Weitere Informationen finden Sie unter Auswählen, wo ACL-Felder aufgefüllt werden sollen.

"indexProjections": {
    "selectors": [
        {
            "targetIndexName": "my_consolidated_index",
            "parentKeyFieldName": "parent_id",
            "sourceContext": "/document/pages/*",
            "mappings": [
                {
                    "name": "chunk",
                    "source": "/document/pages/*",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "chunk_vector",
                    "source": "/document/pages/*/chunk_vector",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "title",
                    "source": "/document/title",
                    "sourceContext": null,
                    "inputs": []
                }
            ]
        }
    ],
    "parameters": {
        "projectionMode": "skipIndexingParentDocuments"
    }
}

Parameterverweis

Indexprojektionsparameter Definition
selectors Ein Array mit Parametern für den Hauptsuchkorpus, in der Regel der Index, der um Blöcke ausgelegt ist. Sie können Inhalte an mehrere untergeordnete Indexe senden, indem Sie mehrere Selektoren angeben. Die Indexschemas müssen im Suchdienst vorhanden sein, bevor Sie den Indexer ausführen.
parameters Ein Parameterwörterbuch mit indexprojektionsspezifischen Konfigurationseigenschaften.

Parameter weisen die folgenden Elemente als Teil ihrer Definition auf.

Parameter Definition
parameters.projectionMode Ein optionaler Parameter, der Anweisungen für den Indexer bereitstellt. Gültige Werte enthalten includeIndexingParentDocuments und skipIndexingParentDocuments.

Der beste Wert für diesen Parameter ist skipIndexingParentDocuments. Sie sollten es verwenden, wenn es sich bei abschnittierten Dokumenten um das primäre Suchziel handelt.

Wenn Sie skipIndexingParentDocuments nicht für projectionMode festlegen, erhalten Sie includeIndexingParentDocuments automatisch, da dies die Standardeinstellung ist. Es fügt zusätzliche Suchdokumente in Ihrem Index hinzu, die null für Blöcke sind, aber mit übergeordneten Inhalten aufgefüllt werden. Wenn beispielsweise fünf PDF-Dateien 100 Blöcke zum Index beitragen, beträgt die Anzahl der Dokumente im Index 105. Die fünf Dokumente, die für übergeordnete Felder erstellt wurden, weisen Nullwerte für Chunk (Kind) Felder auf, wodurch sie sich erheblich vom Großteil der Dokumente im Index unterscheiden. Aus diesem Grund empfehlen wirprojectionMode, auf skipIndexingParentDocuments zu setzen.

Selektoren weisen die folgenden Elemente als Teil ihrer Definition auf.

Selektoren Definition
selectors.targetIndexName Der Name des Indexes, in den Indexdaten projiziert werden. Es handelt sich entweder um den einzelnen Abschnittsindex mit wiederholten übergeordneten Feldern oder um den untergeordneten Index, wenn Sie separate Indizes für übergeordnete Inhalte verwenden.
selectors.parentKeyFieldName Der Name des Felds, das den Schlüssel für das übergeordnete Dokument bereitstellt.
selectors.sourceContext Die Anreicherungsanmerkung, die die Granularität definiert, mit der Daten einzelnen Suchdokumenten zugeordnet werden sollen. Weitere Informationen finden Sie unter Qualifikationskontext und Eingabeanmerkungssprache.
selectors.mappings Ein Array von Zuordnungen von erweiterten Daten zu Feldern im Suchindex. Jede Zuordnung besteht aus:
name: Der Name des Felds im Suchindex, in das die Daten indiziert werden sollen.
source: Der Anreicherungsanmerkungspfad, aus dem die Daten abgerufen werden sollen.

Jedes mapping kann Daten auch rekursiv mit optionalen Feldern sourceContext und inputs definieren, ähnlich wie der Wissensspeicher oder die Fähigkeit Shaper Skill. Je nach Anwendung können Sie mit diesen Parametern Daten in Felder vom Typ Edm.ComplexType im Suchindex modellieren. Einige LLMs akzeptieren keinen komplexen Typ in Suchergebnissen. Daher bestimmt das verwendete LLM, ob eine komplexe Typzuordnung hilfreich ist oder nicht.

Der mappings Parameter ist wichtig. Sie müssen jedes Feld im untergeordneten Index explizit zuordnen, mit Ausnahme der ID-Felder wie dem Dokumentschlüssel und der ID des übergeordneten Elements.

Diese Anforderung steht im Gegensatz zu anderen Feldzuordnungskonventionen in Azure KI-Suche. Bei einigen Datenquellentypen kann der Indexer Felder implizit basierend auf ähnlichen Namen oder bekannten Merkmalen zuordnen (z. B. verwenden BLOB-Indexer den eindeutigen Metadatenspeicherpfad als Standarddokumentschlüssel). Bei Indexer-Projektionen müssen Sie jedoch jede Feldzuordnung auf der n-Seite des Verhältnisses ausdrücklich angeben.

Wichtig

Erstellen Sie keine Feldzuordnung für das übergeordnete Schlüsselfeld. Dadurch wird die Änderungsnachverfolgung und die synchronisierte Datenaktualisierung unterbrochen.

Feldzuordnungen überprüfen

Indexer sind mit drei verschiedenen Arten von Feldzuordnungen verbunden. Vor dem Ausführen des Indexers sollten Sie die Feldzuordnungen überprüfen und wissen, wann sie die einzelnen Typen verwenden.

Feldzuordnungen werden in einem Indexer definiert und zum Zuordnen eines Quellfelds zu einem Indexfeld verwendet. Feldzuordnungen werden für Datenpfade verwendet, mit denen Daten aus der Quelle entnommen und zur Indizierung übergeben werden, ohne dass ein Zwischenschritt zur Skillverarbeitung erfolgt. In der Regel kann ein Indexer Felder, die denselben Namen und Typ aufweisen, automatisch zuordnen. Explizite Feldzuordnungen sind nur erforderlich, wenn Diskrepanzen vorliegen. Bei der 1:n-Indizierung und den bisher erläuterten Mustern benötigen Sie möglicherweise keine Feldzuordnungen.

Ausgabefeldzuordnungen werden in einem Indexer definiert und genutzt, um angereicherte Inhalte, die von einem Skillset generiert werden, einem Feld im Hauptindex zuzuordnen. Chunks gelten aufgrund ihrer Erstellung durch eine Funktion (Text Split) als angereicherter Inhalt, aber Sie benötigen keine Ausgabefeldzuordnung für Chunks oder für Indexprojektionen, die durch eine Selektorzuordnung definiert sind.

Selectors.mappings werden in einem Skillset definiert und Feldern im untergeordneten Index zugeordnet. In Fällen, in denen der untergeordnete Index auch übergeordnete Felder enthält (wie in der konsolidierten Indexlösung), sollten Sie Feldzuordnungen für jedes Feld einrichten, das Inhalte enthält, einschließlich des Titelfelds auf übergeordneter Ebene, vorausgesetzt, dass der Titel in jedem abschnittierten Dokument angezeigt werden soll. Wenn Sie separate übergeordnete und untergeordnete Indizes verwenden, sollte die Auswahl Feldzuordnungen für nur die Felder auf untergeordneter Ebene aufweisen.

Hinweis

Sowohl Ausgabefeldzuordnungen als auch Selektorzuordnungen akzeptieren angereicherte Dokumentstrukturknoten als Quelleingaben. Um den Datenpfad einzurichten, ist es entscheidend zu wissen, wie ein Pfad zu jedem Knoten angegeben wird. Weitere Informationen zur Pfadsyntax finden Sie unter Referenzieren eines Pfads zu erweiterten Knoten und Skillsetdefinitionen für Beispiele.

Ausführen des Indexers

Nachdem Sie eine Datenquelle, Indizes und Skillset erstellt haben, können Sie den Indexer erstellen und ausführen. In diesem Schritt wird die Pipeline ausgeführt.

Sie können ihren Suchindex nach Abschluss der Verarbeitung abfragen, um Ihre Lösung zu testen.

Inhaltslebenszyklus

Abhängig von der zugrunde liegenden Datenquelle kann ein Indexer in der Regel fortlaufende Änderungsnachverfolgung und Löschungserkennung bereitstellen. In diesem Abschnitt wird der Inhaltslebenszyklus der 1:n-Indizierung im Zusammenhang mit der Datenaktualisierung erläutert.

Bei Datenquellen, die die Erkennung von Änderungen und Löschungen bereitstellen, kann ein Indexerprozess Änderungen in Ihren Quelldaten abrufen. Jedes Mal, wenn Sie den Indexer und das Skillset ausführen, werden die Indexprojektionen aktualisiert, wenn sich das Skillset oder die zugrunde liegenden Quelldaten geändert haben. Alle vom Indexer übernommenen Änderungen werden über den Anreicherungsprozess an die Projektionen im Index weitergegeben, um sicherzustellen, dass ihre projizierten Daten eine aktuelle Darstellung von Inhalten in der ursprünglichen Datenquelle sind. Die Datenaktualisierungsaktivität wird in einem projizierten Schlüsselwert für jeden Block erfasst. Dieser Wert wird aktualisiert, wenn sich die zugrunde liegenden Daten ändern.

Hinweis

Sie können die Daten in den projizierten Dokumenten zwar manuell mithilfe der Index-Push-API bearbeiten, sie sollten dies jedoch vermeiden. Manuelle Aktualisierungen eines Indexes werden für den nächsten Pipelineaufruf überschrieben, vorausgesetzt, das Dokument in Quelldaten wird aktualisiert, und die Datenquelle hat die Änderungsnachverfolgung oder Löscherkennung aktiviert.

Aktualisierter Inhalt

Wenn Sie Ihrer Datenquelle neue Inhalte hinzufügen, werden dem Index neue Abschnitte oder untergeordnete Dokumente beim nächsten Indexerlauf hinzugefügt.

Wenn Sie vorhandenen Inhalt in der Datenquelle ändern, werden Blöcke inkrementell im Suchindex aktualisiert, wenn die von Ihnen verwendete Datenquelle die Erkennung von Änderungen und Löschungen unterstützt. Wenn sich beispielsweise ein Wort oder ein Satz in einem Dokument ändert, wird der Block im Zielindex, der dieses Wort oder diesen Satz enthält, bei der nächsten Indizierungsausführung aktualisiert. Andere Aktualisierungstypen, z. B. das Ändern eines Feldtyps und einige Zuschreibungen, werden für vorhandene Felder nicht unterstützt. Weitere Informationen zu zulässigen Updates finden Sie unter Aktualisieren eines Indexschemas.

Einige Datenquellen wie Azure Storage unterstützen die Änderungs- und Löschnachverfolgung standardmäßig basierend auf dem Zeitstempel. Andere Datenquellen wie Microsoft OneLake, Azure SQL oder Azure Cosmos DB müssen für die Änderungsnachverfolgung konfiguriert werden.

Gelöschter Inhalt

Wenn der Quellinhalt nicht mehr vorhanden ist (z. B. wenn Text auf weniger Blöcke gekürzt wird), wird das entsprechende untergeordnete Dokument im Suchindex gelöscht. Die verbleibenden untergeordneten Dokumente erhalten auch ihren Schlüssel aktualisiert, um einen neuen Hashwert einzuschließen, auch wenn sich der Inhalt sonst nicht geändert hat.

Wenn ein übergeordnetes Dokument vollständig aus der Datenquelle gelöscht wird, werden die entsprechenden untergeordneten Dokumente nur gelöscht, wenn der Löschvorgang durch eine dataDeletionDetectionPolicy definierte Definition der Datenquelle erkannt wird. Wenn Sie kein dataDeletionDetectionPolicy konfiguriert haben und ein übergeordnetes Dokument aus der Datenquelle löschen müssen, sollten Sie die untergeordneten Dokumente manuell löschen, wenn sie nicht mehr benötigt werden.

Projizierter Schlüsselwert

Um die Datenintegrität für aktualisierte und gelöschte Inhalte sicherzustellen, basiert die Datenaktualisierung in der 1:n-Indizierung auf einem projizierten Schlüsselwert auf der n-Seite. Wenn Sie die integrierte Vektorisierung oder den Datenimport-Assistenten verwenden, ist der projizierte Schlüsselwert das parent_id-Feld auf einer Chunked- oder "Many"-Seite des Index.

Ein projizierter Schlüsselwert ist ein eindeutiger Bezeichner, den der Indexer für jedes Dokument generiert. Es gewährleistet die Einzigartigkeit und ermöglicht die ordnungsgemäße Funktionsweise der Änderungs- und Löschverfolgung. Dieser Schlüssel enthält die folgenden Segmente:

  • Ein zufälliger Hash zur Gewährleistung der Eindeutigkeit. Dieser Hash ändert sich, wenn das übergeordnete Dokument bei nachfolgenden Indizierungsläufen aktualisiert wird.
  • Der Schlüssel des übergeordneten Dokuments.
  • Der Anreicherungsanmerkungspfad, der den Kontext für das generierte Dokument identifiziert.

Wenn Sie z. B. ein übergeordnetes Dokument mit dem Schlüsselwert "aa1b22c33" in vier Seiten aufteilen und dann jede dieser Seiten über Indexprojektionen als eigenes Dokument projiziert wird:

  • aa1b22c33
  • aa1b22c33_pages_0
  • aa1b22c33_pages_1
  • aa1b22c33_pages_2

Wenn das übergeordnete Dokument in den Quelldaten aktualisiert wird, was möglicherweise zu mehr gechunkten Seiten führt, ändert sich der zufällige Hash, weitere Seiten werden hinzugefügt, und der Inhalt der einzelnen Blöcke wird aktualisiert, um mit dem Inhalt des Quelldokuments übereinzustimmen.

Beispiel für separate übergeordnete und untergeordnete Indizes

Dieser Abschnitt zeigt ein Beispiel für separate Parent- und Kind-Indizes. Es ist ein ungewöhnliches Muster, aber es ist möglich, dass Sie anwendungsanforderungen haben, die mit diesem Ansatz am besten erfüllt sind. In diesem Szenario projizieren Sie Inhalte von übergeordneten und untergeordneten Elementen in zwei separate Indizes.

  1. Erstellen Sie zwei Indexschemas.

    Jedes Schema enthält die Felder für seine spezifische Granularität, wobei das Feld für die ID des übergeordneten Elements von beiden Indizes in einer Lookup-Abfrage verwendet wird. Der primäre Suchkorpus ist der untergeordnete Index, aber Sie können eine Suchabfrage ausgeben, um die übergeordneten Felder für jede Übereinstimmung im Suchergebnis abzurufen. Azure KI-Suche unterstützt keine Joins zur Abfragezeit, sodass der Anwendungscode oder die Orchestrierungsschicht die Ergebnisse zusammenführen muss, die an eine App oder einen Prozess übergeben werden können.

    Der übergeordnete Index weist ein parent_id-Feld und einen Titel auf. Die parent_id ist der Dokumentschlüssel. Sie benötigen keine Vektorsuchkonfiguration, es sei denn, Sie möchten Felder auf der übergeordneten Dokumentebene vektorisieren.

    {
        "name": "my-parent-index",
        "fields": [
    
            {"name": "parent_id", "type": "Edm.String", "key":true, "filterable": true},
            {"name": "title", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "retrievable": true}
        ]
    }
    

    Der untergeordnete Index enthält die segmentierten Felder sowie das Feld "parent_id". Wenn Sie integrierte Vektorisierung, Bewertungsprofile, semantische Sortierer oder Analysetools verwenden, legen Sie diese im untergeordneten Index fest.

    {
        "name": "my-child-index",
        "fields": [
            {"name": "chunk_id", "type": "Edm.String", "key": true, "filterable": true, "analyzer": "keyword"},
            {"name": "parent_id", "type": "Edm.String", "filterable": true},
             {"name": "chunk", "type": "Edm.String","searchable": true,"retrievable": true},
            {"name": "chunk_vector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": false, "stored": false, "dimensions": 1536, "vectorSearchProfile": "hnsw"}
        ],
        "vectorSearch": {
            "algorithms": [{"name": "hsnw", "kind": "hnsw", "hnswParameters": {}}],
            "profiles": [{"name": "hsnw", "algorithm": "hnsw"}]
        },
        "scoringProfiles": [],
        "semanticConfiguration": [],
        "analyzers": []
    }
    
  2. Aktualisieren Sie den Indexer, um den Elternindex als Ziel anzugeben.

    Die Indexerdefinition gibt die Komponenten der Pipeline an. In der Indexerdefinition ist der anzugebende Indexname der übergeordnete Index. Wenn Sie Feldzuordnungen für die Felder auf übergeordneter Ebene benötigen, definieren Sie sie in outputFieldMappings. Bei der Eins-zu-viele-Indizierung, die separate Indizes verwendet, kann die Indexerdefinition wie im folgenden Beispiel aussehen.

    {
      "name": "my-indexer",
      "dataSourceName": "my-ds",
      "targetIndexName": "my-parent-index",
      "skillsetName" : "my-skillset",
      "parameters": { },
      "fieldMappings": (optional) Maps fields in the underlying data source to fields in an index,
      "outputFieldMappings" : (required) Maps skill outputs to fields in an index,
    }
    
  3. Fügen Sie indexProjections zum Skillset hinzu.

    Hier ist ein Beispiel für eine Indexprojektiondefinition, die den Datenpfad angibt, den der Indexer zum Indizieren von Inhalten verwenden soll. Er gibt den Namen des untergeordneten Indexes in der Definition der Indexprojektion sowie die Zuordnungen jedes untergeordneten oder segmentbasierten Felds an. Der Name des untergeordneten Indexes wird nur an dieser Stelle angegeben.

    Beachten Sie, dass parameters null ist und die Standardeinstellung includeIndexingParentDocumentsverwendet wird. Der Indexer füllt den übergeordneten Index auf. Das selectors-Array wird verwendet, um die Blockdokumente in den untergeordneten Index zu projizieren.

    "indexProjections": {
        "selectors": [
            {
                "targetIndexName": "my-child-index",
                "parentKeyFieldName": "parent_id",
                "sourceContext": "/document/pages/*",
                "mappings": [
                    {
                        "name": "chunk",
                        "source": "/document/pages/*",
                        "sourceContext": null,
                        "inputs": []
                    },
                    {
                        "name": "chunk_vector",
                        "source": "/document/pages/*/chunk_vector",
                        "sourceContext": null,
                        "inputs": []
                    }
                ]
            }
        ],
        "parameters": {}
    }
    
  4. Führen Sie den Indexer aus. Wenn Sie zuvor den Indexer ausgeführt haben, denken Sie daran, ihn zuerst zurückzusetzen.

    Sie sollten zwei Indizes mit dem entsprechenden Inhalt aufgefüllt haben. Fragen Sie die Indizes im Such-Explorer ab, um sicherzustellen, dass jeder über den richtigen Inhalt verfügt.

Nächster Schritt

Datenblockerstellung und 1:n-Indizierung sind Teil des klassischen RAG-Musters in Azure KI-Suche. Fahren Sie mit dem folgenden Lernprogramm und dem folgenden Codebeispiel fort, um mehr darüber zu erfahren.