Indizieren großer Datasets in Azure KI Search

Wenn die Anforderungen Ihrer Suchlösung die Indizierung von Big Data oder komplexen Daten umfassen, lesen Sie die in diesem Artikel beschriebenen Strategien, um zeitintensive Prozesse in Azure KI Search zu verarbeiten.

In diesem Artikel wird vorausgesetzt, dass sie mit den beiden grundlegenden Ansätzen zum Importieren von Daten vertraut sind: Pushen von Daten in einen Index oder Pullen von Daten aus einer unterstützten Datenquelle mithilfe eines Suchindexers. Wenn Ihr Szenario eine rechenintensive KI-Anreicherung beinhaltet, sind Indexer erforderlich, da Skillsets von Indexern abhängig sind.

Dieser Artikel ergänzt die Tipps für eine bessere Leistung, die bewährte Methoden für den Entwurf von Indizes und Abfragen bieten. Ein gut konzipierter Index, der nur die benötigten Felder und Attribute enthält, ist eine wichtige Voraussetzung für eine Indizierung im großen Stil.

Wir empfehlen die Verwendung eines neueren Suchdiensts, der nach dem 3. April 2024 für einen höheren Speicher pro Partition erstellt wurde.

Hinweis

Die in diesem Artikel beschriebenen Strategien gehen von einer einzelnen großen Datenquelle aus. Wenn Ihre Lösung die Indizierung aus mehreren Datenquellen erfordert, finden Sie einen empfohlenen Ansatz unter Indizieren mehrerer Datenquellen in Azure KI Search.

Indizieren umfangreicher Daten mithilfe der Push-APIs

"Push"-APIs, z. B. die Index REST-API zum Hinzufügen von Dokumenten oder die IndexDocuments-Methode (Azure SDK für .NET), sind die häufigste Form der Indizierung in Azure KI Search. Für Lösungen, die eine Push-API verwenden, umfasst die Strategie für die zeitintensive Indizierung eine oder beide der folgenden Komponenten:

  • Batchverarbeitung von Dokumenten
  • Verwaltung von Threads

Batchverarbeitung mehrerer Dokumente pro Anforderung

Ein einfacher Mechanismus zum Indizieren einer großen Datenmenge besteht darin, mehrere Dokumente oder Datensätze in einer einzigen Anforderung zu übermitteln. Solange die gesamte Nutzlast kleiner als 16MB ist, kann eine Anforderung bis zu 1.000 Dokumente in einem Uploadmassenvorgang verarbeiten. Diese Grenzwerte gelten unabhängig davon, ob Sie den REST-API Dokument-Index hinzufügen oder die IndexDocuments-Methode im .NET SDK verwenden. Für beide APIs würden Sie 1000 Dokumente im Text der einzelnen Anforderungen verpacken.

Durch die Batchverarbeitung von Dokumenten wird die Zeit, die zum Durchlaufen eines großen Datenvolumens benötigt wird, erheblich verkürzt. Die Bestimmung der optimalen Batchgröße für Ihre Daten ist ein wichtiger Faktor bei der Optimierung der Indizierungsgeschwindigkeit. Die optimale Batchgröße wird hauptsächlich durch die beiden folgenden Faktoren beeinflusst:

  • Indexschema
  • Datengröße

Da die optimale Batchgröße von Ihrem Index und von Ihren Daten abhängt, empfiehlt es sich, durch Testen verschiedener Batchgrößen zu ermitteln, bei welcher Größe die Indizierung für Ihr Szenario am schnellsten ist. Tutorial: Optimieren der Indizierung mit der Push-API enthält Beispielcode zum Testen von Batchgrößen mit dem .NET SDK.

Hinzufügen von Threads und einer Wiederholungsstrategie

Indexer verfügen über eine integrierte Threadverwaltung, aber wenn Sie die Push-APIs verwenden, muss Ihr Anwendungscode Threads verwalten. Stellen Sie sicher, dass genügend Threads vorhanden sind, um die verfügbare Kapazität vollständig zu nutzen, insbesondere, wenn Sie kürzlich die Anzahl von Partitionen erhöht oder ein Upgrade auf einen Suchdienst mit höherer Ebene ausgeführt haben.

  1. Erhöhen Sie die Anzahl der gleichzeitigen Threads in Ihrem Clientcode.

  2. Im Zuge der Erhöhung der Anforderungen für den Suchdienst werden möglicherweise HTTP-Statuscodes mit dem Hinweis zurückgegeben, dass die Anforderung nicht vollständig erfolgreich war. Zwei gängige HTTP-Statuscodes im Zusammenhang mit der Indizierung sind:

    • 503 Dienst nicht verfügbar: Dieser Fehler bedeutet, dass die Auslastung des Systems sehr hoch ist und Ihre Anforderungen aktuell nicht verarbeitet werden können.

    • 207 Multi-Status: Dieser Fehler bedeutet, dass der Vorgang für einige Dokumente erfolgreich war, bei mindestens einem Dokument aber ein Fehler aufgetreten ist.

  3. Zum Behandeln von Fehlern sollten Anforderungen unter Verwendung einer Wiederholungsstrategie mit exponentiellem Backoff wiederholt werden.

Anforderungen mit 503-Fehlern und anderen Fehlern werden vom Azure .NET SDK automatisch wiederholt. Für die Wiederholung bei 207-Fehlern muss allerdings eine eigene Logik implementiert werden. Eine Wiederholungsstrategie kann auch mithilfe von Open-Source-Tools wie Polly implementiert werden.

Indizieren mit Indexern und den „Pull“-APIs

Indexer verfügen über mehrere Funktionen, die für zeitintensive Prozesse nützlich sind:

  • Batchverarbeitung von Dokumenten
  • Parallele Indizierung über partitionierte Daten
  • Planung und Änderungserkennung für die Indizierung nur neuer und geänderter Dokumente im Laufe der Zeit

Indexerzeitpläne können die Verarbeitung ab dem letzten bekannten Haltepunkt wieder aufnehmen. Wenn Daten innerhalb des Verarbeitungsfensters nicht vollständig indiziert werden, fährt der Indexer bei der nächsten Ausführung dort fort, wo er aufgehört hat, vorausgesetzt, Sie verwenden eine Datenquelle, die Änderungserkennung bereitstellt.

Partitionieren von Daten in kleinere einzelne Datenquellen ermöglicht die parallele Verarbeitung. Sie können Quelldaten z. B. in mehrere Container in Azure Blob Storage aufteilen, eine Datenquelle für jede Partition erstellen und dann die Indexer parallel ausführen, abhängig von der Anzahl der Sucheinheiten Ihres Suchdiensts.

Überprüfen der Batchgröße für einen Indexer

Wie die Push-API ermöglichen auch Indexer, die Anzahl von Elementen pro Batch zu konfigurieren. Für Indexer basierend auf der Create Indexer-REST-API können Sie das batchSize-Argument zum Anpassen dieser Einstellung festlegen, damit die Eigenschaften besser Ihren Daten entsprechen.

Die Standardbatchgrößen sind datenquellenspezifisch. Azure SQL-Datenbank und Azure Cosmos DB verfügen über eine Standardbatchgröße von 1000. Im Gegensatz dazu wird bei der Azure-Blobindizierung eine Batchgröße von 10 Dokumenten unter Berücksichtigung der größeren durchschnittlichen Dokumentgröße festgelegt.

Planen von Indexern für Prozesse mit langer Ausführung

Indexerzeitpläne sind ein wichtiger Mechanismus zum Verarbeiten von großen Datasets und für langsam ausgeführte Prozesse wie die Bildanalyse in einer Anreicherungspipeline.

Üblicherweise wird die Indexerverarbeitung innerhalb eines zweistündigen Zeitfensters ausgeführt. Wenn die vollständige Ausführung der Indizierungsworkload nicht nur Stunden, sondern Tage dauert, können Sie den Indexer mit einem wiederkehrenden Zeitplan konfigurieren, der alle zwei Stunden beginnt. Der Indexer setzt dann die Verarbeitung dort fort, wo er zuletzt aufgehört hat (vorausgesetzt, für die Datenquelle ist die Änderungsnachverfolgung aktiviert). So kann ein Indexer über mehrere Tage hinweg das Dokumentbacklog durchlaufen, bis alle nicht verarbeitete Dokumente verarbeitet wurden.

{
    "dataSourceName" : "hotels-ds",
    "targetIndexName" : "hotels-idx",
    "schedule" : { "interval" : "PT2H", "startTime" : "2024-01-01T00:00:00Z" }
}

Wenn keine neuen oder aktualisierten Dokumente mehr in der Datenquelle vorhanden sind, werden im Ausführungsverlauf des Indexers 0/0 verarbeitete Dokumente gemeldet, und es findet keine Verarbeitung statt.

Weitere Informationen zum Festlegen von Zeitplänen finden Sie unter REST-API zum Erstellen von Indexern oder Planen von Indexern in Azure KI Search.

Hinweis

Einige Indexer, die in einer älteren Runtimearchitektur ausgeführt werden, haben ein maximales Verarbeitungsfenster von 24 Stunden (anstelle von zwei Stunden). Das Limit von zwei Stunden gilt für neuere Inhaltsprozessoren, die in einer intern verwalteten mehrinstanzenfähigen Umgebung ausgeführt werden. Azure KI Search versucht nach Möglichkeit, die Indexer- und Skillsetverarbeitung in die mehrinstanzenfähige Umgebung auszulagern. Wenn der Indexer nicht migriert werden kann, wird er in der privaten Umgebung ausgeführt und kann bis zu 24 Stunden ausgeführt werden. Wenn Sie einen Zeitplan für einen Indexer erstellen, der diese Merkmale aufweist, gehen Sie von einem 24-stündigen Verarbeitungsfenster aus.

Paralleles Ausführen von Indexern

Wenn Sie über partitionierte Daten verfügen, können Sie mehrere Indexer-Datenquellen-Kombinationen erstellen, die aus jeder Datenquelle pullen und in denselben Suchindex schreiben. Da jeder Indexer unterschiedlich ist, können Sie sie gleichzeitig ausführen und einen Suchindex schneller auffüllen, als wenn Sie sie nacheinander ausführen.

Stellen Sie sicher, dass Sie über genügend Kapazität verfügen. Eine Sucheinheit in Ihrem Dienst kann einen Indexer zu jeder angegebenen Uhrzeit ausführen. Das Erstellen mehrerer Indexer ist nur nützlich, wenn sie parallel ausgeführt werden können.

Die Anzahl von Indizierungsaufträgen, die gleichzeitig ausgeführt werden können, variiert bei der text- und skillsbasierten Indizierung. Weitere Informationen finden Sie unter Indexerausführung.

Wenn Ihre Datenquelle ein Azure Blob Storage-Container oder Azure Data Lake Storage Gen2 ist, kann die Aufzählung einer großen Anzahl von Blobs lange dauern (sogar Stunden). Dies führt dazu, dass sich die Anzahl erfolgreich indizierter Dokumente in dieser Zeit nicht erhöht und fälschlicherweise der Eindruck entsteht, der Indexer würde keine Fortschritte machen. Wenn Sie die Dokumentverarbeitung für eine große Anzahl von Blobs beschleunigen möchten, sollten Sie Ihre Daten in mehreren Containern partitionieren und parallele Indexer erstellen, die auf einen einzelnen Index verweisen.

  1. Melden Sie sich beim Azure-Portal an, und überprüfen Sie die Anzahl der Sucheinheiten, die von Ihrem Suchdienst verwendet werden. Wählen Sie Einstellungen>Skalieren aus, um die Anzahl oben auf der Seite anzuzeigen. Die Anzahl der parallel ausgeführten Indexer entspricht ungefähr der Anzahl der Sucheinheiten.

  2. Partitionieren Sie Ihre Quelldaten auf mehrere Container oder mehrere virtuelle Ordner innerhalb desselben Containers.

  3. Erstellen Sie mehrere Datenquellen, eine für jede Partition, die jeweils mit ihrem eigenen Indexer gekoppelt sind.

  4. Geben Sie in jedem Indexer den gleichen Zielsuchindex an.

  5. Planen Sie die Indexer.

  6. Überprüfen Sie den Indexerstatus und den Ausführungsverlauf zur Bestätigung.

Die parallele Indizierung birgt einige Risiken. Denken Sie zunächst daran, dass die Indizierung nicht im Hintergrund ausgeführt wird, was die Wahrscheinlichkeit erhöht, dass Abfragen gedrosselt oder gelöscht werden.

Zweitens sperrt Azure KI Search den Index nicht für Updates. Gleichzeitige Schreibvorgänge werden verwaltet, und es wird ein Wiederholungsversuch ausgeführt, wenn ein bestimmter Schreibvorgang beim ersten Versuch nicht erfolgreich war. Möglicherweise stellen Sie jedoch einen Anstieg der Indizierungsfehler fest.

Mehrere Sätze aus Indexern und Datenquellen können zwar auf den gleichen Index ausgerichtet sein, dabei besteht jedoch die Gefahr, dass bereits vorhandene Werte im Index durch Indexerausführungen überschrieben werden. Wenn ein zweiter Satz aus Indexer und Datenquelle die gleichen Dokumente und Felder verwendet, werden sämtliche Werte der ersten Ausführung überschrieben. Feldwerte werden vollständig ersetzt. Ein Indexer kann keine Werte aus mehreren Ausführungen im gleichen Feld zusammenführen.

Indizieren von Big Data in Spark

Wenn Sie eine Big Data-Architektur besitzen und sich Ihre Daten in einem Spark-Cluster befinden, empfehlen wir SynapseML zum Laden und Indizieren von Daten. Das Tutorial enthält Schritte zum Aufrufen von Azure KI Services für die KI-Anreicherung, Sie können aber auch die AzureSearchWriter-API für die Textindizierung verwenden.

Weitere Informationen