Hızlı başlangıç: Jupyter Notebook kullanarak Python 'da Azure Bilişsel Arama dizini oluşturma

Python ile Azure Bilişsel Arama dizini oluşturan, yükleyen ve sorgulayan bir not defteri oluşturun ve Python için Azure SDK 'daki Azure-Search-Belgeler kitaplığını kullanın. Bu makalede, adım adım bir not defteri adım oluşturma açıklanır. Alternatif olarak, tamamlanmış bir Jupyter Python Not defteri indirebilir ve çalıştırabilirsiniz.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Önkoşullar

Bu hızlı başlangıç için aşağıdaki hizmetler ve araçlar gereklidir.

Anahtar ve URL 'YI kopyalama

REST çağrıları için her istekte hizmet URL'sinin ve bir erişim anahtarının iletilmesi gerekir. Her ikisiyle de bir arama hizmeti oluşturulur. bu nedenle, aboneliğinize Azure Bilişsel Arama eklediyseniz, gerekli bilgileri almak için aşağıdaki adımları izleyin:

  1. Azure Portal oturum açınve arama hizmetine genel bakış sayfasında URL 'yi alın. Örnek uç nokta https://mydemo.search.windows.net şeklinde görünebilir.

  2. Ayarlaranahtarlar' da, hizmette tam haklar için bir yönetici anahtarı alın. Üzerinde bir tane almanız gereken iş sürekliliği için iki adet değiştirilebilir yönetici anahtarı vardır. Nesneleri eklemek, değiştirmek ve silmek için isteklerde birincil veya ikincil anahtarı kullanabilirsiniz.

    Get an HTTP endpoint and access keyHTTP uç noktası

Tüm istekler hizmetinize gönderilen her istekte bir API anahtarı gerektirir. İstek başına geçerli bir anahtara sahip olmak, isteği gönderen uygulama ve bunu işleyen hizmet arasında güven oluşturur.

Bu görevde Jupyter Notebook başlatın ve Azure Bilişsel Arama bağlanabildiğinizi doğrulayın. Bunu, hizmetinizdeki dizinlerin bir listesini isteyerek gerçekleştirirsiniz. Anaconda3 ile Windows ' de, anaconda gezginini kullanarak bir not defteri başlatabilirsiniz.

  1. Yeni bir Python3 Not defteri oluşturun.

  2. İlk hücrede, Azure Arama belgeleride dahil olmak üzere Python IÇIN Azure SDK 'dan kitaplıkları yükleyin.

     !pip install azure-search-documents --pre
     !pip show azure-search-documents
    
     import os
     from azure.core.credentials import AzureKeyCredential
     from azure.search.documents.indexes import SearchIndexClient 
     from azure.search.documents import SearchClient
     from azure.search.documents.indexes.models import (
         ComplexField,
         CorsOptions,
         SearchIndex,
         ScoringProfile,
         SearchFieldDataType,
         SimpleField,
         SearchableField
     )
    
  3. İkinci hücrede, her istekte sabitler olacak istek öğelerini girin. Önceki bir adımda kopyaladığınız arama hizmeti adınızı, yönetici API anahtarınızı ve sorgu API anahtarınızı girin. Bu hücre Ayrıca belirli işlemler için kullanacağınız istemcileri ayarlar: bir dizin oluşturmak için Searchındexclient ve bir dizini sorgulamak Için searchclient .

     service_name = "YOUR-SEARCH-SERIVCE-NAME"
     admin_key = "YOUR-SEARCH-SERVICE-ADMIN-API-KEY"
    
     index_name = "hotels-quickstart"
    
     # Create an SDK client
     endpoint = "https://{}.search.windows.net/".format(service_name)
     admin_client = SearchIndexClient(endpoint=endpoint,
                           index_name=index_name,
                           credential=AzureKeyCredential(admin_key))
    
     search_client = SearchClient(endpoint=endpoint,
                           index_name=index_name,
                           credential=AzureKeyCredential(admin_key))
    
  4. Üçüncü hücrede, mevcut oteller-hızlı başlangıç dizinlerinin hizmetinizi temizlemek için bir delete_index işlemi çalıştırın. Dizinin silinmesi, aynı ada sahip başka bir oteller-hızlı başlangıç dizini oluşturmanıza olanak sağlar.

     try:
         result = admin_client.delete_index(index_name)
         print ('Index', index_name, 'Deleted')
     except Exception as ex:
         print (ex)
    
  5. Her adımı çalıştırın.

1 - Dizin oluşturma

Bir dizinin gerekli öğeleri bir ad, alan koleksiyonu ve bir anahtar içerir. Alanlar koleksiyonu, hem yükleme verileri hem de sonuçlar döndürme için kullanılan bir mantıksal arama belgesininyapısını tanımlar.

Her alan, alanın nasıl kullanıldığını tanımlayan bir ad, tür ve özniteliklere sahiptir (örneğin, tam metin aranabilir, filtrelenebilir veya arama sonuçlarında alınabilir mi olduğunu belirtir). Bir dizin içinde, türündeki alanlardan biri Edm.String belge kimliği için Edm.String olarak atanmalıdır.

Bu dizin "oteller-QuickStart" olarak adlandırılmıştır ve aşağıda gördüğünüz alan tanımlarına sahiptir. Diğer izlenecek yollarda kullanılan daha büyük bir oteller dizininin bir alt kümesidir. Bu hızlı başlangıçta breçekimi için kırpıyoruz.

  1. Sonraki hücrede, şemayı sağlamak için aşağıdaki örneği bir hücreye yapıştırın.

    # Specify the index schema
    name = index_name
    fields = [
            SimpleField(name="HotelId", type=SearchFieldDataType.String, key=True),
            SearchableField(name="HotelName", type=SearchFieldDataType.String, sortable=True),
            SearchableField(name="Description", type=SearchFieldDataType.String, analyzer_name="en.lucene"),
            SearchableField(name="Description_fr", type=SearchFieldDataType.String, analyzer_name="fr.lucene"),
            SearchableField(name="Category", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
    
            SearchableField(name="Tags", collection=True, type=SearchFieldDataType.String, facetable=True, filterable=True),
    
            SimpleField(name="ParkingIncluded", type=SearchFieldDataType.Boolean, facetable=True, filterable=True, sortable=True),
            SimpleField(name="LastRenovationDate", type=SearchFieldDataType.DateTimeOffset, facetable=True, filterable=True, sortable=True),
            SimpleField(name="Rating", type=SearchFieldDataType.Double, facetable=True, filterable=True, sortable=True),
    
            ComplexField(name="Address", fields=[
                SearchableField(name="StreetAddress", type=SearchFieldDataType.String),
                SearchableField(name="City", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
                SearchableField(name="StateProvince", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
                SearchableField(name="PostalCode", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
                SearchableField(name="Country", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
            ])
        ]
    cors_options = CorsOptions(allowed_origins=["*"], max_age_in_seconds=60)
    scoring_profiles = []
    suggester = [{'name': 'sg', 'source_fields': ['Tags', 'Address/City', 'Address/Country']}]
    
  2. Başka bir hücrede, isteği formüle yazın. Bu create_index isteği, arama hizmetinizin dizinler koleksiyonunu hedefler ve önceki hücrede belirttiğiniz dizin şemasını temel alan bir Searchındex oluşturur.

    index = SearchIndex(
        name=name,
        fields=fields,
        scoring_profiles=scoring_profiles,
        suggesters = suggester,
        cors_options=cors_options)
    
    try:
        result = admin_client.create_index(index)
        print ('Index', result.name, 'created')
    except Exception as ex:
        print (ex)
    
  3. Her adımı çalıştırın.

2-belge yükleme

Belge yüklemek için, işlem türü için bir Dizin eylemi kullanarak bir belge koleksiyonu oluşturun (karşıya yükleme, birleştirme ve karşıya yükleme, vb.). Belgeler GitHub bağlı olan barındırma verilerinden kaynaklardır .

  1. Yeni bir hücrede, dizin şemasına uygun dört belge sağlayın. Her belge için bir karşıya yükleme eylemi belirtin.

    documents = [
        {
        "@search.action": "upload",
        "HotelId": "1",
        "HotelName": "Secret Point Motel",
        "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
        "Description_fr": "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.",
        "Category": "Boutique",
        "Tags": [ "pool", "air conditioning", "concierge" ],
        "ParkingIncluded": "false",
        "LastRenovationDate": "1970-01-18T00:00:00Z",
        "Rating": 3.60,
        "Address": {
            "StreetAddress": "677 5th Ave",
            "City": "New York",
            "StateProvince": "NY",
            "PostalCode": "10022",
            "Country": "USA"
            }
        },
        {
        "@search.action": "upload",
        "HotelId": "2",
        "HotelName": "Twin Dome Motel",
        "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
        "Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
        "Category": "Boutique",
        "Tags": [ "pool", "free wifi", "concierge" ],
        "ParkingIncluded": "false",
        "LastRenovationDate": "1979-02-18T00:00:00Z",
        "Rating": 3.60,
        "Address": {
            "StreetAddress": "140 University Town Center Dr",
            "City": "Sarasota",
            "StateProvince": "FL",
            "PostalCode": "34243",
            "Country": "USA"
            }
        },
        {
        "@search.action": "upload",
        "HotelId": "3",
        "HotelName": "Triple Landscape Hotel",
        "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services.",
        "Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
        "Category": "Resort and Spa",
        "Tags": [ "air conditioning", "bar", "continental breakfast" ],
        "ParkingIncluded": "true",
        "LastRenovationDate": "2015-09-20T00:00:00Z",
        "Rating": 4.80,
        "Address": {
            "StreetAddress": "3393 Peachtree Rd",
            "City": "Atlanta",
            "StateProvince": "GA",
            "PostalCode": "30326",
            "Country": "USA"
            }
        },
        {
        "@search.action": "upload",
        "HotelId": "4",
        "HotelName": "Sublime Cliff Hotel",
        "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace.",
        "Description_fr": "Le sublime Cliff Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Cliff fait partie d'un Palace 1800 restauré avec amour.",
        "Category": "Boutique",
        "Tags": [ "concierge", "view", "24-hour front desk service" ],
        "ParkingIncluded": "true",
        "LastRenovationDate": "1960-02-06T00:00:00Z",
        "Rating": 4.60,
        "Address": {
            "StreetAddress": "7400 San Pedro Ave",
            "City": "San Antonio",
            "StateProvince": "TX",
            "PostalCode": "78216",
            "Country": "USA"
            }
        }
    ]
    
  2. Başka bir hücrede, isteği formüle yazın. Bu upload_documents isteği, oteller-Hızlı Başlangıç dizininin docs koleksiyonunu hedefler ve önceki adımda belirtilen belgeleri Bilişsel Arama dizinine iter.

    try:
        result = search_client.upload_documents(documents=documents)
        print("Upload of new document succeeded: {}".format(result[0].succeeded))
    except Exception as ex:
        print (ex.message)
    
  3. Belgeleri arama hizmetinizde bir dizine göndermek için her adımı çalıştırın.

3 - Dizin arama

Bu adım, Search. Client sınıfınınSearch metodunu kullanarak bir dizinin nasıl sorgulanalınacağını gösterir.

  1. Aşağıdaki adım, bir boş arama ( search=* ) yürüterek rastgele belgelerin derecelendirildi bir liste (arama puanı = 1,0) döndürüyor. Hiçbir ölçüt olmadığından, tüm belgeler sonuçlara dahildir. Bu sorgu her belgedeki alanların yalnızca ikisini yazdırır. Ayrıca include_total_count=True , sonuçlarda tüm belgelerin (4) sayısını almak için de ekler.

    results =  search_client.search(search_text="*", include_total_count=True)
    
    print ('Total Documents Matching Query:', results.get_count())
    for result in results:
        print("{}: {}".format(result["HotelId"], result["HotelName"]))
    
  2. Sonraki sorgu, arama ifadesine ("WiFi") tüm terimleri ekler. Bu sorgu, sonuçların yalnızca deyimdeki alanları içerdiğini belirtir select . Geri gelen alanları sınırlamak, kablo üzerinden geri gönderilen veri miktarını en aza indirir ve arama gecikmesini azaltır.

    results =  search_client.search(search_text="wifi", include_total_count=True, select='HotelId,HotelName,Tags')
    
    print ('Total Documents Matching Query:', results.get_count())
    for result in results:
        print("{}: {}: {}".format(result["HotelId"], result["HotelName"], result["Tags"]))
    
  3. Ardından, bir filtre ifadesi uygulayarak yalnızca 4 ' ten büyük bir derecelendirme olan oteller azalan düzende sıralanır.

    results =  search_client.search(search_text="hotels", select='HotelId,HotelName,Rating', filter='Rating gt 4', order_by='Rating desc')
    
    for result in results:
        print("{}: {} - {} rating".format(result["HotelId"], result["HotelName"], result["Rating"]))
    
  4. search_fieldsTek bir alanla eşleşen kapsam sorgusuna ekleyin.

    results =  search_client.search(search_text="sublime", search_fields='HotelName', select='HotelId,HotelName')
    
    for result in results:
        print("{}: {}".format(result["HotelId"], result["HotelName"]))
    
  5. Modeller, model gezinti yapısını oluşturmak için kullanılabilecek etiketlerdir. Bu sorgu, kategori için modelleri ve sayıları döndürür.

    results =  search_client.search(search_text="*", facets=["Category"])
    
    facets = results.get_facets()
    
    for facet in facets["Category"]:
        print("    {}".format(facet))
    
  6. Bu örnekte, belirli bir belgeyi anahtarını temel alarak arayabilirsiniz. Genellikle bir Kullanıcı arama sonucunda bir belgeyi tıklattığında bir belge döndürmek istersiniz.

    result = search_client.get_document(key="3")
    
    print("Details for hotel '3' are:")
    print("Name: {}".format(result["HotelName"]))
    print("Rating: {}".format(result["Rating"]))
    print("Category: {}".format(result["Category"]))
    
  7. Bu örnekte, AutoComplete işlevini kullanacağız. Bu, genellikle arama kutusuna kullanıcı yazarken olası eşleşmelerin otomatik olarak tamamlanmasını sağlamak için bir arama kutusunda kullanılır.

    Dizin oluşturulduğunda, isteğin bir parçası olarak "SG" adlı bir öneri aracı de oluşturulmuştur. Öneri aracı tanımı, öneri aracı istekleriyle olabilecek olası eşleşmeleri bulmak için hangi alanların kullanılabileceğini belirtir. Bu örnekte, bu alanlar ' Etiketler ', ' Adres/Şehir ', ' adres/ülke '. Otomatik tamamlamayı benzetmek için, "sa" harflerini kısmi bir dize olarak geçirin. Searchclient 'ın AutoComplete yöntemi, geri dönüş olasılığı ile eşleşen geri gönderilir.

    search_suggestion = 'sa'
    results = search_client.autocomplete(search_text=search_suggestion, suggester_name="sg", mode='twoTerms')
    
    print("Autocomplete for:", search_suggestion)
    for result in results:
        print (result['text'])
    

Temizleme

Kendi aboneliğinizde çalışırken, projenin sonunda oluşturduğunuz kaynaklara hala ihtiyacınız olup olmadığını belirlemek iyi bir fikirdir. Çalışır durumda bırakılan kaynaklar maliyetlerin artmasına neden olabilir. Kaynakları teker teker silebilir veya tüm kaynak grubunu silerek kaynak kümesinin tamamını kaldırabilirsiniz.

Sol gezinti bölmesindeki tüm kaynaklar veya kaynak grupları bağlantısını kullanarak portalda kaynakları bulabilir ve yönetebilirsiniz.

Ücretsiz bir hizmet kullanıyorsanız, üç Dizin, Dizin Oluşturucu ve veri kaynağı ile sınırlı olduğunu unutmayın. Sınırın altında kalmak için portalda ayrı ayrı öğeleri silebilirsiniz.

Sonraki adımlar

Bu JavaScript hızlı başlangıçta, dizin oluşturmak, belgeler ile yüklemek ve sorguları çalıştırmak için bir dizi görev üzerinden çalıştık. Öğrenmeye devam etmek için aşağıdaki öğreticiyi deneyin.