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

C# dilinde arama dizini oluşturan, yükleyen ve sorgulayan bir .NET Core konsol uygulaması oluşturmak için Azure.Search.Documents (sürüm 11) istemci kitaplığını kullanmayı öğrenin.

Tamamlanmış bir projeyle başlamak için kaynak kodunu indirebilir veya bu makaledeki adımları izleyerek kendi projenizi oluşturabilirsiniz.

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 sahip olmanız gerekir:

Projenizi ayarlarken Azure.Search.Documents NuGet paketini indireceksiniz.

.NET için Azure SDK, .NET Standard 2.0'a uygundur ve bu da en düşük gereksinimler olarak .NET Framework 4.6.1 ve .NET Core 2.1 anlamına gelir.

Projenizi ayarlama

Hizmet bağlantı bilgilerini derleyin ve üzerinde çalışabilen yeni bir Konsol Uygulaması projesi oluşturmak için Visual Studio'yu başlatın. Çalışma süresi için NET Core 3.1'i seçin.

Anahtarı ve uç noktayı kopyalama

Hizmete yapılan çağrılar, her istekte bir URL uç noktası ve erişim anahtarı gerektirir. İlk adım olarak, projenize eklenecek API anahtarını ve URL'yi bulun. sonraki bir adımda istemciyi oluştururken her iki değeri de belirteceksiniz.

  1. Azure portal oturum açın ve arama hizmeti Genel Bakış sayfanızda URL'yi alın. Örnek uç nokta https://mydemo.search.windows.net şeklinde görünebilir.

  2. Ayarlar>Anahtarları'nda, nesneleri oluştururken veya silerken gerekli olan hizmet üzerinde tam haklar için bir yönetici anahtarı alın. İki değiştirilebilir birincil ve ikincil anahtar vardır. İkisini de kullanabilirsiniz.

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

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.

NuGet paketini 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. Visual Studio'yu başlatın ve bir .NET Core konsol uygulaması oluşturun.

  2. Araçlar>NuGet Paket Yöneticisi'ndeÇözüm için NuGet Paketlerini Yönet...'i seçin.

  3. Gözat'ı seçin.

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

  5. Derlemeyi projenize ve çözümünüze eklemek için sağ taraftaki Yükle'yi seçin.

Arama istemcisi oluşturma

  1. Program.cs dosyasında ad alanını olarak AzureSearch.SDK.Quickstart.v11 değiştirin ve 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şturma: SearchIndexClient dizini oluşturur ve SearchClient var olan bir dizini yükler ve sorgular. Hem hizmet uç noktasına hem de oluşturma/silme haklarına sahip kimlik doğrulaması için bir yönetici API anahtarı gerekir.

     static void Main(string[] args)
     {
         string serviceName = "<your-search-service-name>";
         string apiKey = "<your-search-service-admin-api-key>";
         string indexName = "hotels-quickstart";
    
         // 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ıçta, otel verileriyle yükleyip üzerinde sorgular yürütdüğünüz bir Hotels dizini oluşturacaksınız. Bu adımda dizindeki alanları tanımlayın. Her alan tanımı, alanın nasıl kullanıldığını 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ılmaktadır. Ancak üretim senaryolarında, uygulamanızı ölçeklenebilir ve duyarlı tutmak için zaman uyumsuz yöntemler kullanmanız gerekir. Örneğin, CreateIndex yerine CreateIndexAsync kullanabilirsiniz.

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

  2. Bir otel belgesinin yapısını tanımlamak için aşağıdaki kodu Hotel.cs dosyasına kopyalayın. Alandaki öznitelikler, uygulamada nasıl kullanıldığını belirler. Örneğin, IsFilterable özniteliğinin filtre ifadesini destekleyen her alana atanması gerekir.

    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ı kolaylaştırmak için SearchableField ve SimpleField kullanabilirsiniz. Her ikisi de SearchField'in türevleridir ve kodunuzu basitleştirebilir:

    • 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, modellerde veya puanlama profillerinde kullanılan alanlar için kullanabilirsiniz SimpleField . Öyleyse, belge kimliği gibi IsKey = true senaryo için gerekli olan öznitelikleri uyguladığınıza emin olun. Daha fazla bilgi için kaynak kodundaki SimpleFieldAttribute.cs dosyasına bakın.

    • SearchableField bir dize olmalıdır ve her zaman aranabilir ve alınabilir. 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ısını destekler. Daha fazla bilgi için kaynak kodundaki SearchableFieldAttribute.cs dosyasına bakın.

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

  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 GitHub'daki dosyalardan kodu kopyalayabilirsiniz.

  5. Program.cs'de bir SearchIndex nesnesi oluşturun ve ardından arama hizmetinizdeki dizini ifade etmek için CreateIndex yöntemini çağırı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 hizmette depolanan içerik üzerinde aramalar. Bu adımda, yeni oluşturduğunuz otel dizinine uygun JSON belgelerini yükleyeceksiniz.

Azure Bilişsel Arama'de, arama belgeleri hem dizin oluşturmaya giriş hem de sorgulardan alınan çıkışlar olan veri yapılarıdır. Dış veri kaynağından elde edilen belge girişleri veritabanındaki satırlar, Blob depolama alanındaki bloblar veya diskteki JSON belgeleri olabilir. Bu örnekte, bir kısayol alıp kodun kendisindeki dört otel için JSON belgeleri ekliyoruz.

Belgeleri karşıya yüklerken IndexDocumentsBatch nesnesi kullanmanız gerekir. NesneIndexDocumentsBatch, her biri bir belge ve Azure Bilişsel Arama gerçekleştirilecek eylemi (karşıya yükleme, birleştirme, silme ve mergeOrUpload) belirten bir özellik içeren eylemler koleksiyonunu içerir.

  1. Program.cs dosyasında, bir belge dizisi ve dizin eylemleri oluşturun ve diziyi öğesine IndexDocumentsBatchgeçirin. Aşağıdaki belgeler, otel sınıfı tarafından tanımlanan hotels-quickstart dizinine uygundur.

    // 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şlatdıktan sonra, SearchClient nesnenizde IndexDocuments'ı çağırarak bunu dizine gönderebilirsiniz.

  2. Main() öğesine aşağıdaki satırları ekleyin. Belgeleri yükleme işlemi 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ıralı olarak çalıştıran bir konsol uygulaması olduğundan, dizin oluşturma ile sorgular arasında 2 saniyelik bir 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 alınabilmesi için zaman uyumsuz olan dizin oluşturmayı telafi eder. Gecikmeli kodlama genellikle yalnızca tanıtımlarda, testlerde ve örnek uygulamalarda gereklidir.

3 - Dizin arama

İlk belge dizine eklenir alınmaz sorgu sonuçlarını alabilirsiniz, ancak dizininizin gerçek testi tüm belgeler dizine alınana kadar beklemelidir.

Bu bölüm iki işlev parçası 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'de, 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();
    }
    
    private static void WriteDocuments(AutocompleteResults autoResults)
    {
        foreach (AutocompleteItem result in autoResults.Results)
        {
            Console.WriteLine(result.Text);
        }
    
        Console.WriteLine();
    }
    
  2. Sorguları yürütmek ve sonuçları döndürmek için bir RunQueries yöntemi oluşturun. Sonuçlar Hotel nesneleridir. Bu örnek yöntem imzasını ve ilk sorguyu gösterir. Bu sorgu, belgeden seçilen alanları kullanarak sonucu oluşturmanıza olanak tanıyan Select parametresini gösterir.

    // Run queries, use WriteDocuments to print output
    private static void RunQueries(SearchClient srchclient)
    {
        SearchOptions options;
        SearchResults<Hotel> response;
    
        // Query 1
        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 terimi arayın, Derecelendirmenin 4'ten büyük olduğu belgeleri seçen bir filtre ekleyin ve ardından Derecelendirmeye göre azalan düzende sıralayın. Filter, bir dizindeki IsFilterable alanları üzerinden değerlendirilen bir boole ifadesidir. Filtre sorguları değerleri içerir veya dışlar. Bu nedenle, filtre sorgusuyla ilişkilendirilmiş bir ilgi puanı yoktur.

    // Query 2
    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ü sorgu, bir tam metin arama işleminin kapsamını belirli alanlara göre ayarlamak için kullanılan searchField'leri gösterir.

    // Query 3
    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ı yapılandırmak için kullanılabilecek modeller gösterilir.

     // Query 4
     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 döndürür. Belge arama, sonuç kümesindeki OnClick olayına verilen tipik bir yanıttır.

     // Query 5
     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 dizimini gösterir ve dizinde tanımladığınız öneri oluşturucuyla ilişkili sourceField'lerde iki olası eşleşmeye çözümleyen "sa" kullanıcı girişinin kısmi bir benzetimini gösterir.

     // Query 6
     Console.WriteLine("Query #6: Call Autocomplete on HotelName that starts with 'sa'...\n");
    
     var autoresponse = srchclient.Autocomplete("sa", "sg");
     WriteDocuments(autoresponse);
    
  8. Main() öğesine 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 sorgular bir sorguda terim eşleştirmenin birden çok yolunu gösterir: tam metin araması, filtreler ve otomatik tamamlama.

Tam metin araması ve filtreleri SearchClient.Search yöntemi kullanılarak gerçekleştirilir. Arama sorgusu dizede searchText geçirilebilirken SearchOptions sınıfının Filter özelliğinde bir filtre ifadesi geçirilebilir. Arama yapmadan filtrelemek için Search yönteminin searchText parametresini geçirmesi "*" gerekir. Filtreleme olmadan arama yapmak için özelliğini ayarsız bırakın Filter veya bir SearchOptions örneği hiç geçirmeyin.

Programı çalıştırma

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

Çıktı, sorgu bilgilerinin ve sonuçlarının eklenmesiyle Console.WriteLine'dan gelen iletileri 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 kaynakları portalda bulabilir ve yönetebilirsiniz.

Ücretsiz bir hizmet kullanıyorsanız üç dizin, dizin oluşturucu ve veri kaynağıyla sınırlı olduğunuzu unutmayın. Sınırın altında kalmak için portaldaki öğeleri tek tek silebilirsiniz.

Sonraki adımlar

Bu C# hızlı başlangıcında, dizin oluşturmak, belgelerle yüklemek ve sorgu çalıştırmak için bir dizi görev üzerinde çalıştınız. Farklı aşamalarda, kodu okunabilirlik ve kavrama için basitleştirmek için kısayollar kullandık. Artık temel kavramları bildiğinize göre, bilişsel arama API'lerini bir web uygulaması bağlamında çağırmak için sonraki öğreticiyi deneyin.