Indizieren von Daten aus Azure Cosmos DB for NoSQL für Abfragen in Azure KI-Suche

In diesem Artikel erfahren Sie, wie Sie einen Indexer konfigurieren, der Inhalte aus Azure Cosmos DB for NoSQL importiert und sie in Azure AI Search durchsuchbar macht.

Dieser Artikel ergänzt den Artikel Erstellen von Indexern mit Informationen, die Cosmos DB-spezifisch sind. Er verwendet die REST-APIs, um einen dreiteiligen Workflow zu veranschaulichen, der allen Indexern gemeinsam ist: Erstellen einer Datenquelle, Erstellen eines Indexes und Erstellen eines Indexers. Die Datenextraktion erfolgt, wenn Sie die Anforderung für die Indexererstellung übermitteln.

Da die Terminologie verwirrend sein kann, sei darauf hingewiesen, dass Azure Cosmos DB-Indizierung und Azure AI Search-Indizierung unterschiedliche Vorgänge sind. Die Indexierung in Azure AI Search erstellt und lädt einen Suchindex auf Ihren Suchdienst.

Voraussetzungen

Definieren der Datenquelle

Die Datenquellendefinition gibt die zu indizierenden Daten, die Anmeldeinformationen und die Richtlinien für die Identifizierung von Datenänderungen an. Eine Datenquelle ist eine unabhängige Ressource, welche von mehreren Indexern verwendet werden kann.

  1. Erstellen oder aktualisieren Sie eine Datenquelle, um ihre Definition festzulegen:

    POST https://[service name].search.windows.net/datasources?api-version=2023-11-01
    Content-Type: application/json
    api-key: [Search service admin key]
    {
        "name": "[my-cosmosdb-ds]",
        "type": "cosmosdb",
        "credentials": {
          "connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.com;AccountKey=[cosmos-account-key];Database=[cosmos-database-name]"
        },
        "container": {
          "name": "[my-cosmos-db-collection]",
          "query": null
        },
        "dataChangeDetectionPolicy": {
          "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
        "  highWaterMarkColumnName": "_ts"
        },
        "dataDeletionDetectionPolicy": null,
        "encryptionKey": null,
        "identity": null
    }
    
  2. Legen Sie "type" auf "cosmosdb" fest (erforderlich). Wenn Sie eine ältere Such-API-Version als 2017-11-11 verwenden, lautet die Syntax für „type“ "documentdb". Verwenden Sie andernfalls für 2019-05-06 und höher "cosmosdb".

  3. Legen Sie „credentials“ auf eine Verbindungszeichenfolge fest. Im nächsten Abschnitt werden die unterstützten Formate beschrieben.

  4. Legen Sie „container“ auf die Auflistung fest. Die Eigenschaft „name“ ist erforderlich und gibt die ID der zu indizierenden Datenbanksammlung an. Die Eigenschaft „query“ ist optional. Verwenden Sie es, um ein beliebiges JSON-Dokument in ein flaches Schema zu reduzieren, das Azure AI Search indizieren kann.

  5. Legen Sie „dataChangeDetectionPolicy“ fest, wenn Daten flüchtig sind und der Indexer bei nachfolgenden Läufen immer nur die neuen und aktualisierten Elemente erfassen soll.

  6. Legen Sie „dataDeletionDetectionPolicy“ fest, wenn Sie Suchdokumente aus einem Suchindex entfernen möchten, wenn das Quellelement gelöscht wird.

Unterstützte Anmeldeinformationen und Verbindungszeichenfolgen

Indexer können mithilfe der folgenden Verbindungen eine Verbindung mit einer Sammlung herstellen.

Vermeiden Sie Portnummern in der Endpunkt-URL. Wenn Sie die Portnummer einschließen, tritt beim Herstellen der Verbindung ein Fehler auf.

„Vollzugriff“-Verbindungszeichenfolge
{ "connectionString" : "AccountEndpoint=https://<Cosmos DB account name>.documents.azure.com;AccountKey=<Cosmos DB auth key>;Database=<Cosmos DB database id>" }`
Sie können die Verbindungszeichenfolge von der Azure Cosmos DB-Kontoseite im Azure-Portal abrufen, indem Sie im linken Navigationsbereich die Option Schlüssel auswählen. Stellen Sie sicher, dass Sie eine vollständige Verbindungszeichenfolge und nicht nur einen Schlüssel auswählen.
Verbindungszeichenfolge für verwaltete Identitäten
{ "connectionString" : "ResourceId=/subscriptions/<your subscription ID>/resourceGroups/<your resource group name>/providers/Microsoft.DocumentDB/databaseAccounts/<your cosmos db account name>/;(ApiKind=[api-kind];)/(IdentityAuthType=[identity-auth-type])" }
Diese Verbindungszeichenfolge erfordert keinen Kontoschlüssel, aber Sie benötigen einen Suchdienst für das Herstellen einer Verbindung mithilfe einer verwalteten Identität. Bei Verbindungen, die auf die SQL-API abzielen, können Sie ApiKind in der Verbindungszeichenfolge weglassen. Weitere Informationen zu ApiKind, IdentityAuthType siehe Einrichten einer Indexer-Verbindung zu einer Azure Cosmos DB-Datenbank unter Verwendung einer verwalteten Identität.

Verwenden von Abfragen zum Formen indizierter Daten

In der Eigenschaft „query“ unter „container“ können Sie eine SQL-Abfrage angeben, um geschachtelte Eigenschaften oder Arrays zu vereinfachen, JSON-Eigenschaften zu projizieren und die zu indizierenden Daten zu filtern.

Beispieldokument:

    {
        "userId": 10001,
        "contact": {
            "firstName": "andy",
            "lastName": "hoh"
        },
        "company": "microsoft",
        "tags": ["azure", "cosmosdb", "search"]
    }

Abfrage zur Filterung:

SELECT * FROM c WHERE c.company = "microsoft" and c._ts >= @HighWaterMark ORDER BY c._ts

Vereinfachen der Abfrage:

SELECT c.id, c.userId, c.contact.firstName, c.contact.lastName, c.company, c._ts FROM c WHERE c._ts >= @HighWaterMark ORDER BY c._ts

Abfrage zur Projektion:

SELECT VALUE { "id":c.id, "Name":c.contact.firstName, "Company":c.company, "_ts":c._ts } FROM c WHERE c._ts >= @HighWaterMark ORDER BY c._ts

Abfrage zum Vereinfachen eines Arrays:

SELECT c.id, c.userId, tag, c._ts FROM c JOIN tag IN c.tags WHERE c._ts >= @HighWaterMark ORDER BY c._ts

Nicht unterstützte Abfragen (DISTINCT und GROUP BY)

Abfragen mit dem Schlüsselwort DISTINCT oder der GROUP BY-Klausel werden nicht unterstützt. Azure AI Search basiert auf der Paginierung von SQL-Abfragen, um die Ergebnisse der Abfrage vollständig aufzuzählen. Weder das Schlüsselwort DISTINCT noch die GROUP BY-Klausel sind mit den Fortsetzungstoken kompatibel, die zum Paginieren der Ergebnisse verwendet werden.

Beispiele für nicht unterstützte Abfragen:

SELECT DISTINCT c.id, c.userId, c._ts FROM c WHERE c._ts >= @HighWaterMark ORDER BY c._ts

SELECT DISTINCT VALUE c.name FROM c ORDER BY c.name

SELECT TOP 4 COUNT(1) AS foodGroupCount, f.foodGroup FROM Food f GROUP BY f.foodGroup

Obwohl Azure Cosmos DB einen Workaround zur Unterstützung von SQL-Abfragepaginierung mit dem DISTINCT-Schlüsselwort unter Verwendung der ORDER BY-Klausel bietet, ist dieser nicht mit Azure AI Search kompatibel. Die Abfrage wird einen einzelnen JSON-Wert zurückgeben, während Azure AI Search ein JSON-Objekt erwartet.

-- The following query returns a single JSON value and isn't supported by Azure AI Search
SELECT DISTINCT VALUE c.name FROM c ORDER BY c.name

Hinzufügen von Suchfeldern zu einem Index

Fügen Sie in einem Suchindex Felder hinzu, um die JSON-Quelldokumente oder die Ausgabe Ihrer benutzerdefinierten Abfrageprojektion zu akzeptieren. Stellen Sie sicher, dass das Suchindexschema mit den Quelldaten kompatibel ist. Für Inhalte in Azure Cosmos DB muss Ihr Suchindexschema den Azure Cosmos DB-Elementen in Ihrer Datenquelle entsprechen.

  1. Erstellen oder aktualisieren Sie einen Index, um Suchfelder zu definieren, in denen Daten gespeichert werden:

    POST https://[service name].search.windows.net/indexes?api-version=2023-11-01
    Content-Type: application/json
    api-key: [Search service admin key]
    {
        "name": "mysearchindex",
        "fields": [{
            "name": "rid",
            "type": "Edm.String",
            "key": true,
            "searchable": false
        }, 
        {
            "name": "description",
            "type": "Edm.String",
            "filterable": false,
            "searchable": true,
            "sortable": false,
            "facetable": false,
            "suggestions": true
        }
      ]
    }
    
  2. Erstellen Sie ein Dokumentschlüsselfeld („key“: true). Bei partitionierten Sammlungen ist der Standarddokumentschlüssel die Azure Cosmos DB _rid-Eigenschaft, die Azure AI Search automatisch in rid umbenennt, da Feldnamen nicht mit einem Unterstrich beginnen dürfen. Außerdem enthalten Azure Cosmos DB _rid-Werte Zeichen, die in Azure AI Search-Schlüsseln ungültig sind. Deshalb sind die _rid-Werte Base64-codiert.

  3. Erstellen Sie weitere Felder für mehr durchsuchbare Inhalte. Weitere Informationen finden Sie unter Erstellen eines Suchindex in Azure Cognitive Search.

Abbildung von Datentypen

JSON-Datentypen Azure AI Search Feldtypen
Bool Edm.Boolean, Edm.String
Zahlen, die wie Ganzzahlen aussehen Edm.Int32, Edm.Int64, Edm.String
Zahlen, die wie Gleitkommas aussehen Edm.Double, Edm.String
String Edm.String
Arrays primitiver Typen, z. B ["a", "b", "c"] Collection(Edm.String)
Zeichenfolgen, die wie Datumsangaben aussehen Edm.DateTimeOffset, Edm.String
GeoJSON-Objekte z. B. { "type": "Point", "coordinates": [long, lat] } Edm.GeographyPoint
Andere JSON-Objekte N/V

Konfigurieren und Ausführen des Azure Cosmos DB for NoSQL-Indexers

Nach der Erstellung von Index und Datenquelle können Sie den Indexer erstellen. Die Indexerkonfiguration gibt die Eingaben, Parameter und Eigenschaften an, die das Laufzeitverhalten steuern.

  1. Erstellen oder aktualisieren Sie den Indexer, indem Sie ihm einen Namen geben und einen Verweis auf die Datenquelle und den Zielindex hinzufügen:

    POST https://[service name].search.windows.net/indexers?api-version=2023-11-01
    Content-Type: application/json
    api-key: [search service admin key]
    {
        "name" : "[my-cosmosdb-indexer]",
        "dataSourceName" : "[my-cosmosdb-ds]",
        "targetIndexName" : "[my-search-index]",
        "disabled": null,
        "schedule": null,
        "parameters": {
            "batchSize": null,
            "maxFailedItems": 0,
            "maxFailedItemsPerBatch": 0,
            "base64EncodeKeys": false,
            "configuration": {}
            },
        "fieldMappings": [],
        "encryptionKey": null
    }
    
  2. Geben Sie Feldzuordnungen an, wenn es Unterschiede beim Feldnamen oder -typ gibt, oder wenn Sie mehrere Versionen eines Quellfelds im Suchindex benötigen.

  3. Weitere Informationen zu anderen Eigenschaften finden Sie unter Erstellen von Indexern in Azure Cognitive Search.

Ein Indexer wird automatisch ausgeführt, wenn er erstellt wird. Sie können dies verhindern, indem Sie „disabled“ (Deaktiviert) auf „true“ festlegen. Um die Ausführung des Indexers zu steuern, führen Sie einen Indexer nach Bedarf aus, oder legen Sie für ihn einen Zeitplan fest.

Überprüfen des Indexerstatus

Um den Indexerstatus und den Ausführungsverlauf zu überwachen, senden Sie eine Anforderung zum Abrufen des Indexerstatus:

GET https://myservice.search.windows.net/indexers/myindexer/status?api-version=2023-11-01
  Content-Type: application/json  
  api-key: [admin key]

Die Antwort enthält den Status und die Anzahl der verarbeiteten Elemente. Sie sollte in etwa wie das folgende Beispiel aussehen:

    {
        "status":"running",
        "lastResult": {
            "status":"success",
            "errorMessage":null,
            "startTime":"2022-02-21T00:23:24.957Z",
            "endTime":"2022-02-21T00:36:47.752Z",
            "errors":[],
            "itemsProcessed":1599501,
            "itemsFailed":0,
            "initialTrackingState":null,
            "finalTrackingState":null
        },
        "executionHistory":
        [
            {
                "status":"success",
                "errorMessage":null,
                "startTime":"2022-02-21T00:23:24.957Z",
                "endTime":"2022-02-21T00:36:47.752Z",
                "errors":[],
                "itemsProcessed":1599501,
                "itemsFailed":0,
                "initialTrackingState":null,
                "finalTrackingState":null
            },
            ... earlier history items
        ]
    }

Der Ausführungsverlauf enthält bis zu 50 der zuletzt abgeschlossenen Ausführungen. Diese sind in umgekehrter chronologischer Reihenfolge sortiert, sodass die neueste Ausführung als Erstes aufgelistet wird.

Indizieren neuer und geänderter Dokumente

Wenn ein Indexer einen Suchindex vollständig aufgefüllt hat, sollen bei nachfolgenden Indexerausführungen möglicherweise nur die neuen und geänderten Dokumente in Ihrer Datenbank inkrementell indiziert werden.

Um die inkrementelle Indizierung zu aktivieren, legen Sie die Eigenschaft „dataChangeDetectionPolicy“ in Ihrer Datenquellendefinition fest. Diese Eigenschaft teilt dem Indexer mit, welcher Mechanismus für die Änderungsnachverfolgung für Ihre Daten verwendet wird.

Für Azure Cosmos DB-Indexer wird nur die Richtlinie HighWaterMarkChangeDetectionPolicy unterstützt, bei der die von Azure Cosmos DB bereitgestellte Eigenschaft _ts (Zeitstempel) verwendet wird.

Das folgende Beispiel zeigt eine Datenquellendefinition mit einer Änderungserkennungsrichtlinie:

"dataChangeDetectionPolicy": {
    "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
"  highWaterMarkColumnName": "_ts"
},

Inkrementelle Indizierung und benutzerdefinierte Abfragen

Wenn Sie eine benutzerdefinierte Abfrage zum Abrufen von Dokumenten verwenden, stellen Sie sicher, dass die Abfrage die Ergebnisse nach der Spalte _ts sortiert. Dies ermöglicht ein regelmäßiges Check-Pointing, das Azure AI Search verwendet, um bei Fehlern schrittweise Fortschritte zu erzielen.

In einigen Fällen, auch wenn Ihre Abfrage eine ORDER BY [collection alias]._ts-Klausel enthält, kann Azure AI Search nicht ableiten, dass die Abfrage nach _ts geordnet ist. Sie können Azure AI Search mitteilen, dass die Ergebnisse geordnet sind, indem Sie die Konfigurationseigenschaft assumeOrderByHighWaterMarkColumn festlegen.

Um diesen Hinweis anzugeben, erstellen oder aktualisieren Sie Ihre Indexerdefinition wie folgt:

{
    ... other indexer definition properties
    "parameters" : {
        "configuration" : { "assumeOrderByHighWaterMarkColumn" : true } }
} 

Indizieren von gelöschten Dokumenten

Wenn Zeilen aus der Quelltabelle gelöscht werden, möchten Sie diese Zeilen in der Regel auch aus dem Suchindex löschen. Die Richtlinie zum Erkennen von Datenlöschungen dient einer effizienten Identifizierung gelöschter Datenelemente. Zurzeit ist Soft Delete die einzige unterstützte Richtlinie (die Löschung wird durch ein bestimmtes Kennzeichen markiert), die in der Datenquellendefinition folgendermaßen festgelegt wird:

"dataDeletionDetectionPolicy"": {
    "@odata.type" : "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
    "softDeleteColumnName" : "the property that specifies whether a document was deleted",
    "softDeleteMarkerValue" : "the value that identifies a document as deleted"
}

Wenn Sie eine benutzerdefinierte Abfrage verwenden, stellen Sie sicher, dass die Eigenschaft, auf die softDeleteColumnName verweist, von der Abfrage projiziert wird.

softDeleteColumnName muss ein Feld auf oberster Ebene im Index sein. Das Verwenden von geschachtelten Feldern innerhalb komplexer Datentypen als softDeleteColumnName wird nicht unterstützt.

Im folgenden Beispiel wird eine Datenquelle mit einer Richtlinie zum vorläufigen Löschen erstellt:

POST https://[service name].search.windows.net/datasources?api-version=2023-11-01
Content-Type: application/json
api-key: [Search service admin key]

{
    "name": "[my-cosmosdb-ds]",
    "type": "cosmosdb",
    "credentials": {
        "connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.com;AccountKey=[cosmos-account-key];Database=[cosmos-database-name]"
    },
    "container": { "name": "[my-cosmos-collection]" },
    "dataChangeDetectionPolicy": {
        "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
        "highWaterMarkColumnName": "_ts"
    },
    "dataDeletionDetectionPolicy": {
        "@odata.type": "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
        "softDeleteColumnName": "isDeleted",
        "softDeleteMarkerValue": "true"
    }
}

Verwenden von .NET

Für Daten, auf die über das SQL-API-Protokoll zugegriffen wird, können Sie das .NET SDK verwenden, um mit Indexern zu automatisieren. Es wird empfohlen, dass Sie den vorherige Abschnitt zur REST-API genau lesen, um die Konzepte, den Workflow und die Anforderungen zu verstehen. Sie können sich anschließend auf die folgende .NET-API-Referenzdokumentation beziehen, um einen JSON-Indexer in verwalteten Code zu implementieren:

Nächste Schritte

Sie können nun kontrollieren, wie Sie den Indexer ausführen, den Status überwachen oder die Ausführung des Indexers planen. Die folgenden Artikel gelten für Indexer, die Inhalte mithilfe von Pull Requests aus Azure Cosmos DB übertragen: