Aracılığıyla paylaş


2 - Python ile Arama Dizini oluşturma ve yükleme

Şu adımları izleyerek arama özellikli web sitenizi oluşturmaya devam edin:

Azure AI Search kaynağı oluşturma

Azure CLI veya Azure PowerShell kullanarak komut satırından yeni bir arama kaynağı oluşturun. Ayrıca dizine okuma erişimi için kullanılan bir sorgu anahtarı alırsınız ve nesneleri eklemek için kullanılan yerleşik yönetici anahtarını alırsınız.

Cihazınızda Azure CLI veya Azure PowerShell yüklü olmalıdır. Cihazınızda yerel yönetici değilseniz Azure PowerShell'i seçin ve geçerli kullanıcı olarak çalıştırmak için parametresini kullanın Scope .

Dekont

Bu görev, Azure CLI ve Azure PowerShell için Visual Studio Code uzantıları gerektirmez. Visual Studio Code, uzantılar olmadan komut satırı araçlarını tanır.

  1. Visual Studio Code'da, Terminal'in altında Yeni Terminal'i seçin.

  2. Azure'a Bağlan:

    az login
    
  3. Yeni bir arama hizmeti oluşturmadan önce aboneliğiniz için mevcut hizmetleri listeleyin:

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

    Kullanmak istediğiniz bir hizmetiniz varsa, adı not edin ve sonraki bölüme geçin.

  4. Yeni bir arama hizmeti oluşturun. Kaynak grubu, hizmet adı, katman, bölge, bölümler ve çoğaltmalar için geçerli değerlerin yerine şablon olarak aşağıdaki komutu kullanın. Aşağıdaki deyim, önceki bir adımda oluşturulan "cognitive-search-demo-rg" kaynak grubunu kullanır ve "ücretsiz" katmanını belirtir. Azure aboneliğinizde zaten ücretsiz bir arama hizmeti varsa bunun yerine "temel" gibi faturalanabilir bir katman belirtin.

    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. Arama hizmetine okuma erişimi veren bir sorgu anahtarı alın. İki yönetici anahtarı ve bir sorgu anahtarı ile bir arama hizmeti sağlanır. Kaynak grubu ve arama hizmeti için geçerli adları kullanın. Sonraki bir adımda istemci koduna yapıştırabilmek için sorgu anahtarını Not Defteri kopyalayın:

    az search query-key list --resource-group cognitive-search-demo-rg --service-name my-cog-search-demo-svc
    
  6. Bir arama hizmeti yöneticisi API anahtarı alın. Yönetici API anahtarı, arama hizmetine yazma erişimi sağlar. Dizin oluşturan ve yükleyen toplu içeri aktarma adımında kullanabilmek için yönetici anahtarlarından birini Not Defteri kopyalayın:

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

Betik, Azure AI Search için Azure SDK'sını kullanır:

  1. Visual Studio Code'da dosyasını alt dizininde açın bulk_upload.py ve search-website-functions-v4/bulk-uploadAzure Search SDK'sı ile kimlik doğrulaması yapmak için aşağıdaki değişkenleri kendi değerlerinizle değiştirin:

    • ARAMA HIZMETI-ADıNıZ
    • ARAMA-HIZMETI-YÖNETICI-API-ANAHTARıNıZ
    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. Proje dizininin alt dizini search-website-functions-v4/bulk-uploadiçin Visual Studio'da tümleşik bir terminal açın ve bağımlılıkları yüklemek için aşağıdaki komutu çalıştırın.

    python3 -m pip install -r requirements.txt 
    
  1. Aşağıdaki bash komutunu çalıştırarak betiği çalıştırmak üzere proje dizininin alt dizini search-website-functions-v4/bulk-uploadolan için Visual Studio'daki tümleşik terminali bulk_upload.py kullanmaya devam edin:

    python3 bulk-upload.py
    
  2. Kod çalışırken konsol ilerleme durumunu görüntüler.

  3. Karşıya yükleme tamamlandığında konsola yazdırılan son deyim "Bitti! Karşıya yükleme tamamlandı".

Yeni Arama Dizinini gözden geçirme

Karşıya yükleme tamamlandıktan sonra arama dizini kullanıma hazır olur. Azure portalında yeni dizininizi gözden geçirin.

  1. Azure portalında, önceki adımda oluşturduğunuz arama hizmetini bulun.

  2. Sol tarafta Dizinler'i ve ardından good-books dizinini seçin.

    Expandable screenshot of Azure portal showing the index.

  3. Varsayılan olarak, dizin Arama gezgini sekmesinde açılır. Dizinden belge döndürmek için Ara'yı seçin.

    Expandable screenshot of Azure portal showing search results

Toplu içeri aktarma dosyası değişikliklerini geri alma

Değişiklikleri geri almak için dizindeki Visual Studio Code tümleşik terminalinde bulk-insert aşağıdaki git komutunu kullanın. Öğreticiye devam etmek için gerekli değildir ve bu gizli dizileri deponuza kaydetmemeniz veya göndermemeniz gerekir.

git checkout .

Arama kaynağı adınızı kopyalayın

Arama kaynağı adınızı not edin. Azure İşlevi uygulamasını arama kaynağınıza bağlamak için buna ihtiyacınız olacaktır.

Dikkat

Azure İşlevi'nde arama yöneticisi anahtarınızı kullanmak isteyebilirsiniz ancak bu, en düşük ayrıcalık ilkesine uymaz. Azure İşlevi, sorgu anahtarını kullanarak en az ayrıcalığı kullanır.

Sonraki adımlar

Statik Web Uygulamanızı dağıtma