Partager via


2 - Créer et charger un index de recherche avec JavaScript

Effectuez les étapes suivantes pour continuer à créer votre site web prenant en charge les recherches :

Créer une ressource Recherche Azure AI

Créez une ressource de recherche à partir de la ligne de commande à l’aide de l’interface Azure CLI ou d’Azure PowerShell. Vous récupérez aussi une clé de requête utilisée pour l’accès en lecture à l’index et obtenir la clé d’administration prédéfinie et utilisée pour ajouter des objets.

Azure CLI ou Azure PowerShell doit être installé sur votre appareil. Si vous n’êtes pas un administrateur local sur votre appareil, choisissez Azure PowerShell et utilisez le paramètre Scope pour exécuter en tant qu’utilisateur actuel.

Remarque

Cette tâche ne nécessite pas les extensions Visual Studio Code pour l’interface Azure CLI et Azure PowerShell. Visual Studio Code reconnaît les outils en ligne de commande sans les extensions.

  1. Dans Visual Studio Code, sous Terminal, sélectionnez Nouveau terminal.

  2. Connectez-vous à Azure :

    az login
    
  3. Avant de créer un service de recherche, répertoriez les services existants pour votre abonnement :

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

    Si vous avez un service que vous souhaitez utiliser, notez son nom, puis passez à la section suivante.

  4. Créez un service de recherche. Utilisez la commande suivante comme modèle, en remplaçant les valeurs valides pour le groupe de ressources, le nom du service, le niveau, la région, les partitions et les réplicas. L’instruction suivante utilise le groupe de ressources « cognitive-search-demo-rg » créé à l’étape précédente et spécifie le niveau « gratuit ». Si votre abonnement Azure dispose déjà d’un service de recherche gratuite, spécifiez plutôt un niveau facturable tel que « de base ».

    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. Obtenir une clé de requête qui octroie l’accès en lecture à un service de recherche. Un service de recherche est approvisionné avec deux clés d’administration et une clé de requête. Remplacez des noms valides pour le groupe de ressources et le service de recherche. Copiez la clé de requête dans le Bloc-notes pour pouvoir la coller dans le code client lors d’une étape ultérieure :

    az search query-key list --resource-group cognitive-search-demo-rg --service-name my-cog-search-demo-svc
    
  6. Obtenir une clé API d’administration du service de recherche. Une clé API d’administration fournit un accès en écriture au service de recherche. Copiez l’une des clés d’administration dans le Bloc-notes pour pouvoir l’utiliser lors de l’étape d’importation en bloc qui crée et charge un index :

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

Le script ESM utilise le Kit de développement logiciel (SDK) Azure pour la Recherche Azure AI :

  1. Dans Visual Studio Code, ouvrez le fichier bulk_insert_books.js dans le sous-répertoire search-website-functions-v4/bulk-insert et remplacez les variables suivantes par vos propres valeurs pour vous authentifier auprès du SDK Azure Search :

    • VOTRE-NOM-DE-RESSOURCE-DE-RECHERCHE
    • VOTRE CLÉ-ADMINISTRATION-DE-RECHERCHE
    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. Ouvrez un terminal intégré dans Visual Studio pour le sous-répertoire du répertoire du projet, search-website-functions-v4/bulk-insert, puis exécutez la commande suivante pour installer les dépendances.

    npm install 
    
  1. Continuez à utiliser le terminal intégré dans Visual Studio pour le sous-répertoire du répertoire du projet, search-website-functions-v4/bulk-insert, pour exécuter le script bulk_insert_books.js :

    npm start
    
  2. À mesure que le code s’exécute, la console affiche la progression.

  3. Une fois le téléchargement terminé, la dernière instruction imprimée sur la console est « done ».

Examiner le nouvel index de recherche

Une fois le chargement effectué, l’index de recherche est prêt à être utilisé. Passez en revue votre nouvel index dans le portail Azure.

  1. Dans le portail Azure, recherchez le service de recherche que vous avez créé à l’étape précédente.

  2. Sur la gauche, sélectionnez Index, puis l’index good-books.

    Capture d’écran extensible du portail Azure montrant l’index.

  3. Par défaut, l’index s’ouvre sous l’onglet Explorateur de recherche. Sélectionnez Rechercher pour renvoyer des documents à partir de l’index.

    Capture d’écran extensible du portail Azure montrant des résultats de recherche

Annuler les modifications apportées au fichier d'importation en bloc

Dans le terminal intégré Visual Studio Code, appliquez la commande Git suivante au répertoire bulk-insert pour restaurer les modifications. Celles-ci ne sont pas nécessaires pour poursuivre le tutoriel, et vous n’avez pas besoin d’enregistrer ou de transmettre ces secrets à votre dépôt.

git checkout .

Copiez le nom de votre ressource de recherche.

Notez le nom de votre ressource de recherche. Vous en aurez besoin pour connecter l’application Azure Function à votre ressource de recherche.

Attention

Vous pouvez être tenté d’utiliser votre clé d’administration de recherche dans Azure Function, qui ne suit pas le principe du privilège minimum. Azure Function utilise la clé de requête pour se conformer au privilège minimum.

Étapes suivantes

Déployer votre application web statique