Hızlı başlangıç: Jupyter not defterlerini kullanarak Python 'da Azure Bilişsel Arama dizini oluşturmaQuickstart: Create an Azure Cognitive Search index in Python using Jupyter notebooks

Python ve azure BILIŞSEL arama REST API 'lerinikullanarak bir Azure bilişsel arama dizini oluşturan, yükleyen ve sorgulayan bir Jupyter Not defteri oluşturun.Build a Jupyter notebook that creates, loads, and queries an Azure Cognitive Search index using Python and the Azure Cognitive Search REST APIs. Bu makalede, adım adım bir not defteri adım oluşturma açıklanır.This article explains how to build a notebook step by step. Alternatif olarak, tamamlanmış bir Jupyter Python Not defteri indirebilir ve çalıştırabilirsiniz.Alternatively, you can download and run a finished Jupyter Python notebook.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.If you don't have an Azure subscription, create a free account before you begin.

ÖnkoşullarPrerequisites

Bu hızlı başlangıç için aşağıdaki hizmetler ve araçlar gereklidir.The following services and tools are required for this quickstart.

Anahtar ve URL alGet a key and URL

REST çağrıları için her istekte hizmet URL'sinin ve bir erişim anahtarının iletilmesi gerekir.REST calls require the service URL and an access key on every request. 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:A search service is created with both, so if you added Azure Cognitive Search to your subscription, follow these steps to get the necessary information:

  1. Azure Portal oturum açınve arama hizmetine genel bakış sayfasında URL 'yi alın.Sign in to the Azure portal, and in your search service Overview page, get the URL. Örnek uç nokta https://mydemo.search.windows.net şeklinde görünebilir.An example endpoint might look like https://mydemo.search.windows.net.

  2. Ayarlar > anahtarlar' da, hizmette tam haklar için bir yönetici anahtarı alın.In Settings > Keys, get an admin key for full rights on the service. Üzerinde bir tane almanız gereken iş sürekliliği için iki adet değiştirilebilir yönetici anahtarı vardır.There are two interchangeable admin keys, provided for business continuity in case you need to roll one over. Nesneleri eklemek, değiştirmek ve silmek için isteklerde birincil veya ikincil anahtarı kullanabilirsiniz.You can use either the primary or secondary key on requests for adding, modifying, and deleting objects.

HTTP uç noktası ve erişim anahtarı alGet an HTTP endpoint and access key

Tüm istekler hizmetinize gönderilen her istekte bir API anahtarı gerektirir.All requests require an api-key on every request sent to your service. İ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.Having a valid key establishes trust, on a per request basis, between the application sending the request and the service that handles it.

Bu görevde, bir Jupyter Not defteri başlatın ve Azure Bilişsel Arama 'e bağlanabildiğinizi doğrulayın.In this task, start a Jupyter notebook and verify that you can connect to Azure Cognitive Search. Bunu, hizmetinizdeki dizinlerin bir listesini isteyerek gerçekleştirirsiniz.You'll do this by requesting a list of indexes from your service. Anaconda3 ile Windows 'da Anaconda gezginini kullanarak bir not defteri başlatabilirsiniz.On Windows with Anaconda3, you can use Anaconda Navigator to launch a notebook.

  1. Yeni bir Python3 Not defteri oluşturun.Create a new Python3 notebook.

  2. İlk hücrede, JSON ile çalışma için kullanılan kitaplıkları yükleyin ve HTTP isteklerini formüle göre düzenleyin.In the first cell, load the libraries used for working with JSON and formulating HTTP requests.

    import json
    import requests
    from pprint import pprint
    
  3. İkinci hücrede, her istekte sabitler olacak istek öğelerini girin.In the second cell, input the request elements that will be constants on every request. Arama hizmeti adı 'nı (-SEARCH-SERVICE-NAME) ve yönetici API anahtarınızı (-ADMIN-API-KEY) geçerli değerlerle değiştirin.Replace the search service name (YOUR-SEARCH-SERVICE-NAME) and admin API key (YOUR-ADMIN-API-KEY) with valid values.

    endpoint = 'https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net/'
    api_version = '?api-version=2019-05-06'
    headers = {'Content-Type': 'application/json',
            'api-key': '<YOUR-ADMIN-API-KEY>' }
    

    ConnectionError "Failed to establish a new connection"alırsanız, API anahtarının bir birincil veya ikincil yönetici anahtarı olduğunu ve tüm baştaki ve sondaki karakterlerin (? ve /) hazır olduğunu doğrulayın.If you get ConnectionError "Failed to establish a new connection", verify that the api-key is a primary or secondary admin key, and that all leading and trailing characters (? and /) are in place.

  4. Üçüncü hücrede, isteği formüle yazın.In the third cell, formulate the request. Bu GET isteği, arama hizmetinizin dizinler koleksiyonunu hedefler ve mevcut dizinlerin ad özelliğini seçer.This GET request targets the indexes collection of your search service and selects the name property of existing indexes.

    url = endpoint + "indexes" + api_version + "&$select=name"
    response  = requests.get(url, headers=headers)
    index_list = response.json()
    pprint(index_list)
    
  5. Her adımı çalıştırın.Run each step. Dizinler varsa, yanıt dizin adlarının bir listesini içerir.If indexes exist, the response contains a list of index names. Aşağıdaki ekran görüntüsünde, hizmette zaten bir azureblob-index ve reatastate-US-Sample dizini vardır.In the screenshot below, the service already has an azureblob-index and a realestate-us-sample index.

    Azure Bilişsel Arama HTTP istekleri içeren Jupyter not defterinde Python betiğiPython script in Jupyter notebook with HTTP requests to Azure Cognitive Search

    Buna karşılık, boş bir dizin koleksiyonu şu yanıtı döndürür: {'@odata.context': 'https://mydemo.search.windows.net/$metadata#indexes(name)', 'value': []}In contrast, an empty index collection returns this response: {'@odata.context': 'https://mydemo.search.windows.net/$metadata#indexes(name)', 'value': []}

1 - Dizin oluşturma1 - Create an index

Portalı kullanmıyorsanız, verileri yükleyebilmeniz için önce hizmette bir dizin bulunmalıdır.Unless you are using the portal, an index must exist on the service before you can load data. Bu adım, bir dizin şemasını hizmete göndermek için Create ındex REST API kullanır.This step uses the Create Index REST API to push an index schema to the service.

Bir dizinin gerekli öğeleri bir ad, alan koleksiyonu ve bir anahtar içerir.Required elements of an index include a name, a fields collection, and a key. Alanlar koleksiyonu bir belgeninyapısını tanımlar.The fields collection defines the structure of a document. 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).Each field has a name, type, and attributes that determine how the field is used (for example, whether it is full-text searchable, filterable, or retrievable in search results). Bir dizin içinde, Edm.String türündeki alanlardan biri belge kimliği için anahtar olarak atanmalıdır.Within an index, one of the fields of type Edm.String must be designated as the key for document identity.

Bu dizin "oteller-QuickStart" olarak adlandırılmıştır ve aşağıda gördüğünüz alan tanımlarına sahiptir.This index is named "hotels-quickstart" and has the field definitions you see below. Diğer izlenecek yollarda kullanılan daha büyük bir oteller dizininin bir alt kümesidir.It's a subset of a larger Hotels index used in other walkthroughs. Bu hızlı başlangıçta breçekimi için kırpıyoruz.We trimmed it in this quickstart for brevity.

  1. Sonraki hücrede, şemayı sağlamak için aşağıdaki örneği bir hücreye yapıştırın.In the next cell, paste the following example into a cell to provide the schema.

    index_schema = {
       "name": "hotels-quickstart",  
       "fields": [
         {"name": "HotelId", "type": "Edm.String", "key": "true", "filterable": "true"},
         {"name": "HotelName", "type": "Edm.String", "searchable": "true", "filterable": "false", "sortable": "true", "facetable": "false"},
         {"name": "Description", "type": "Edm.String", "searchable": "true", "filterable": "false", "sortable": "false", "facetable": "false", "analyzer": "en.lucene"},
         {"name": "Description_fr", "type": "Edm.String", "searchable": "true", "filterable": "false", "sortable": "false", "facetable": "false", "analyzer": "fr.lucene"},
         {"name": "Category", "type": "Edm.String", "searchable": "true", "filterable": "true", "sortable": "true", "facetable": "true"},
         {"name": "Tags", "type": "Collection(Edm.String)", "searchable": "true", "filterable": "true", "sortable": "false", "facetable": "true"},
         {"name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": "true", "sortable": "true", "facetable": "true"},
         {"name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "filterable": "true", "sortable": "true", "facetable": "true"},
         {"name": "Rating", "type": "Edm.Double", "filterable": "true", "sortable": "true", "facetable": "true"},
         {"name": "Address", "type": "Edm.ComplexType", 
         "fields": [
         {"name": "StreetAddress", "type": "Edm.String", "filterable": "false", "sortable": "false", "facetable": "false", "searchable": "true"},
         {"name": "City", "type": "Edm.String", "searchable": "true", "filterable": "true", "sortable": "true", "facetable": "true"},
         {"name": "StateProvince", "type": "Edm.String", "searchable": "true", "filterable": "true", "sortable": "true", "facetable": "true"},
         {"name": "PostalCode", "type": "Edm.String", "searchable": "true", "filterable": "true", "sortable": "true", "facetable": "true"},
         {"name": "Country", "type": "Edm.String", "searchable": "true", "filterable": "true", "sortable": "true", "facetable": "true"}
        ]
       }
      ]
    }
    
  2. Başka bir hücrede, isteği formüle yazın.In another cell, formulate the request. Bu PUT isteği, arama hizmetinizin dizinler toplamasını hedefler ve önceki hücrede belirttiğiniz dizin şemasını temel alan bir dizin oluşturur.This PUT request targets the indexes collection of your search service and creates an index based on the index schema you provided in the previous cell.

    url = endpoint + "indexes" + api_version
    response  = requests.post(url, headers=headers, json=index_schema)
    index = response.json()
    pprint(index)
    
  3. Her adımı çalıştırın.Run each step.

    Yanıt, şemanın JSON gösterimini içerir.The response includes the JSON representation of the schema. Aşağıdaki ekran görüntüsü yanıtın yalnızca bir kısmını gösteriyor.The following screenshot is showing just a portion of the response.

    Dizin oluşturma isteğiRequest to create an index

İpucu

Dizin oluşturmayı doğrulamak için bir diğer yol ise portaldaki dizinler listesini denetleydir.Another way to verify index creation is to check the Indexes list in the portal.

2-belge yükleme2 - Load documents

Belgeleri göndermek için, dizininizin URL uç noktasına bir HTTP POST isteği kullanın.To push documents, use an HTTP POST request to your index's URL endpoint. REST API belge ekleme, güncelleştirme veya silme.The REST API is Add, Update, or Delete Documents. Belgeler GitHub 'daki Hotelsdata 'dan geliyor.Documents originate from HotelsData on GitHub.

  1. Yeni bir hücrede, dizin şemasına uygun dört belge sağlayın.In a new cell, provide four documents that conform to the index schema. Her belge için bir karşıya yükleme eylemi belirtin.Specify an upload action for each document.

    documents = {
        "value": [
        {
        "@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.In another cell, formulate the request. Bu POST isteği, oteller-Hızlı Başlangıç dizininin docs koleksiyonunu hedefler ve önceki adımda belirtilen belgeleri gönderir.This POST request targets the docs collection of the hotels-quickstart index and pushes the documents provided in the previous step.

    url = endpoint + "indexes/hotels-quickstart/docs/index" + api_version
    response  = requests.post(url, headers=headers, json=documents)
    index_content = response.json()
    pprint(index_content)
    
  3. Belgeleri arama hizmetinizde bir dizine göndermek için her adımı çalıştırın.Run each step to push the documents to an index in your search service. Sonuçlar aşağıdaki örneğe benzer görünmelidir.Results should look similar to the following example.

    Bir dizine belge gönderSend documents to an index

3 - Dizin arama3 - Search an index

Bu adımda, arama belgelerinikullanarak bir dizinin nasıl sorgulankullanılacağı gösterilmektedir REST API.This step shows you how to query an index using the Search Documents REST API.

  1. Bir hücrede, boş bir aramayı yürüten bir sorgu ifadesi sağlayın (Search = *), düzensiz bir liste (arama puanı = 1,0) döndürür.In a cell, provide a query expression that executes an empty search (search=*), returning an unranked list (search score = 1.0) of arbitrary documents. Azure Bilişsel Arama, varsayılan olarak her seferinde 50 eşleşme döndürür.By default, Azure Cognitive Search returns 50 matches at a time. Yapılandırılmış olarak, bu sorgu tüm belge yapısını ve değerlerini döndürür.As structured, this query returns an entire document structure and values. Sonuçlarda tüm belgelerin sayısını almak için $count = true ekleyin.Add $count=true to get a count of all documents in the results.

    searchstring = '&search=*&$count=true'
    
  2. Yeni bir hücrede, "oteller" ve "WiFi" terimlerinde arama yapmak için aşağıdaki örneği sağlayın.In a new cell, provide the following example to search on the terms "hotels" and "wifi". Arama sonuçlarına hangi alanların ekleneceğini belirlemek için $select ekleyin.Add $select to specify which fields to include in the search results.

    searchstring = '&search=hotels wifi&$count=true&$select=HotelId,HotelName'
    
  3. Başka bir hücrede, bir isteği formüle koyun.In another cell, formulate a request. Bu GET isteği, oteller-Hızlı Başlangıç dizininin docs koleksiyonunu hedefler ve önceki adımda belirttiğiniz sorguyu iliştirir.This GET request targets the docs collection of the hotels-quickstart index, and attaches the query you specified in the previous step.

    url = endpoint + "indexes/hotels-quickstart/docs" + api_version + searchstring
    response  = requests.get(url, headers=headers, json=searchstring)
    query = response.json()
    pprint(query)
    
  4. Her adımı çalıştırın.Run each step. Sonuçlar aşağıdaki çıktıya benzer görünmelidir.Results should look similar to the following output.

    Dizin aramaSearch an index

  5. Söz dizimi için bir fikir almak üzere birkaç başka sorgu örneği deneyin.Try a few other query examples to get a feel for the syntax. searchstring aşağıdaki örneklerle değiştirip arama isteğini yeniden çalıştırabilirsiniz.You can replace the searchstring with the following examples and then rerun the search request.

    Filtre Uygula:Apply a filter:

    searchstring = '&search=*&$filter=Rating gt 4&$select=HotelId,HotelName,Description,Rating'
    

    En üstteki iki sonuç alın:Take the top two results:

    searchstring = '&search=boutique&$top=2&$select=HotelId,HotelName,Description,Category'
    

    Belirli bir alana göre sırala:Order by a specific field:

    searchstring = '&search=pool&$orderby=Address/City&$select=HotelId, HotelName, Address/City, Address/StateProvince, Tags'
    

TemizlemeClean up

Kendi aboneliğinizde çalışırken, sizin oluşturduğunuz kaynaklara hala ihtiyacınız olup olmadığını belirlemek için bir projenin sonunda iyi bir fikir olur.When you're working in your own subscription, it's a good idea at the end of a project to identify whether you still need the resources you created. Çalışan kaynaklar sizin için ücret verebilir.Resources left running can cost you money. Kaynakları tek tek silebilir veya kaynak grubunu silerek tüm kaynak kümesini silebilirsiniz.You can delete resources individually or delete the resource group to delete the entire set of resources.

Sol gezinti bölmesindeki tüm kaynaklar veya kaynak grupları bağlantısını kullanarak portalda kaynakları bulabilir ve yönetebilirsiniz.You can find and manage resources in the portal, using the All resources or Resource groups link in the left-navigation pane.

Ücretsiz bir hizmet kullanıyorsanız, üç Dizin, Dizin Oluşturucu ve veri kaynağı ile sınırlı olduğunu unutmayın.If you are using a free service, remember that you are limited to three indexes, indexers, and data sources. Sınırın altında kalmak için portalda ayrı ayrı öğeleri silebilirsiniz.You can delete individual items in the portal to stay under the limit.

Sonraki adımlarNext steps

Basitleştirme olarak, bu hızlı başlangıç, oteller dizininin kısaltılmış bir sürümünü kullanır.As a simplification, this quickstart uses an abbreviated version of the Hotels index. Daha ilginç sorgular denemek için tam sürümü oluşturabilirsiniz.You can create the full version to try out more interesting queries. Tam sürümü ve tüm 50 belgelerini almak için, yerleşik örnek veri kaynaklarından oteller-Sample ' ı seçerek veri alma Sihirbazı 'nı çalıştırın.To get the full version and all 50 documents, run the Import data wizard, selecting hotels-sample from the built-in sample data sources.