Hızlı Başlangıç: Azure.Search.Documents istemci kitaplığını kullanarak arama dizini oluşturma

Yeni Azure.Search.Documents (sürüm 11) istemci kitaplığını kullanarak C# içinde arama dizini oluşturan, yüken ve sorgular oluşturan bir .NET Core konsol uygulaması oluşturun.

Bitmiş bir projeyle başlamak için kaynak kodu indirebilir veya kendi projenizi oluşturmak için bu makaledeki adımları takip edin.

Not

Önceki bir sürümü mü arıyorsunuz? Bunun yerine bkz. Microsoft.Azure.Search v10 kullanarak arama dizini oluşturma.

Önkoşullar

Başlamadan önce aşağıdaki araçlara ve hizmetlere sahipsiniz:

Projenizi ayarlarken Azure.Search.Documents NuGet indirirsiniz.

.NET için Azure SDK, .NET Standard 2.0ile uyumlu olur; bu da en düşük gereksinimler .NET Framework 4.6.1 ve .NET Core 2.0 olduğu anlamına gelir.

Projenizi ayarlama

Hizmet bağlantı bilgilerini derle ve ardından Visual Studio .NET Core üzerinde çalıştıracak yeni bir Konsol Uygulaması projesi oluşturmak için bu projeyi başlatın.

Anahtar ve uç nokta kopyalama

Hizmete yapılan çağrılar için her istekte BIR URL uç noktası ve erişim anahtarı gerekir. İlk adım olarak, projenize eklemek istediğiniz API anahtarını ve URL'yi bulun. İstemciyi sonraki bir adımda oluştururken her iki değeri de belirtebilirsiniz.

  1. Azure portaloturum Azure portal hizmeti genel bakış sayfasında URL'yi elde edin. Örnek uç nokta https://mydemo.search.windows.net şeklinde görünebilir.

  2. Anahtar Ayarlar'içinde, nesne oluşturuyor veya sildiyseniz, hizmette tam haklar için bir yönetici anahtarı elde edin. İki birbirinin yerine geçen birincil ve ikincil anahtar vardır. Bunlardan birini kullanabilirsiniz.

    HTTP uç noktası ve erişim anahtarı alHTTP uç noktası ve erişim anahtarı

Tüm istekler, hizmetinize gönderilen her istek için 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.

NuGet yükleme

Proje oluşturulduktan sonra istemci kitaplığını ekleyin. Azure.Search.Documents paketi, .NET'te bir arama hizmetiyle çalışmak için kullanılan tüm API'leri sağlayan bir istemci kitaplığından oluşur.

  1. Bir Visual Studio başlatın ve bir .NET Core konsol uygulaması oluşturun.

  2. Araçlar NuGet Paket Yöneticisi'içinde Çözüm için NuGet Paketleri Yönet... seçeneğini seçin.

  3. Gözat’a tıklayın.

  4. Sürüm Azure.Search.Documents 11.0 veya sonraki bir sürümü arayın ve seçin.

  5. Derlemeyi projenize ve çözümünüze eklemek için sağdan Yükle'ye tıklayın.

Arama istemcisi oluşturma

  1. Program.cs içinde,ad alanını olarak değiştirin ve ardından aşağıdaki using yönergeleri ekleyin.

    using Azure;
    using Azure.Search.Documents;
    using Azure.Search.Documents.Indexes;
    using Azure.Search.Documents.Indexes.Models;
    using Azure.Search.Documents.Models;
    
  2. İki istemci oluşturun: SearchIndexClient dizini oluşturur ve SearchClient var olan bir dizini yükler ve sorgular. Her ikisinde de oluşturma/silme haklarıyla kimlik doğrulaması için hizmet uç noktası ve yönetici API anahtarı gerekir.

    static void Main(string[] args)
    {
        string serviceName = "<YOUR-SERVICE-NAME>";
        string indexName = "hotels-quickstart";
        string apiKey = "<YOUR-ADMIN-API-KEY>";
    
         // Create a SearchIndexClient to send create/delete index commands
         Uri serviceEndpoint = new Uri($"https://{serviceName}.search.windows.net/");
         AzureKeyCredential credential = new AzureKeyCredential(apiKey);
         SearchIndexClient adminClient = new SearchIndexClient(serviceEndpoint, credential);
    
         // Create a SearchClient to load and query documents
         SearchClient srchclient = new SearchClient(serviceEndpoint, indexName, credential);
    

1 - Dizin oluşturma

Bu hızlı başlangıç, otel verileriyle yükleyeceğimiz ve sorgular yürüteceğimiz bir Hotels dizini derlemek için kullanılır. Bu adımda, dizinde alanları tanımlayın. Her alan tanımı, alanın nasıl kullanıl olduğunu belirleyen bir ad, veri türü ve öznitelikler içerir.

Bu örnekte kolaylık ve okunabilirlik için Azure.Search.Documents kitaplığının zaman uyumlu yöntemleri kullanılır. Ancak, üretim senaryolarında, zaman uyumsuz yöntemler kullanarak uygulamanın ölçeklenebilir ve hızlı yanıt verme hızını tutabilirsiniz. Örneğin CreateIndex yerine CreateIndexAsynckullanabilirsiniz.

  1. Projenize boş bir sınıf tanımı ekleme: Hotel.cs

  2. Otel belgesinin yapısını tanımlamak için aşağıdaki kodu Hotel.cs'ye kopyalayın. Saha öznitelikleri, bunun bir uygulamada nasıl kullanıla olduğunu belirler. Örneğin, özniteliği IsFilterable bir filtre ifadesini destekleyen her alana atanmalı.

    using System;
    using System.Text.Json.Serialization;
    using Azure.Search.Documents.Indexes;
    using Azure.Search.Documents.Indexes.Models;
    
    namespace AzureSearch.Quickstart
    {
        public partial class Hotel
        {
            [SimpleField(IsKey = true, IsFilterable = true)]
            public string HotelId { get; set; }
    
            [SearchableField(IsSortable = true)]
            public string HotelName { get; set; }
    
            [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
            public string Description { get; set; }
    
            [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
            [JsonPropertyName("Description_fr")]
            public string DescriptionFr { get; set; }
    
            [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
            public string Category { get; set; }
    
            [SearchableField(IsFilterable = true, IsFacetable = true)]
            public string[] Tags { get; set; }
    
            [SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
            public bool? ParkingIncluded { get; set; }
    
            [SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
            public DateTimeOffset? LastRenovationDate { get; set; }
    
            [SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
            public double? Rating { get; set; }
    
            [SearchableField]
            public Address Address { get; set; }
        }
    }
    

    Azure.Search.Documents istemci kitaplığında, alan tanımlarını basit hale getirmek için SearchableField ve SimpleField kullanabilirsiniz. Her ikisi de SearchField'in türevleridir ve kodunuzu basitleştirme potansiyeline sahip olabilir:

    • SimpleField herhangi bir veri türü olabilir, her zaman aranamaz (tam metin arama sorguları için yoksayılır) ve alınabilir (gizli değildir). Diğer öznitelikler varsayılan olarak kapalıdır, ancak etkinleştirilebilir. Belge kimlikleri veya yalnızca filtrelerde, facet'lerde veya puanlama profillerde kullanılan SimpleField alanlar için kullanabilirsiniz. Bu durumda, senaryo için gerekli olan tüm öznitelikleri (belge kimliği gibi) IsKey = true uygulamayı emin olun. Daha fazla bilgi için kaynak kodunda SimpleFieldAttribute.cs'ye bakın.

    • SearchableField bir dize olmalıdır ve her zaman aranabilir ve alınabilir olmalıdır. Diğer öznitelikler varsayılan olarak kapalıdır, ancak etkinleştirilebilir. Bu alan türü aranabilir olduğundan, eş anlamlıları ve çözümleyici özelliklerinin tam tamamlayıcılarını destekler. Daha fazla bilgi için kaynak kodundaki SearchableFieldAttribute.cs'ye bakın.

    İster temel API'yi ister yardımcı modellerden birini kullanın, filtre, model ve sıralama özniteliklerini açıkça SearchField etkinleştirmeniz gerekir. Örneğin, Yukarıdaki örnekte gösterildiği gibi IsFilterable, IsSortableve IsFacetable açıkça öznitelikle gösterilebilir.

  3. Projenize ikinci bir boş sınıf tanımı ekleyin: Address.cs. Aşağıdaki kodu sınıfına kopyalayın.

    using Azure.Search.Documents.Indexes;
    
     namespace AzureSearch.Quickstart
     {
         public partial class Address
         {
             [SearchableField(IsFilterable = true)]
             public string StreetAddress { get; set; }
    
             [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
             public string City { get; set; }
    
             [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
             public string StateProvince { get; set; }
    
             [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
             public string PostalCode { get; set; }
    
             [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
             public string Country { get; set; }
         }
     }
    
  4. İki sınıf daha oluşturun: ToString() geçersiz kılmaları için Hotel.Methods.cs ve Address.Methods.cs. Bu sınıflar, konsol çıkışında arama sonuçlarını işlemek için kullanılır. Bu sınıfların içeriği bu makalede sağlanmaz, ancak içindeki dosyalardan kodu kopyalayıp GitHub.

  5. Program.cs içindebir SearchIndex nesnesi oluşturun ve ardından arama hizmetinizin dizinini ifade etmek için CreateIndex yöntemini arayın. Dizin ayrıca belirtilen alanlarda otomatik tamamlamayı etkinleştirmek için bir SearchSuggester içerir.

     // Create hotels-quickstart index
     private static void CreateIndex(string indexName, SearchIndexClient adminClient)
     {
         FieldBuilder fieldBuilder = new FieldBuilder();
         var searchFields = fieldBuilder.Build(typeof(Hotel));
    
         var definition = new SearchIndex(indexName, searchFields);
    
         var suggester = new SearchSuggester("sg", new[] { "HotelName", "Category", "Address/City", "Address/StateProvince" });
         definition.Suggesters.Add(suggester);
    
         adminClient.CreateOrUpdateIndex(definition);
     }
    

2 - Belgeleri yükleme

Azure Bilişsel Arama depolanan içerik üzerinde aramalarını sağlar. Bu adımda, yeni oluşturduğunuz otel diziniyle uyumlu JSON belgelerini yükleyebilirsiniz.

Arama Azure Bilişsel Arama, hem dizin oluşturma hem de sorgulardan gelen çıkışlar olan veri yapılarıdır. Bir dış veri kaynağından edinilen gibi, belge girişleri bir veritabanındaki satırlar, Blob depolamadaki bloblar veya diskte JSON belgeleri olabilir. Bu örnekte, bir kısayolu alıp kodun kendisine dört otel için JSON belgeleri eklemektedir.

Belgeleri karşıya yüklerken IndexDocumentsBatch nesnesi kullanabilirsiniz. Bir nesne, her biri bir belge ve hangi eylemin gerçekleştirilecek olduğunu (karşıya yükleme, birleştirme, silme ve IndexDocumentsBatchmergeOrUpload)Azure Bilişsel Arama bir özellik içeren IndexDocumentsBatchkoleksiyonunu içerir.

  1. Program.cs içinde,bir belge dizisi ve dizin eylemleri oluşturun ve sonra diziyi 'ye iletir. Aşağıdaki belgeler, otel sınıfı tarafından tanımlanan hotels-quickstart dizinine uygun.

    // Upload documents in a single Upload request.
    private static void UploadDocuments(SearchClient searchClient)
    {
        IndexDocumentsBatch<Hotel> batch = IndexDocumentsBatch.Create(
            IndexDocumentsAction.Upload(
                new Hotel()
                {
                    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.",
                    DescriptionFr = "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 = new[] { "pool", "air conditioning", "concierge" },
                    ParkingIncluded = false,
                    LastRenovationDate = new DateTimeOffset(1970, 1, 18, 0, 0, 0, TimeSpan.Zero),
                    Rating = 3.6,
                    Address = new Address()
                    {
                        StreetAddress = "677 5th Ave",
                        City = "New York",
                        StateProvince = "NY",
                        PostalCode = "10022",
                        Country = "USA"
                    }
                }),
            IndexDocumentsAction.Upload(
                new Hotel()
                {
                    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.",
                    DescriptionFr = "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 = new[] { "pool", "free wifi", "concierge" },
                    ParkingIncluded = false,
                    LastRenovationDate = new DateTimeOffset(1979, 2, 18, 0, 0, 0, TimeSpan.Zero),
                    Rating = 3.60,
                    Address = new Address()
                    {
                        StreetAddress = "140 University Town Center Dr",
                        City = "Sarasota",
                        StateProvince = "FL",
                        PostalCode = "34243",
                        Country = "USA"
                    }
                }),
            IndexDocumentsAction.Upload(
                new Hotel()
                {
                    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.",
                    DescriptionFr = "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 = new[] { "air conditioning", "bar", "continental breakfast" },
                    ParkingIncluded = true,
                    LastRenovationDate = new DateTimeOffset(2015, 9, 20, 0, 0, 0, TimeSpan.Zero),
                    Rating = 4.80,
                    Address = new Address()
                    {
                        StreetAddress = "3393 Peachtree Rd",
                        City = "Atlanta",
                        StateProvince = "GA",
                        PostalCode = "30326",
                        Country = "USA"
                    }
                }),
            IndexDocumentsAction.Upload(
                new Hotel()
                {
                    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.",
                    DescriptionFr = "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 = new[] { "concierge", "view", "24-hour front desk service" },
                    ParkingIncluded = true,
                    LastRenovationDate = new DateTimeOffset(1960, 2, 06, 0, 0, 0, TimeSpan.Zero),
                    Rating = 4.60,
                    Address = new Address()
                    {
                        StreetAddress = "7400 San Pedro Ave",
                        City = "San Antonio",
                        StateProvince = "TX",
                        PostalCode = "78216",
                        Country = "USA"
                    }
                })
            );
    
        try
        {
            IndexDocumentsResult result = searchClient.IndexDocuments(batch);
        }
        catch (Exception)
        {
            // If for some reason any documents are dropped during indexing, you can compensate by delaying and
            // retrying. This simple demo just logs the failed document keys and continues.
            Console.WriteLine("Failed to index some of the documents: {0}");
        }
    }
    

    IndexDocumentsBatch nesnesini başlatıldıktan sonra, SearchClient nesneniz üzerinde IndexDocuments'ı çağırarak dizine gönderebilirsiniz.

  2. Aşağıdaki satırları Main() satırına ekleyin. Belgelerin yüklenmesi SearchClient kullanılarak yapılır, ancak işlem genellikle SearchIndexClient ile ilişkili olan hizmette yönetici hakları da gerektirir. Bu işlemi ayarlamanın bir yolu SearchIndexClient (bu örnekte adminClient) aracılığıyla SearchClient almaktır.

     SearchClient ingesterClient = adminClient.GetSearchClient(indexName);
    
     // Load documents
     Console.WriteLine("{0}", "Uploading documents...\n");
     UploadDocuments(ingesterClient);
    
  3. Bu, tüm komutları sırayla çalıştıran bir konsol uygulaması olduğundan, dizin oluşturma ile sorgular arasında 2 saniyelik bekleme süresi ekleyin.

    // Wait 2 seconds for indexing to complete before starting queries (for demo and console-app purposes only)
    Console.WriteLine("Waiting for indexing...\n");
    System.Threading.Thread.Sleep(2000);
    

    2 saniyelik gecikme, sorgular yürütülmeden önce tüm belgelerin dizine atılarak zaman uyumsuz olması için dizin oluşturmayı telafi ediyor. Gecikmeli kodlama genellikle yalnızca tanıtımlarda, testlerde ve örnek uygulamalarda gereklidir.

3 - Dizin arama

İlk belge dizine alındık hemen sorgu sonuçlarını elde edebilirsiniz, ancak dizininizin gerçek testi tüm belgelerin dizine görene kadar beklemesi gerekir.

Bu bölüm iki işlev ekler: sorgu mantığı ve sonuçlar. Sorgular için Search yöntemini kullanın. Bu yöntem arama metnini (sorgu dizesi) ve diğer seçenekleri alır.

SearchResults sınıfı sonuçları temsil eder.

  1. Program.cs içinde,arama sonuçlarını konsola yazdıran bir WriteDocuments yöntemi oluşturun.

    // Write search results to console
    private static void WriteDocuments(SearchResults<Hotel> searchResults)
    {
        foreach (SearchResult<Hotel> result in searchResults.GetResults())
        {
            Console.WriteLine(result.Document);
        }
    
        Console.WriteLine();
    }
    
  2. Sorguları yürütmek ve sonuçları dönmek için bir RunQueries yöntemi oluşturun. Sonuçlar, Otel nesneleridir. Bu örnek, yöntem imzasını ve ilk sorguyu gösterir. Bu sorgu, belgeden seçilen alanları kullanarak sonucu oluşturmana olanak sağlayan Select parametresini gösterir.

    // Run queries, use WriteDocuments to print output
    private static void RunQueries(SearchClient srchclient)
    {
        SearchOptions options;
        SearchResults<Hotel> response;
    
        Console.WriteLine("Query #1: Search on empty term '*' to return all documents, showing a subset of fields...\n");
    
        options = new SearchOptions()
        {
            IncludeTotalCount = true,
            Filter = "",
            OrderBy = { "" }
        };
    
        options.Select.Add("HotelId");
        options.Select.Add("HotelName");
        options.Select.Add("Address/City");
    
        response = srchclient.Search<Hotel>("*", options);
        WriteDocuments(response);
    
  3. İkinci sorguda bir terimde arama yapmak, Derecelendirme'nin 4'den büyük olduğu belgeleri seçen bir filtre ekleyin ve derecelendirmeye göre azalan düzende sıralanın. Filter, bir dizinde IsFilterable alanları üzerinden değerlendirilen bir boole ifadesidir. Filtre sorguları değerleri dahil eder veya dışlar. Bu nedenle, bir filtre sorgusuyla ilişkili bir ilgi puanı yoktur.

    Console.WriteLine("Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...\n");
    
    options = new SearchOptions()
    {
        Filter = "Rating gt 4",
        OrderBy = { "Rating desc" }
    };
    
    options.Select.Add("HotelId");
    options.Select.Add("HotelName");
    options.Select.Add("Rating");
    
    response = srchclient.Search<Hotel>("hotels", options);
    WriteDocuments(response);
    
  4. Üçüncü sorguda tam metin arama işlemi için belirli alanlara yönelik kapsam olarak kullanılan searchFields kullanılmıştır.

    Console.WriteLine("Query #3: Limit search to specific fields (pool in Tags field)...\n");
    
    options = new SearchOptions()
    {
        SearchFields = { "Tags" }
    };
    
    options.Select.Add("HotelId");
    options.Select.Add("HotelName");
    options.Select.Add("Tags");
    
    response = srchclient.Search<Hotel>("pool", options);
    WriteDocuments(response);
    
  5. Dördüncü sorguda, çok yönlü bir gezinti yapısının yapısı için kullanılmaktadır.

     Console.WriteLine("Query #4: Facet on 'Category'...\n");
    
     options = new SearchOptions()
     {
         Filter = ""
     };
    
     options.Facets.Add("Category");
    
     options.Select.Add("HotelId");
     options.Select.Add("HotelName");
     options.Select.Add("Category");
    
     response = srchclient.Search<Hotel>("*", options);
     WriteDocuments(response);
    
  6. Beşinci sorguda belirli bir belgeyi geri ekleyin. Belge arama, sonuç kümesindeki OnClick olayına verilen tipik bir yanıttır.

     Console.WriteLine("Query #5: Look up a specific document...\n");
    
     Response<Hotel> lookupResponse;
     lookupResponse = srchclient.GetDocument<Hotel>("3");
    
     Console.WriteLine(lookupResponse.Value.HotelId);
    
  7. Son sorgu, otomatik tamamlama söz dizimi gösterir ve "sa" kullanıcı girişinin kısmi bir simülasyonunu, dizinde tanımlandığınız önericiyle ilişkili sourceFields içinde iki olası eşleşmeye çözümlemektedir.

     Console.WriteLine("Query #6: Call Autocomplete on HotelName that starts with 'sa'...\n");
    
     var autoresponse = srchclient.Autocomplete("sa", "sg");
     WriteDocuments(autoresponse);
    
  8. Main() için RunQueries ekleyin.

    // Call the RunQueries method to invoke a series of queries
    Console.WriteLine("Starting queries...\n");
    RunQueries(srchclient);
    
    // End the program
    Console.WriteLine("{0}", "Complete. Press any key to end this program...\n");
    Console.ReadKey();
    

Önceki sorgularda bir sorguda terimleri eşleştirmenin birdençok yolu vardır: tam metin araması, filtreler ve otomatik tamamlama.

Tam metin araması ve filtreleri SearchClient.Search yöntemi kullanılarak gerçekleştirilir. Bir arama sorgusu dizede searchText geçirken, SearchOptions sınıfının searchText özelliğinde bir filtre ifadesi geçirebilirsiniz. Arama yapmadan filtrelemek için "*"searchText Search yönteminin parametresini "*" gerekir. Filtreleme olmadan arama yapmak için özelliğinin kümesini olduğu gibi bırakın Filter veya bir örneği hiç SearchOptions geçmeyin.

Programı çalıştırma

Uygulamayı yeniden inşa etmek ve programı tamamen çalıştırmak için F5 tuşuna basın.

Çıkış, Console.WriteLine'dan gelen iletileri,sorgu bilgileri ve sonuçların yanı sıra içerir.

Kaynakları 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 ve veri kaynağıyla sınırlı olduğunu unutmayın. Sınırın altında kalmak için portalda tek tek öğeleri silebilirsiniz.

Sonraki adımlar

Bu C# hızlı başlangıçta dizin oluşturmak, belgelerle yüklemek ve sorgu çalıştırmak için bir dizi görev üzerinde çalıştısınız. Farklı aşamalarda kodu okunabilirlik ve anlama açısından basitleştirmek için kısayollar kullandık. Temel kavramlar hakkında bilgi sahibi olduğunuza göre, bir web uygulaması bağlamında Bilişsel Arama API'lerini çağırmaya yardımcı olacak bir sonraki öğreticiyi deneyin.