Udostępnij za pośrednictwem


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

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 Python przy użyciu przykładowego skryptu 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 używa zestawu Azure SDK dla usługi Azure AI Search:

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

    • TWOJA-SEARCH-SERVICE-NAME
    • YOUR-SEARCH-SERVICE-ADMIN-API-KEY
    import sys
    import json
    import requests
    import pandas as pd
    from azure.core.credentials import AzureKeyCredential
    from azure.search.documents import SearchClient
    from azure.search.documents.indexes import SearchIndexClient
    from azure.search.documents.indexes.models import SearchIndex
    from azure.search.documents.indexes.models import (
        ComplexField,
        CorsOptions,
        SearchIndex,
        ScoringProfile,
        SearchFieldDataType,
        SimpleField,
        SearchableField,
    )
    
    # Get the service name (short name) and admin API key from the environment
    service_name = "YOUR-SEARCH-SERVICE-NAME"
    key = "YOUR-SEARCH-SERVICE-ADMIN-API-KEY"
    endpoint = "https://{}.search.windows.net/".format(service_name)
    
    # Give your index a name
    # You can also supply this at runtime in __main__
    index_name = "good-books"
    
    # Search Index Schema definition
    index_schema = "./good-books-index.json"
    
    # Books catalog
    books_url = "https://raw.githubusercontent.com/Azure-Samples/azure-search-sample-data/main/good-books/books.csv"
    batch_size = 1000
    
    # Instantiate a client
    class CreateClient(object):
        def __init__(self, endpoint, key, index_name):
            self.endpoint = endpoint
            self.index_name = index_name
            self.key = key
            self.credentials = AzureKeyCredential(key)
    
        # Create a SearchClient
        # Use this to upload docs to the Index
        def create_search_client(self):
            return SearchClient(
                endpoint=self.endpoint,
                index_name=self.index_name,
                credential=self.credentials,
            )
    
        # Create a SearchIndexClient
        # This is used to create, manage, and delete an index
        def create_admin_client(self):
            return SearchIndexClient(endpoint=endpoint, credential=self.credentials)
    
    
    # Get Schema from File or URL
    def get_schema_data(schema, url=False):
        if not url:
            with open(schema) as json_file:
                schema_data = json.load(json_file)
                return schema_data
        else:
            data_from_url = requests.get(schema)
            schema_data = json.loads(data_from_url.content)
            return schema_data
    
    
    # Create Search Index from the schema
    # If reading the schema from a URL, set url=True
    def create_schema_from_json_and_upload(schema, index_name, admin_client, url=False):
    
        cors_options = CorsOptions(allowed_origins=["*"], max_age_in_seconds=60)
        scoring_profiles = []
        schema_data = get_schema_data(schema, url)
    
        index = SearchIndex(
            name=index_name,
            fields=schema_data["fields"],
            scoring_profiles=scoring_profiles,
            suggesters=schema_data["suggesters"],
            cors_options=cors_options,
        )
    
        try:
            upload_schema = admin_client.create_index(index)
            if upload_schema:
                print(f"Schema uploaded; Index created for {index_name}.")
            else:
                exit(0)
        except:
            print("Unexpected error:", sys.exc_info()[0])
    
    
    # Convert CSV data to JSON
    def convert_csv_to_json(url):
        df = pd.read_csv(url)
        convert = df.to_json(orient="records")
        return json.loads(convert)
    
    
    # Batch your uploads to Azure Search
    def batch_upload_json_data_to_index(json_file, client):
        batch_array = []
        count = 0
        batch_counter = 0
        for i in json_file:
            count += 1
            batch_array.append(
                {
                    "id": str(i["book_id"]),
                    "goodreads_book_id": int(i["goodreads_book_id"]),
                    "best_book_id": int(i["best_book_id"]),
                    "work_id": int(i["work_id"]),
                    "books_count": i["books_count"] if i["books_count"] else 0,
                    "isbn": str(i["isbn"]),
                    "isbn13": str(i["isbn13"]),
                    "authors": i["authors"].split(",") if i["authors"] else None,
                    "original_publication_year": int(i["original_publication_year"])
                    if i["original_publication_year"]
                    else 0,
                    "original_title": i["original_title"],
                    "title": i["title"],
                    "language_code": i["language_code"],
                    "average_rating": int(i["average_rating"])
                    if i["average_rating"]
                    else 0,
                    "ratings_count": int(i["ratings_count"]) if i["ratings_count"] else 0,
                    "work_ratings_count": int(i["work_ratings_count"])
                    if i["work_ratings_count"]
                    else 0,
                    "work_text_reviews_count": i["work_text_reviews_count"]
                    if i["work_text_reviews_count"]
                    else 0,
                    "ratings_1": int(i["ratings_1"]) if i["ratings_1"] else 0,
                    "ratings_2": int(i["ratings_2"]) if i["ratings_2"] else 0,
                    "ratings_3": int(i["ratings_3"]) if i["ratings_3"] else 0,
                    "ratings_4": int(i["ratings_4"]) if i["ratings_4"] else 0,
                    "ratings_5": int(i["ratings_5"]) if i["ratings_5"] else 0,
                    "image_url": i["image_url"],
                    "small_image_url": i["small_image_url"],
                }
            )
    
            # In this sample, we limit batches to 1000 records.
            # When the counter hits a number divisible by 1000, the batch is sent.
            if count % batch_size == 0:
                client.upload_documents(documents=batch_array)
                batch_counter += 1
                print(f"Batch sent! - #{batch_counter}")
                batch_array = []
    
        # This will catch any records left over, when not divisible by 1000
        if len(batch_array) > 0:
            client.upload_documents(documents=batch_array)
            batch_counter += 1
            print(f"Final batch sent! - #{batch_counter}")
    
        print("Done!")
    
    
    if __name__ == "__main__":
        start_client = CreateClient(endpoint, key, index_name)
        admin_client = start_client.create_admin_client()
        search_client = start_client.create_search_client()
        schema = create_schema_from_json_and_upload(
            index_schema, index_name, admin_client, url=False
        )
        books_data = convert_csv_to_json(books_url)
        batch_upload = batch_upload_json_data_to_index(books_data, search_client)
        print("Upload complete")
    
  2. Otwórz zintegrowany terminal w programie Visual Studio dla podkatalogu katalogu projektu i uruchom następujące polecenie, search-website-functions-v4/bulk-uploadaby zainstalować zależności.

    python3 -m pip install -r requirements.txt 
    
  1. Kontynuuj korzystanie ze zintegrowanego terminalu w programie Visual Studio dla podkatalogu katalogu projektu , search-website-functions-v4/bulk-uploadaby uruchomić następujące polecenie powłoki bash w celu uruchomienia skryptu bulk_upload.py :

    python3 bulk-upload.py
    
  2. W miarę uruchamiania kodu w konsoli jest wyświetlany postęp.

  3. Po zakończeniu przekazywania ostatnia instrukcja wydrukowana w konsoli to "Gotowe! Przekazywanie ukończone".

Przejrzyj nowy indeks 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