Oktatóanyag: Indexelés több adatforrásból a .NET SDK használatával

Az Azure AI Search támogatja az adatok importálását, elemzését és indexelését több adatforrásból egyetlen összevont keresési indexbe.

Ez a C# oktatóanyag az Azure.Search.Documents ügyfélkódtárat használja az Azure SDK for .NET-ben egy Azure Cosmos DB-példány minta szállodaadatainak indexeléséhez. Ezután egyesítheti az adatokat az Azure Blob Storage-dokumentumokból kinyert szállodai szobák adataival. Az eredmény egy szállodai dokumentumokat tartalmazó kombinált szállodai keresési index, amely összetett adattípusú szobákat tartalmaz.

Ebben az útmutatóban Ön:

  • Mintaadatok feltöltése adatforrásokhoz
  • A dokumentumkulcs azonosítása
  • Az index definiálása és létrehozása
  • Szállodai adatok indexelése az Azure Cosmos DB-ből
  • Szállodai szobák adatainak egyesítése a Blob Storage-ból

Áttekintés

Ez az oktatóanyag az Azure.Search.Documents használatával hoz létre és futtat több indexelőt. Mintaadatokat tölthet fel két Azure-adatforrásba, és konfigurálhat egy indexelőt, amely mindkét forrásból lekéri az adatokat egyetlen keresési index feltöltéséhez. A két adathalmaznak közös értékkel kell rendelkeznie az egyesítés támogatásához. Ebben az oktatóanyagban ez a mező egy azonosító. Amíg a megfeleltetés támogatásához közös mező van, az indexelők egyesíthetik az adatokat különböző erőforrásokból: strukturált adatok az Azure SQL-ből, strukturálatlan adatok a Blob Storage-ból vagy az Azure-beli támogatott adatforrások bármilyen kombinációja.

Az oktatóanyagban szereplő kód egy kész verziója a következő projektben található:

Előfeltételek

Feljegyzés

Ehhez az oktatóanyaghoz ingyenes keresési szolgáltatást használhat. Az ingyenes szint három indexre, három indexelőre és három adatforrásra korlátozza. Ez az oktatóanyag mindegyikből egyet hoz létre. Mielőtt hozzákezd, győződjön meg arról, hogy van helye a szolgáltatásban az új erőforrások elfogadásához.

Szolgáltatások előkészítése

Ez az oktatóanyag az Azure AI Search szolgáltatást használja indexeléshez és lekérdezésekhez, az első adatkészlethez az Azure Cosmos DB-t, a második adatkészlethez pedig az Azure Blob Storage-t.

Ha lehetséges, hozzon létre minden szolgáltatást ugyanabban a régióban és erőforráscsoportban a közelség és a kezelhetőség érdekében. A gyakorlatban a szolgáltatások bármely régióban lehetnek.

Ez a minta két kis adatkészletet használ, amelyek hét fiktív szállodát írnak le. Az egyik készlet maga írja le a szállodákat, és egy Azure Cosmos DB-adatbázisba lesz betöltve. A másik készlet a szállodai szoba adatait tartalmazza, és hét különálló JSON-fájlként van megadva, amelyet fel kell tölteni az Azure Blob Storage-ba.

Első lépések az Azure Cosmos DB-vel

  1. Nyissa meg Azure Cosmos DB-fiókját az Azure Portalon.

  2. A bal oldali panelen válassza az Adatkezelő lehetőséget.

  3. Válassza az Új tároló>új adatbázisa lehetőséget.

    Új adatbázis létrehozása

  4. Adja meg a hotel-rooms-db nevet. Fogadja el a fennmaradó beállítások alapértelmezett értékeit.

    Adatbázis konfigurálása

  5. Hozzon létre egy tárolót, amely a korábban létrehozott adatbázist célozza. Adja meg a szállodák nevét és a /HotelId partíciókulcsot.

    Tároló hozzáadása

  6. Válassza ki a Hotels>Items elemet, majd válassza az Elem feltöltése lehetőséget a parancssávon.

  7. Töltse fel a JSON-fájlt a cosmosdb mappából több adatforrásban/v11-ben.

    Feltöltés az Azure Cosmos DB-gyűjteménybe

  8. A frissítés gombbal frissítheti a szállodagyűjtemény elemeinek nézetét. A listában hét új adatbázis-dokumentumnak kell megjelennie.

  9. A bal oldali panelen válassza a Beállítások>kulcsok lehetőséget.

  10. Jegyezze fel a kapcsolati sztringet. Egy későbbi lépésben szüksége lesz erre az értékre appsettings.json . Ha nem a javasolt hotel-rooms-db adatbázisnevet használta, másolja ki az adatbázis nevét is.

Azure Blob Storage

  1. Nyissa meg az Azure Storage-fiókját az Azure Portalon.

  2. A bal oldali panelen válassza az Adattároló>Tárolók lehetőséget.

  3. Hozzon létre egy szállodai szobák nevű blobtárolót a szállodai mintaszoba JSON-fájljainak tárolásához. A hozzáférési szintet bármilyen érvényes értékre beállíthatja.

    Blobtároló létrehozása

  4. Nyissa meg a tárolót, majd válassza a Feltöltés lehetőséget a parancssávon.

  5. Töltse fel a hét JSON-fájlt a blob mappából több adatforrásban/v11-ben.

    Fájlok feltöltése

  6. A bal oldali panelen válassza a Biztonság + hálózatkezelési>hozzáférési kulcsok lehetőséget.

  7. Jegyezze fel a fiók nevét és a kapcsolati sztringet. Egy későbbi lépésben mindkét értékre szüksége lesz appsettings.json fájlban.

A harmadik összetevő az Azure AI Search, amelyet létrehozhat az Azure Portalon, vagy megkereshet egy meglévő keresési szolgáltatást az Azure-erőforrásokban.

A keresési szolgáltatásban való hitelesítéshez szüksége van a szolgáltatás URL-címére és egy hozzáférési kulcsra. Az érvényes kulcs kérésenként megbízhatóságot teremt a kérelmet küldő alkalmazás és az azt kezelő szolgáltatás között.

  1. Nyissa meg a keresési szolgáltatást az Azure Portalon.

  2. A bal oldali panelen válassza az Áttekintés lehetőséget.

  3. Jegyezze fel az URL-címet, amelynek így kell kinéznie https://my-service.search.windows.net.

  4. A bal oldali panelen válassza a Beállítások>kulcsok lehetőséget.

  5. Jegyezze fel egy rendszergazdai kulcsot a szolgáltatás teljes jogosultságaihoz. Két felcserélhető rendszergazdai kulcs áll rendelkezésre az üzletmenet folytonossága érdekében, ha át kell gördítenie egyet. Az objektumok hozzáadására, módosítására és törlésére irányuló kérelmekhez bármelyik kulcsot használhatja.

Saját környezet beállítása

  1. Nyissa meg a AzureSearchMultipleDataSources.sln fájlt több adatforrásból/v11-ből a Visual Studióban.

  2. A Megoldáskezelőben kattintson a jobb gombbal a projektre, és válassza a Megoldáshoz készült NuGet-csomagok kezelése... lehetőséget.

  3. A Tallózás lapon keresse meg és telepítse a következő csomagokat:

    • Azure.Search.Documents (11.0-s vagy újabb verzió)

    • Microsoft.Extensions.Configuration

    • Microsoft.Extensions.Configuration.Json

  4. A Megoldáskezelőben szerkessze a appsettings.json fájlt az előző lépésekben összegyűjtött kapcsolati adatokkal.

    {
      "SearchServiceUri": "<YourSearchServiceURL>",
      "SearchServiceAdminApiKey": "<YourSearchServiceAdminApiKey>",
      "BlobStorageAccountName": "<YourBlobStorageAccountName>",
      "BlobStorageConnectionString": "<YourBlobStorageConnectionString>",
      "CosmosDBConnectionString": "<YourCosmosDBConnectionString>",
      "CosmosDBDatabaseName": "hotel-rooms-db"
    }
    

Kulcsmezők leképezése

A tartalom egyesítéséhez mindkét adatfolyam ugyanazt a dokumentumot célozza meg a keresési indexben.

Az Azure AI Searchben a kulcsmező egyedileg azonosítja az egyes dokumentumokat. Minden keresési indexnek pontosan egy típusú Edm.Stringkulcsmezővel kell rendelkeznie. Ennek a kulcsmezőnek minden dokumentumnál jelen kell lennie az indexhez hozzáadott adatforrásban. (Valójában ez az egyetlen kötelező mező.)

Ha több adatforrásból származó adatokat indexel, győződjön meg arról, hogy minden bejövő sor vagy dokumentum tartalmaz egy közös dokumentumkulcsot. Ez lehetővé teszi, hogy két fizikailag eltérő forrásdokumentum adatait egy új keresési dokumentumba egyesítse a kombinált indexben.

Gyakran előzetes tervezésre van szükség ahhoz, hogy az indexhez használható dokumentumkulcsot azonosítsuk, és meggyőződjünk arról, hogy mindkét adatforrásban létezik. Ebben a demóban az Azure Cosmos DB minden szállodájának kulcsa megtalálható a szobák XML-blobjaiban a Blob Storage-ben is.

Az Azure AI Search-indexelők mezőleképezésekkel átnevezhetik és újraformázhatják az adatmezőket az indexelési folyamat során, így a forrásadatok a megfelelő indexmezőbe irányíthatók. Az Azure Cosmos DB-ben például a szállodaazonosítót hívják HotelIdmeg, de a szállodai szobák JSON-blobfájljaiban a szállodaazonosító neve Id. A program ezt az eltérést úgy kezeli, hogy megfelelteti a mezőt a Id blobokból az HotelId indexelő kulcsmezőjére.

Feljegyzés

A legtöbb esetben az automatikusan létrehozott dokumentumkulcsok, például az egyes indexelők által alapértelmezés szerint létrehozott kulcsok nem tesznek jó dokumentumkulcsokat a kombinált indexekhez. Általában használjon értelmes, egyedi kulcsértéket, amely már létezik az adatforrásokban, vagy egyszerűen hozzáadható.

A kód megismerése

Ha az adatok és a konfigurációs beállítások érvényben vannak, a mintaprogramnak AzureSearchMultipleDataSources.sln készen kell állnia a létrehozásra és a futtatásra.

Ez az egyszerű C#/.NET-konzolalkalmazás a következő feladatokat hajtja végre:

  • Létrehoz egy új indexet a C# Hotel osztály adatstruktúrája alapján, amely a Cím és a Szoba osztályra is hivatkozik.
  • Létrehoz egy új adatforrást és egy indexelőt, amely az Azure Cosmos DB-adatokat indexmezőkké képezi le. Ezek mindkét objektum az Azure AI Searchben.
  • Futtatja az indexelőt a szállodai adatok Azure Cosmos DB-ből való betöltéséhez.
  • Létrehoz egy második adatforrást és egy indexelőt, amely JSON-blobadatokat képez le indexmezőkre.
  • Futtatja a második indexelőt a szállodai szobák adatainak a Blob Storage-ból való betöltéséhez.

A program futtatása előtt szánjon egy percet a kód, az indexdefiníció és az indexelő definíciójának tanulmányozására. A megfelelő kód a következő két fájlban található meg:

  • Hotel.cs az indexet meghatározó sémát tartalmazza.
  • Program.cs Olyan függvényeket tartalmaz, amelyek létrehozzák az Azure AI Search-indexet, az adatforrásokat és az indexelőket, és betöltik az összesített eredményeket az indexbe.

Index létrehozása

Ez a mintaprogram a CreateIndexAsync használatával definiál és hoz létre egy Azure AI Search-indexet. A FieldBuilder osztály segítségével indexstruktúrát hozhat létre egy C#-adatmodell-osztályból.

Az adatmodellt a Szálloda osztály határozza meg, amely a Cím és a Helyiség osztályra mutató hivatkozásokat is tartalmaz. A FieldBuilder több osztálydefiníción keresztül részletezi az index összetett adatstruktúráját. A metaadatcímkék az egyes mezők attribútumainak meghatározására szolgálnak, például azt, hogy kereshető vagy rendezhető-e.

A program törli az azonos nevű meglévő indexeket az új létrehozása előtt, ha ezt a példát többször szeretné futtatni.

A fájl alábbi Hotel.cs kódrészletei egyetlen mezőket mutatnak, majd egy másik adatmodell-osztályra, a Room[]-ra mutató hivatkozást, amely viszont a fájlban Room.cs van definiálva (nem jelenik meg).

. . .
[SimpleField(IsFilterable = true, IsKey = true)]
public string HotelId { get; set; }

[SearchableField(IsFilterable = true, IsSortable = true)]
public string HotelName { get; set; }
. . .
public Room[] Rooms { get; set; }
. . .

A Program.cs fájlban a SearchIndex egy névvel és egy mezőgyűjteménnyel van definiálva, amelyeket a FieldBuilder.Build metódus hoz létre, majd ilyen módon jön létre:

private static async Task CreateIndexAsync(string indexName, SearchIndexClient indexClient)
{
    // Create a new search index structure that matches the properties of the Hotel class.
    // The Address and Room classes are referenced from the Hotel class. The FieldBuilder
    // will enumerate these to create a complex data structure for the index.
    FieldBuilder builder = new FieldBuilder();
    var definition = new SearchIndex(indexName, builder.Build(typeof(Hotel)));

    await indexClient.CreateIndexAsync(definition);
}

Azure Cosmos DB-adatforrás és indexelő létrehozása

A fő program logikát tartalmaz az Azure Cosmos DB adatforrásának létrehozásához a szállodák adataihoz.

Először összefűzi az Azure Cosmos DB-adatbázis nevét a kapcsolati sztringgel. Ezután definiál egy SearchIndexerDataSourceConnection objektumot.

private static async Task CreateAndRunCosmosDbIndexerAsync(string indexName, SearchIndexerClient indexerClient)
{
    // Append the database name to the connection string
    string cosmosConnectString =
        configuration["CosmosDBConnectionString"]
        + ";Database="
        + configuration["CosmosDBDatabaseName"];

    SearchIndexerDataSourceConnection cosmosDbDataSource = new SearchIndexerDataSourceConnection(
        name: configuration["CosmosDBDatabaseName"],
        type: SearchIndexerDataSourceType.CosmosDb,
        connectionString: cosmosConnectString,
        container: new SearchIndexerDataContainer("hotels"));

    // The Azure Cosmos DB data source does not need to be deleted if it already exists,
    // but the connection string might need to be updated if it has changed.
    await indexerClient.CreateOrUpdateDataSourceConnectionAsync(cosmosDbDataSource);

Az adatforrás létrehozása után a program beállít egy Azure Cosmos DB indexelőt.hotel-rooms-cosmos-indexer

A program frissíti az azonos nevű meglévő indexelőket, felülírva a meglévő indexelőt az előző kód tartalmával. Emellett alaphelyzetbe állítási és futtatási műveleteket is tartalmaz, ha ezt a példát többször szeretné futtatni.

Az alábbi példa az indexelő ütemezését határozza meg, hogy naponta egyszer fusson. Eltávolíthatja a hívás ütemezési tulajdonságát, ha nem szeretné, hogy az indexelő a jövőben automatikusan újra fusson.

SearchIndexer cosmosDbIndexer = new SearchIndexer(
    name: "hotel-rooms-cosmos-indexer",
    dataSourceName: cosmosDbDataSource.Name,
    targetIndexName: indexName)
{
    Schedule = new IndexingSchedule(TimeSpan.FromDays(1))
};

// Indexers keep metadata about how much they have already indexed.
// If we already ran the indexer, it "remembers" and does not run again.
// To avoid this, reset the indexer if it exists.
try
{
    await indexerClient.GetIndexerAsync(cosmosDbIndexer.Name);
    // Reset the indexer if it exists.
    await indexerClient.ResetIndexerAsync(cosmosDbIndexer.Name);
}
catch (RequestFailedException ex) when (ex.Status == 404)
{
    // If the indexer does not exist, 404 will be thrown.
}

await indexerClient.CreateOrUpdateIndexerAsync(cosmosDbIndexer);

Console.WriteLine("Running Azure Cosmos DB indexer...\n");

try
{
    // Run the indexer.
    await indexerClient.RunIndexerAsync(cosmosDbIndexer.Name);
}
catch (RequestFailedException ex) when (ex.Status == 429)
{
    Console.WriteLine("Failed to run indexer: {0}", ex.Message);
}

Ez a példa egy egyszerű kipróbálási blokkot tartalmaz a végrehajtás során esetlegesen előforduló hibák jelentésére.

Az Azure Cosmos DB-indexelő futtatása után a keresési index a szállodai mintadokumentumok teljes készletét tartalmazza. Az egyes hotelek helyiségmezője azonban egy üres tömb, mivel az Azure Cosmos DB-adatforrás kihagyja a szobák részleteit. Ezután a program a Blob Storage-ból húzza be a szobaadatokat, majd betölti és egyesíti azokat.

Blob Storage-adatforrás és indexelő létrehozása

A helyiség részleteinek lekéréséhez a program először beállít egy Blob Storage-adatforrást, amely az egyes JSON-blobfájlokra hivatkozik.

private static async Task CreateAndRunBlobIndexerAsync(string indexName, SearchIndexerClient indexerClient)
{
    SearchIndexerDataSourceConnection blobDataSource = new SearchIndexerDataSourceConnection(
        name: configuration["BlobStorageAccountName"],
        type: SearchIndexerDataSourceType.AzureBlob,
        connectionString: configuration["BlobStorageConnectionString"],
        container: new SearchIndexerDataContainer("hotel-rooms"));

    // The blob data source does not need to be deleted if it already exists,
    // but the connection string might need to be updated if it has changed.
    await indexerClient.CreateOrUpdateDataSourceConnectionAsync(blobDataSource);

Az adatforrás létrehozása után a program beállít egy blobindexelőt hotel-rooms-blob-indexeraz alább látható módon.

A JSON-blobok egy kulcsmezőt tartalmaznak, amelyet Id-nek hívnak, a HotelId helyett. A kód az FieldMapping osztály használatával utasítja az indexelőt, hogy a Id mező értékét az HotelId index dokumentumkulcsához irányítsa.

A Blob Storage-indexelők az IndexingParameters használatával adhatnak meg elemzési módot. Különböző elemzési módokat kell beállítania attól függően, hogy a blobok egyetlen dokumentumot vagy több dokumentumot jelölnek-e ugyanazon a blobon belül. Ebben a példában minden blob egyetlen JSON-dokumentumot jelöl, így a kód az elemzési json módot használja. További információ a JSON-blobok indexelő elemzési paramétereiről: Index JSON-blobok.

Ez a példa az indexelő ütemezését határozza meg, hogy naponta egyszer fusson. Eltávolíthatja a hívás ütemezési tulajdonságát, ha nem szeretné, hogy az indexelő a jövőben automatikusan újra fusson.

IndexingParameters parameters = new IndexingParameters();
parameters.Configuration.Add("parsingMode", "json");

SearchIndexer blobIndexer = new SearchIndexer(
    name: "hotel-rooms-blob-indexer",
    dataSourceName: blobDataSource.Name,
    targetIndexName: indexName)
{
    Parameters = parameters,
    Schedule = new IndexingSchedule(TimeSpan.FromDays(1))
};

// Map the Id field in the Room documents to the HotelId key field in the index
blobIndexer.FieldMappings.Add(new FieldMapping("Id") { TargetFieldName = "HotelId" });

// Reset the indexer if it already exists
try
{
    await indexerClient.GetIndexerAsync(blobIndexer.Name);
    await indexerClient.ResetIndexerAsync(blobIndexer.Name);
}
catch (RequestFailedException ex) when (ex.Status == 404) { }

await indexerClient.CreateOrUpdateIndexerAsync(blobIndexer);

try
{
    // Run the indexer.
    await searchService.Indexers.RunAsync(blobIndexer.Name);
}
catch (CloudException e) when (e.Response.StatusCode == (HttpStatusCode)429)
{
    Console.WriteLine("Failed to run indexer: {0}", e.Response.Content);
}

Mivel az index már feltöltve van az Azure Cosmos DB-adatbázisból származó szállodai adatokkal, a blobindexelő frissíti az indexben lévő meglévő dokumentumokat, és hozzáadja a helyiség részleteit.

Feljegyzés

Ha mindkét adatforrásban ugyanazok a nem kulcsmezők szerepelnek, és az ezekben a mezőkben lévő adatok nem egyeznek, az index azokat az értékeket tartalmazza, amelyekből az indexelő legutóbb futott. A példánkban mindkét adatforrás tartalmaz egy HotelName mezőt. Ha valamilyen oknál fogva a mező adatai eltérnek, az azonos kulcsértékkel rendelkező dokumentumok esetében a HotelName legutóbb indexelt adatforrás adatai az indexben tárolt értékek.

A program futtatása után az Azure PortalOn a Search Explorerrel felfedezheti a feltöltött keresési indexet.

  1. Nyissa meg a keresési szolgáltatást az Azure Portalon.

  2. A bal oldali panelen válassza a Kereséskezelési>indexek lehetőséget.

  3. Válassza ki a hotel-rooms-sample elemet az indexek listájából.

  4. A Kereséskezelő lapon adjon meg egy lekérdezést egy olyan kifejezéshez, mint a Luxury.

    Az eredményekben legalább egy dokumentumnak meg kell jelennie. A dokumentum tömbjének tartalmaznia kell a helyiségobjektumok Rooms listáját.

Alaphelyzetbe állítás és ismételt futtatás

A fejlesztés korai kísérleti fázisaiban a tervezési iteráció legpraktikusabb módszere az objektumok törlése az Azure AI Searchből, és a kód újraépítésének engedélyezése. Az erőforrásnevek egyediek. Egy objektum törlése révén újból létrehozhatja azt ugyanazzal a névvel.

A mintakód ellenőrzi a meglévő objektumokat, és törli vagy frissíti őket, hogy újrafuttassa a programot. Az Azure Portal használatával indexeket, indexelőket és adatforrásokat is törölhet.

Az erőforrások megtisztítása

Ha a saját előfizetésében dolgozik, a projekt végén célszerű eltávolítania a már nem szükséges erőforrásokat. A továbbra is futó erőforrások költségekkel járhatnak. Az erőforrásokat törölheti egyesével, vagy az erőforráscsoport törlésével eltávolíthatja a benne lévő összes erőforrást is.

Az erőforrásokat az Azure Portalon a bal oldali panel Minden erőforrás vagy erőforráscsoport hivatkozásával keresheti meg és kezelheti.

Következő lépés

Most, hogy már ismeri a több forrásból származó adatok betöltését, tekintse meg közelebbről az Indexelő konfigurációját az Azure Cosmos DB-től kezdve: