2 — Tworzenie i ładowanie indeksu wyszukiwania za pomocą języka JavaScript

Kontynuuj tworzenie witryny internetowej obsługującej wyszukiwanie, wykonując następujące kroki:

  • Tworzenie zasobu wyszukiwania
  • Tworzenie nowego indeksu
  • Importowanie danych za pomocą języka JavaScript przy użyciu skryptubulk_insert_books i zestawu Azure SDK @azure/search-documents.

Tworzenie zasobu usługi Azure AI Search

Utwórz nowy zasób wyszukiwania z poziomu wiersza polecenia przy użyciu interfejsu wiersza polecenia platformy Azure lub programu Azure PowerShell. Pobierasz również klucz zapytania używany do odczytu do indeksu i uzyskujesz wbudowany klucz administracyjny używany do dodawania obiektów.

Na urządzeniu musi być zainstalowany interfejs wiersza polecenia platformy Azure lub program Azure PowerShell . Jeśli nie jesteś administratorem lokalnym na urządzeniu, wybierz program Azure PowerShell i użyj parametru Scope , aby uruchomić go jako bieżący użytkownik.

Uwaga

To zadanie nie wymaga rozszerzeń programu Visual Studio Code dla interfejsu wiersza polecenia platformy Azure i programu Azure PowerShell. Program Visual Studio Code rozpoznaje narzędzia wiersza polecenia bez rozszerzeń.

  1. W programie Visual Studio Code w obszarze Terminal wybierz pozycję Nowy terminal.

  2. Połączenie na platformę Azure:

    az login
    
  3. Przed utworzeniem nowej usługi wyszukiwania wyświetl listę istniejących usług dla subskrypcji:

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

    Jeśli masz usługę, której chcesz użyć, zanotuj nazwę, a następnie przejdź do następnej sekcji.

  4. Utwórz nową usługę wyszukiwania. Użyj następującego polecenia jako szablonu, podstawiając prawidłowe wartości dla grupy zasobów, nazwy usługi, warstwy, regionu, partycji i replik. Poniższa instrukcja używa grupy zasobów "cognitive-search-demo-rg" utworzonej w poprzednim kroku i określa warstwę "bezpłatna". Jeśli Twoja subskrypcja platformy Azure ma już bezpłatną usługę wyszukiwania, określ warstwę rozliczaną, taką jak "podstawowa".

    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. Pobierz klucz zapytania, który udziela dostępu do odczytu do usługi wyszukiwania. Usługa wyszukiwania jest aprowizowana przy użyciu dwóch kluczy administracyjnych i jednego klucza zapytania. Zastąp prawidłowe nazwy grupy zasobów i usługi wyszukiwania. Skopiuj klucz zapytania do Notatnik, aby można było wkleić go do kodu klienta w późniejszym kroku:

    az search query-key list --resource-group cognitive-search-demo-rg --service-name my-cog-search-demo-svc
    
  6. Pobierz klucz interfejsu API administratora usługi wyszukiwania. Klucz interfejsu API administratora zapewnia dostęp do zapisu w usłudze wyszukiwania. Skopiuj jeden z kluczy administratora, aby Notatnik, aby można było go użyć w kroku importu zbiorczego, który tworzy i ładuje indeks:

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

Skrypt PLATFORMy ESM używa zestawu Azure SDK dla usługi Azure AI Search:

  1. W programie Visual Studio Code otwórz bulk_insert_books.js plik w podkatalogu , search-website-functions-v4/bulk-insertzastąp następujące zmienne własnymi wartościami, aby uwierzytelnić się przy użyciu zestawu SDK usługi Azure Search:

    • NAZWA ZASOBU WYSZUKIWANIA
    • TWÓJ-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. Otwórz zintegrowany terminal w programie Visual Studio dla podkatalogu katalogu projektu i uruchom następujące polecenie, search-website-functions-v4/bulk-insertaby zainstalować zależności.

    npm install 
    
  1. Kontynuuj korzystanie ze zintegrowanego terminalu w programie Visual Studio dla podkatalogu katalogu projektu, search-website-functions-v4/bulk-insert, aby uruchomić bulk_insert_books.js skrypt:

    npm start
    
  2. W miarę uruchamiania kodu w konsoli jest wyświetlany postęp.

  3. Po zakończeniu przekazywania ostatnia instrukcja wydrukowana w konsoli jest "zakończona".

Przeglądanie nowego indeksu wyszukiwania

Po zakończeniu przekazywania indeks wyszukiwania jest gotowy do użycia. Przejrzyj nowy indeks w witrynie Azure Portal.

  1. W witrynie Azure Portal znajdź usługę wyszukiwania utworzoną w poprzednim kroku.

  2. Po lewej stronie wybierz pozycję Indeksy, a następnie wybierz indeks good-books.

    Expandable screenshot of Azure portal showing the index.

  3. Domyślnie indeks zostanie otwarty na karcie Eksplorator wyszukiwania. Wybierz pozycję Wyszukaj , aby zwrócić dokumenty z indeksu.

    Expandable screenshot of Azure portal showing search results

Wycofywanie zmian pliku importu zbiorczego

Użyj następującego polecenia git w zintegrowanym terminalu programu Visual Studio Code w bulk-insert katalogu, aby wycofać zmiany. Nie są one potrzebne do kontynuowania samouczka i nie należy zapisywać ani wypychać tych wpisów tajnych do repozytorium.

git checkout .

Kopiowanie nazwy zasobu wyszukiwania

Zanotuj nazwę zasobu wyszukiwania. Będzie to konieczne, aby połączyć aplikację funkcji platformy Azure z zasobem wyszukiwania.

Uwaga

Chociaż możesz być kuszony, aby użyć klucza administratora wyszukiwania w funkcji platformy Azure, to nie jest zgodna z zasadą najniższych uprawnień. Funkcja platformy Azure użyje klucza zapytania w celu zachowania zgodności z najniższymi uprawnieniami.

Następne kroki

Wdrażanie statycznej aplikacji internetowej