Indexdata från Azure Cosmos DB för MongoDB för frågor i Azure AI Search

Viktigt!

Stöd för MongoDB API finns för närvarande i offentlig förhandsversion under kompletterande användningsvillkor. För närvarande finns det inget SDK-stöd.

I den här artikeln får du lära dig hur du konfigurerar en indexerare som importerar innehåll från Azure Cosmos DB för MongoDB och gör det sökbart i Azure AI Search.

Den här artikeln kompletterar Skapa en indexerare med information som är specifik för Cosmos DB. Den använder REST-API:er för att demonstrera ett arbetsflöde i tre delar som är gemensamt för alla indexerare: skapa en datakälla, skapa ett index, skapa en indexerare. Dataextrahering sker när du skickar begäran skapa indexerare.

Eftersom terminologin kan vara förvirrande är det värt att notera att Azure Cosmos DB-indexering och Azure AI Search-indexering är olika åtgärder. Indexering i Azure AI Search skapar och läser in ett sökindex i söktjänsten.

Förutsättningar

  • Registrera dig för förhandsversionen för att ge feedback om scenariot. Du kan komma åt funktionen automatiskt efter att formuläret har lämnats in.

  • Ett Azure Cosmos DB-konto, en databas, en samling och dokument. Använd samma region för både Azure AI Search och Azure Cosmos DB för lägre svarstid och för att undvika bandbreddsavgifter.

  • En automatisk indexeringsprincip för Azure Cosmos DB-samlingen, inställd på Konsekvent. Det här är standardkonfigurationen. Lat indexering rekommenderas inte och kan leda till att data saknas.

  • Läsbehörigheter. En "fullständig åtkomst" anslutningssträng innehåller en nyckel som ger åtkomst till innehållet, men om du använder Azure-roller kontrollerar du att söktjänstens hanterade identitet har behörigheter för Cosmos DB-kontoläsare.

  • En REST-klient för att skapa datakällan, indexet och indexeraren.

Begränsningar

Det här är begränsningarna i den här funktionen:

  • Anpassade frågor stöds inte för att ange datauppsättningen.

  • Kolumnnamnet _ts är ett reserverat ord. Om du behöver det här fältet bör du överväga alternativa lösningar för att fylla i ett index.

  • MongoDB-attributet $ref är ett reserverat ord. Om du behöver detta i MongoDB-samlingen bör du överväga alternativa lösningar för att fylla i ett index.

Som ett alternativ till den här anslutningsappen kan du, om ditt scenario har något av dessa krav, använda Push API/SDK eller överväga Azure Data Factory med ett Azure AI Search-index som mottagare.

Definiera datakällan

Datakällans definition anger vilka data som ska indexeras, autentiseringsuppgifter och principer för att identifiera ändringar i data. En datakälla definieras som en oberoende resurs så att den kan användas av flera indexerare.

För det här anropet anger du en REST API-förhandsversion (2020-06-30-Preview eller 2021-04-30-Preview) för att skapa en datakälla som ansluter via MongoDB-API:et.

  1. Skapa eller uppdatera en datakälla för att ange dess definition:

    POST https://[service name].search.windows.net/datasources?api-version=2021-04-30-Preview
    Content-Type: application/json
    api-key: [Search service admin key]
    {
      "name": "[my-cosmosdb-mongodb-ds]",
      "type": "cosmosdb",
      "credentials": {
        "connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.com;AccountKey=[cosmos-account-key];Database=[cosmos-database-name];ApiKind=MongoDb;"
      },
      "container": {
        "name": "[cosmos-db-collection]",
        "query": null
      },
      "dataChangeDetectionPolicy": {
        "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
        "highWaterMarkColumnName": "_ts"
      },
      "dataDeletionDetectionPolicy": null,
      "encryptionKey": null,
      "identity": null
    }
    
  2. Ange "typ" till "cosmosdb" (krävs).

  3. Ange "autentiseringsuppgifter" till en anslutningssträng. I nästa avsnitt beskrivs de format som stöds.

  4. Ange "container" till samlingen. Egenskapen "name" krävs och anger ID för den databassamling som ska indexeras. För Azure Cosmos DB för MongoDB stöds inte "fråga".

  5. Ange "dataChangeDetectionPolicy" om data är flyktiga och du vill att indexeraren bara ska hämta de nya och uppdaterade objekten vid efterföljande körningar.

  6. Ange "dataDeletionDetectionPolicy" om du vill ta bort sökdokument från ett sökindex när källobjektet tas bort.

Autentiseringsuppgifter och anslutningssträng som stöds

Indexerare kan ansluta till en samling med hjälp av följande anslutningar. För anslutningar som riktar sig mot MongoDB-API:et måste du inkludera "ApiKind" i anslutningssträng.

Undvik portnummer i slutpunkts-URL:en. Om du inkluderar portnumret misslyckas anslutningen.

Fullständig åtkomst anslutningssträng
{ "connectionString" : "AccountEndpoint=https://<Cosmos DB account name>.documents.azure.com;AccountKey=<Cosmos DB auth key>;Database=<Cosmos DB database id>;ApiKind=MongoDb" }
Du kan hämta Cosmos DB-autentiseringsnyckeln från Azure Cosmos DB-kontosidan i Azure-portalen genom att välja Anslut ionssträng i det vänstra navigeringsfönstret. Se till att kopiera primärt lösenord och ersätt Cosmos DB-autentiseringsnyckelvärdet med det.
Hanterad identitet anslutningssträng
{ "connectionString" : "ResourceId=/subscriptions/<your subscription ID>/resourceGroups/<your resource group name>/providers/Microsoft.DocumentDB/databaseAccounts/<your cosmos db account name>/;(ApiKind=[api-kind];)" }
Den här anslutningssträng kräver ingen kontonyckel, men du måste tidigare ha konfigurerat en söktjänst för att ansluta med hjälp av en hanterad identitet och skapat en rolltilldelning som ger behörigheter för Cosmos DB-kontoläsare. Mer information finns i Konfigurera en indexerareanslutning till en Azure Cosmos DB-databas med hjälp av en hanterad identitet .

Lägga till sökfält i ett index

I ett sökindex lägger du till fält för att acceptera JSON-källdokumenten eller utdata från din anpassade frågeprojektion. Kontrollera att sökindexschemat är kompatibelt med källdata. För innehåll i Azure Cosmos DB ska ditt sökindexschema motsvara Azure Cosmos DB-objekten i datakällan.

  1. Skapa eller uppdatera ett index för att definiera sökfält som lagrar data:

    POST https://[service name].search.windows.net/indexes?api-version=2020-06-30
    Content-Type: application/json
    api-key: [Search service admin key]
    
    {
        "name": "mysearchindex",
        "fields": [{
            "name": "doc_id",
            "type": "Edm.String",
            "key": true,
            "retrievable": true,
            "searchable": false
        }, {
            "name": "description",
            "type": "Edm.String",
            "filterable": false,
            "searchable": true,
            "sortable": false,
            "facetable": false,
            "suggestions": true
        }]
    }
    
  2. Skapa ett dokumentnyckelfält ("nyckel": sant). För ett sökindex baserat på en MongoDB-samling kan dokumentnyckeln vara "doc_id", "rid" eller något annat strängfält som innehåller unika värden. Så länge fältnamn och datatyper är samma på båda sidor krävs inga fältmappningar.

    • "doc_id" representerar "_id" för objektidentifieraren. Om du anger ett fält med "doc_id" i indexet fyller indexeraren i det med värdena för objektidentifieraren.

    • "rid" är en systemegenskap i Azure Cosmos DB. Om du anger ett fält med "rid" i indexet fyller indexeraren i det med det base64-kodade värdet för egenskapen "rid".

    • För andra fält bör sökfältet ha samma namn som definierats i samlingen.

  3. Skapa ytterligare fält för mer sökbart innehåll. Mer information finns i Skapa ett index .

Mappa datatyper

JSON-datatyp Fälttyper för Azure AI Search
Bool Edm.Boolean, Edm.String
Tal som ser ut som heltal Edm.Int32, Edm.Int64, Edm.String
Tal som ser ut som flyttalspunkter Edm.Double, Edm.String
String Edm.String
Matriser med primitiva typer som ["a", "b", "c"] Collection(Edm.String)
Strängar som ser ut som datum Edm.DateTimeOffset, Edm.String
GeoJSON-objekt som { "type": "Point", "coordinates": [long, lat] } Edm.GeographyPoint
Andra JSON-objekt Ej tillämpligt

Konfigurera och köra Azure Cosmos DB for MongoDB-indexeraren

När indexet och datakällan har skapats är du redo att skapa indexeraren. Indexerarens konfiguration anger indata, parametrar och egenskaper som styr körningstidsbeteenden.

  1. Skapa eller uppdatera en indexerare genom att ge den ett namn och referera till datakällan och målindexet:

    POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
    Content-Type: application/json
    api-key: [search service admin key]
    {
        "name" : "[my-cosmosdb-indexer]",
        "dataSourceName" : "[my-cosmosdb-mongodb-ds]",
        "targetIndexName" : "[my-search-index]",
        "disabled": null,
        "schedule": null,
        "parameters": {
            "batchSize": null,
            "maxFailedItems": 0,
            "maxFailedItemsPerBatch": 0,
            "base64EncodeKeys": false,
            "configuration": {}
            },
        "fieldMappings": [],
        "encryptionKey": null
    }
    
  2. Ange fältmappningar om det finns skillnader i fältnamn eller typ, eller om du behöver flera versioner av ett källfält i sökindexet.

  3. Mer information om andra egenskaper finns i Skapa en indexerare .

En indexerare körs automatiskt när den skapas. Du kan förhindra detta genom att ange "inaktiverad" till true. Om du vill kontrollera indexerarens körning kör du en indexerare på begäran eller sätter den enligt ett schema.

Kontrollera status för indexerare

Om du vill övervaka indexerarens status och körningshistorik skickar du en get indexer-statusbegäran :

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

Svaret innehåller status och antalet bearbetade objekt. Det bör se ut ungefär som i följande exempel:

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

Körningshistoriken innehåller upp till 50 av de senast slutförda körningarna, som sorteras i omvänd kronologisk ordning så att den senaste körningen kommer först.

Indexera nya och ändrade dokument

När en indexerare har fyllt i ett sökindex helt kan det vara bra att efterföljande indexerare körs för att stegvis indexera bara de nya och ändrade dokumenten i databasen.

Om du vill aktivera inkrementell indexering anger du egenskapen "dataChangeDetectionPolicy" i datakälldefinitionen. Den här egenskapen talar om för indexeraren vilken mekanism för ändringsspårning som används för dina data.

För Azure Cosmos DB-indexerare är HighWaterMarkChangeDetectionPolicy den enda princip som stöds att använda _ts egenskapen (tidsstämpel) som tillhandahålls av Azure Cosmos DB.

I följande exempel visas en datakällans definition med en princip för ändringsidentifiering:

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

Indexera borttagna dokument

När rader tas bort från samlingen vill du normalt även ta bort dessa rader från sökindexet. Syftet med en princip för identifiering av databorttagning är att effektivt identifiera borttagna dataobjekt. För närvarande är Soft Delete den enda princip som stöds principen (borttagning markeras med en flagga av något slag), som anges i datakällans definition enligt följande:

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

Om du använder en anpassad fråga kontrollerar du att den egenskap som refereras av softDeleteColumnName projiceras av frågan.

I följande exempel skapas en datakälla med en princip för mjuk borttagning:

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

{
    "name": ["my-cosmosdb-mongodb-ds]",
    "type": "cosmosdb",
    "credentials": {
        "connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.com;AccountKey=[cosmos-account-key];Database=[cosmos-database-name];ApiKind=MongoDB"
    },
    "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"
    }
}

Nästa steg

Nu kan du styra hur du kör indexeraren, övervakar status eller schemalägger indexerarens körning. Följande artiklar gäller för indexerare som hämtar innehåll från Azure Cosmos DB: