Share via


2: Erstellen und Laden des Suchindexes mit JavaScript

Fahren Sie mit dem Erstellen Ihrer Website mit Suchunterstützung fort, indem Sie die folgenden Schritte ausführen:

Erstellen einer Azure KI Search-Ressource

Erstellen Sie eine neue Suchressource über die Befehlszeile mithilfe der Azure CLI oder Azure PowerShell. Sie rufen auch einen Abfrageschlüssel ab, der für Lesezugriff auf den Index verwendet wird, und erhalten den integrierte Administratorschlüssel zum Hinzufügen von Objekten.

Sie müssen die Azure CLI oder Azure PowerShell auf Ihrem Gerät installiert haben. Wenn Sie kein lokaler Administrator auf Ihrem Gerät sind, wählen Sie Azure PowerShell aus, und verwenden Sie den Parameter „Scope“, um es als aktueller Benutzer auszuführen.

Hinweis

Für diese Aufgabe sind die Visual Studio Code-Erweiterungen für die Azure CLI und Azure PowerShell nicht erforderlich. Visual Studio Code erkennt die Befehlszeilentools ohne die Erweiterungen.

  1. Wählen Sie in Visual Studio Code unter Terminaldie Option Neues Terminal aus.

  2. Stellen Sie eine Verbindung mit Azure her:

    az login
    
  3. Listen Sie vor dem Erstellen eines neuen Suchdiensts die vorhandenen Dienste für Ihr Abonnement auf:

    az resource list --resource-type Microsoft.Search/searchServices --output table
    

    Wenn Sie über einen Dienst verfügen, den Sie verwenden möchten, notieren Sie sich den Namen, und fahren Sie dann mit dem nächsten Abschnitt fort.

  4. Erstellen Sie einen neuen Suchdienst. Verwenden Sie den folgenden Befehl als Vorlage, und fügen Sie gültige Werte für Ressourcengruppe, Dienstname, Ebene, Region, Partitionen und Replikate ein. Die folgende Anweisung verwendet die Ressourcengruppe „cognitive-search-demo-rg“, die in einem vorherigen Schritt erstellt wurde, und gibt den Tarif „Free“ an. Wenn Ihr Azure-Abonnement bereits über einen kostenlosen Suchdienst verfügt, geben Sie stattdessen einen abrechenbaren Tarif wie „Basic“ an.

    az search service create --name my-cog-search-demo-svc --resource-group cognitive-search-demo-rg --sku free --partition-count 1 --replica-count 1
    
  5. Rufen Sie einen Abfrageschlüssel, der Lesezugriff auf einen Suchdienst gewährt, ab. Ein Suchdienst wird mit zwei Administratorschlüsseln und einem Abfrageschlüssel bereitgestellt. Ersetzen Sie gültige Namen für die Ressourcengruppe und den Suchdienst. Kopieren Sie den Abfrageschlüssel in Editor, damit Sie ihn in einem späteren Schritt in den Clientcode einfügen können:

    az search query-key list --resource-group cognitive-search-demo-rg --service-name my-cog-search-demo-svc
    
  6. Rufen Sie einen Suchdienstadministrator-API-Schlüssel ab. Ein API-Administratorschlüssel bietet Schreibzugriff auf den Suchdienst. Kopieren Sie einen Administratorschlüssel in Editor, damit Sie ihn im Massenimportschritt verwenden können, in dem ein Index erstellt und geladen wird:

    az search admin-key show --resource-group cognitive-search-demo-rg --service-name my-cog-search-demo-svc
    

Das ESM-Skript verwendet das Azure SDK für Azure KI Search:

  1. Öffnen Sie in Visual Studio Code die Datei bulk_insert_books.js im Unterverzeichnis search-website-functions-v4/bulk-insert, und ersetzen Sie die folgenden Variablen durch Ihre eigenen Werte, um sich mit dem Azure Search SDK zu authentifizieren:

    • YOUR-SEARCH-RESOURCE-NAME
    • YOUR-SEARCH-ADMIN-KEY
    import fetch from 'node-fetch';
    import Papa from 'papaparse';
    import {
      SearchClient,
      SearchIndexClient,
      AzureKeyCredential
    } from '@azure/search-documents';
    
    // Azure AI Search resource settings
    const SEARCH_ENDPOINT = 'https://YOUR-RESOURCE-NAME.search.windows.net';
    const SEARCH_ADMIN_KEY = 'YOUR-RESOURCE-ADMIN-KEY';
    
    // Azure AI Search index settings
    const SEARCH_INDEX_NAME = 'good-books';
    import SEARCH_INDEX_SCHEMA from './good-books-index.json' assert { type: 'json' };
    
    // Data settings
    const BOOKS_URL =
      'https://raw.githubusercontent.com/Azure-Samples/azure-search-sample-data/main/good-books/books.csv';
    const BATCH_SIZE = 1000;
    
    // Create Search service client
    // used to upload docs into Index
    const client = new SearchClient(
      SEARCH_ENDPOINT,
      SEARCH_INDEX_NAME,
      new AzureKeyCredential(SEARCH_ADMIN_KEY)
    );
    
    // Create Search service Index client
    // used to create new Index
    const clientIndex = new SearchIndexClient(
      SEARCH_ENDPOINT,
      new AzureKeyCredential(SEARCH_ADMIN_KEY)
    );
    
    // Insert docs into Search Index
    // in batch
    const insertData = async (data) => {
      let batch = 0;
      let batchArray = [];
    
      for (let i = 0; i < data.length; i++) {
        const row = data[i];
    
        // Convert string data to typed data
        // Types are defined in schema
        batchArray.push({
          id: row.book_id,
          goodreads_book_id: parseInt(row.goodreads_book_id),
          best_book_id: parseInt(row.best_book_id),
          work_id: parseInt(row.work_id),
          books_count: !row.books_count ? 0 : parseInt(row.books_count),
          isbn: row.isbn,
          isbn13: row.isbn13,
          authors: row.authors.split(',').map((name) => name.trim()),
          original_publication_year: !row.original_publication_year
            ? 0
            : parseInt(row.original_publication_year),
          original_title: row.original_title,
          title: row.title,
          language_code: row.language_code,
          average_rating: !row.average_rating ? 0 : parseFloat(row.average_rating),
          ratings_count: !row.ratings_count ? 0 : parseInt(row.ratings_count),
          work_ratings_count: !row.work_ratings_count
            ? 0
            : parseInt(row.work_ratings_count),
          work_text_reviews_count: !row.work_text_reviews_count
            ? 0
            : parseInt(row.work_text_reviews_count),
          ratings_1: !row.ratings_1 ? 0 : parseInt(row.ratings_1),
          ratings_2: !row.ratings_2 ? 0 : parseInt(row.ratings_2),
          ratings_3: !row.ratings_3 ? 0 : parseInt(row.ratings_3),
          ratings_4: !row.ratings_4 ? 0 : parseInt(row.ratings_4),
          ratings_5: !row.ratings_5 ? 0 : parseInt(row.ratings_5),
          image_url: row.image_url,
          small_image_url: row.small_image_url
        });
    
        console.log(`${i}`);
    
        // Insert batch into Index
        if (batchArray.length % BATCH_SIZE === 0) {
          await client.uploadDocuments(batchArray);
    
          console.log(`BATCH SENT`);
          batchArray = [];
        }
      }
      // Insert any final batch into Index
      if (batchArray.length > 0) {
        await client.uploadDocuments(batchArray);
    
        console.log(`FINAL BATCH SENT`);
        batchArray = [];
      }
    };
    const bulkInsert = async () => {
      // Download CSV Data file
      const response = await fetch(BOOKS_URL, {
        method: 'GET'
      });
      if (response.ok) {
        console.log(`book list fetched`);
        const fileData = await response.text();
        console.log(`book list data received`);
    
        // convert CSV to JSON
        const dataObj = Papa.parse(fileData, {
          header: true,
          encoding: 'utf8',
          skipEmptyLines: true
        });
        console.log(`book list data parsed`);
    
        // Insert JSON into Search Index
        await insertData(dataObj.data);
        console.log(`book list data inserted`);
      } else {
        console.log(`Couldn\t download data`);
      }
    };
    
    // Create Search Index
    async function createIndex() {
      SEARCH_INDEX_SCHEMA.name = SEARCH_INDEX_NAME;
    
      const result = await clientIndex.createIndex(SEARCH_INDEX_SCHEMA);
    }
    
    await createIndex();
    console.log('index created');
    
    await bulkInsert();
    console.log('data inserted into index');
    
  2. Öffnen Sie in Visual Studio ein integriertes Terminal für das Unterverzeichnis search-website-functions-v4/bulk-insert des Projektverzeichnisses, und führen Sie den folgenden Befehl aus, um die Abhängigkeiten zu installieren:

    npm install 
    
  1. Verwenden Sie weiterhin das integrierte Terminal in Visual Studio für das Unterverzeichnis search-website-functions-v4/bulk-insert des Projektverzeichnisses, um das Skript bulk_insert_books.js auszuführen:

    npm start
    
  2. Während der Codeausführung wird in der Konsole der Status angezeigt.

  3. Nach Abschluss des Uploads lautet die letzte in der Konsole ausgegebene Meldung „Done“ (Fertig).

Überblick über den neuen Suchindex

Nach Abschluss des Uploads kann der Suchindex verwendet werden. Überprüfen Sie Ihren neuen Index im Azure-Portal.

  1. Suchen Sie den Suchdienst, den Sie im vorherigen Schritt erstellt haben, im Azure-Portal.

  2. Wählen Sie auf der linken Seite Indizes und dann den „Good-Books-Index“ aus.

    Expandable screenshot of Azure portal showing the index.

  3. Standardmäßig wird der Index auf der Registerkarte Suchexplorer geöffnet. Wählen Sie Suchen aus, um Dokumente aus dem Index zurückzugeben.

    Expandable screenshot of Azure portal showing search results

Rollback von Massenimport-Dateiänderungen

Verwenden Sie den folgenden git-Befehl im integrierten Visual Studio Code-Terminal im Verzeichnis bulk-insert, um ein Rollback der Änderungen auszuführen. Sie werden nicht benötigt, um das Tutorial fortzusetzen, und Sie sollten diese Geheimnisse nicht speichern oder in Ihr Repository pushen.

git checkout .

Kopieren des Namens Ihrer Suchressource

Notieren Sie sich den Namen der Suchressource. Sie benötigen ihn, um die Azure Functions-App mit Ihrer Suchressource zu verbinden.

Achtung

Möglicherweise möchten Sie den Administratorschlüssel für die Suche in der Azure Functions-Instanz verwenden. Dadurch wird jedoch nicht das Prinzip der geringsten Berechtigungen befolgt. Die Azure Functions-Instanz verwendet den Abfrageschlüssel, um das Prinzip der geringsten Berechtigungen einzuhalten.

Nächste Schritte

Bereitstellen Ihrer statischen Web-App