.NET uygulamasından Azure Bilişsel Arama kullanmaHow to use Azure Cognitive Search from a .NET Application

Bu makale, Azure bilişsel arama .NET SDKile çalışmaya başlamanıza ve bu adımları kullanmaya başlamanıza yönelik bir yönergedir.This article is a walkthrough to get you up and running with the Azure Cognitive Search .NET SDK. Azure Bilişsel Arama kullanarak uygulamanızda zengin arama deneyimi uygulamak için .NET SDK 'sını kullanabilirsiniz.You can use the .NET SDK to implement a rich search experience in your application using Azure Cognitive Search.

Azure Bilişsel Arama SDK 'sındaki ÖzelliklerWhat's in the Azure Cognitive Search SDK

SDK, dizinlerinizi, veri kaynaklarınızı, Dizin oluşturucularını ve eş anlamlı haritalarınızı yönetmenizi, Ayrıca, HTTP ve JSON ayrıntıları ile uğraşmak zorunda kalmadan tüm sorguları ve sorguları yürütmeyi sağlayan birkaç istemci kitaplığı içerir.The SDK consists of a few client libraries that enable you to manage your indexes, data sources, indexers, and synonym maps, as well as upload and manage documents, and execute queries, all without having to deal with the details of HTTP and JSON. Bu istemci kitaplıklarının hepsi NuGet paketleri olarak dağıtılır.These client libraries are all distributed as NuGet packages.

Ana NuGet paketi, tüm diğer paketleri bağımlılık olarak içeren bir meta paket olan Microsoft.Azure.Search.The main NuGet package is Microsoft.Azure.Search, which is a meta-package that includes all the other packages as dependencies. Yeni kullanmaya başladıysanız veya uygulamanızın Azure Bilişsel Arama tüm özelliklerine ihtiyacı olacağını biliyorsanız bu paketi kullanın.Use this package if you're just getting started or if you know your application will need all the features of Azure Cognitive Search.

SDK 'daki diğer NuGet paketleri şunlardır:The other NuGet packages in the SDK are:

  • Microsoft.Azure.Search.Data: Azure Bilişsel Arama kullanarak bir .NET uygulaması geliştiriyorsanız ve yalnızca dizininizdeki belgeleri sorgulayıp güncelleştirmeniz gerekiyorsa bu paketi kullanın.Microsoft.Azure.Search.Data: Use this package if you're developing a .NET application using Azure Cognitive Search, and you only need to query or update documents in your indexes. Ayrıca dizinleri, eş anlamlı haritaları veya diğer hizmet düzeyi kaynaklarını oluşturmanız ya da güncelleştirmeniz gerekiyorsa, bunun yerine Microsoft.Azure.Search paketini kullanın.If you also need to create or update indexes, synonym maps, or other service-level resources, use the Microsoft.Azure.Search package instead.
  • Microsoft.Azure.Search.Service: Azure Bilişsel Arama dizinleri, eş anlamlı haritaları, Dizin oluşturucuyu, veri kaynaklarını veya diğer hizmet düzeyi kaynakları yönetmek için .NET 'te Otomasyon geliştiriyorsanız bu paketi kullanın.Microsoft.Azure.Search.Service: Use this package if you're developing automation in .NET to manage Azure Cognitive Search indexes, synonym maps, indexers, data sources, or other service-level resources. Dizininizdeki belgeleri sorgulamak veya güncelleştirmek istiyorsanız, bunun yerine Microsoft.Azure.Search.Data paketini kullanın.If you only need to query or update documents in your indexes, use the Microsoft.Azure.Search.Data package instead. Azure Bilişsel Arama 'nin tüm işlevlerine ihtiyacınız varsa, bunun yerine Microsoft.Azure.Search paketini kullanın.If you need all the functionality of Azure Cognitive Search, use the Microsoft.Azure.Search package instead.
  • Microsoft.Azure.Search.Common: Azure Bilişsel Arama .NET kitaplıkları için gereken ortak türler.Microsoft.Azure.Search.Common: Common types needed by the Azure Cognitive Search .NET libraries. Bu paketi uygulamanızda doğrudan kullanmanız gerekmez.You do not need to use this package directly in your application. Yalnızca bir bağımlılık olarak kullanılmak üzere tasarlanmıştır.It is only meant to be used as a dependency.

Çeşitli istemci kitaplıkları Index, Fieldve Documentgibi sınıfların yanı sıra Documents.Search ve SearchServiceClient sınıflarında Indexes.Create ve SearchIndexClient gibi işlemleri tanımlar.The various client libraries define classes like Index, Field, and Document, as well as operations like Indexes.Create and Documents.Search on the SearchServiceClient and SearchIndexClient classes. Bu sınıflar aşağıdaki ad alanları halinde düzenlenmiştir:These classes are organized into the following namespaces:

SDK 'nın gelecekteki bir güncelleştirmesiyle ilgili geri bildirim sağlamak isterseniz, geri bildirim sayfamıza bakın veya GitHub 'da sorun oluşturun ve sorun başlığında "Azure bilişsel arama" bahsetmeniz gerekir.If you would like to provide feedback for a future update of the SDK, see our feedback page or create an issue on GitHub and mention "Azure Cognitive Search" in the issue title.

.NET SDK, Azure Bilişsel Arama REST APIsürüm 2019-05-06 destekler.The .NET SDK supports version 2019-05-06 of the Azure Cognitive Search REST API. Bu sürüm, Azure Blob 'Ları dizin oluştururken karmaşık türler, AI zenginleştirme, otomatik tamamlamave jsonlines ayrıştırma modu için destek içerir.This version includes support for complex types, AI enrichment, autocomplete, and JsonLines parsing mode when indexing Azure Blobs.

Bu SDK, arama hizmetleri oluşturma ve ölçekleme ve API anahtarlarını yönetme gibi yönetim işlemlerini desteklemez.This SDK does not support Management Operations such as creating and scaling Search services and managing API keys. Arama kaynaklarınızı bir .NET uygulamasından yönetmeniz gerekiyorsa Azure bilişsel arama .NET Yönetim SDK 'sınıkullanabilirsiniz.If you need to manage your Search resources from a .NET application, you can use the Azure Cognitive Search .NET Management SDK.

SDK 'nın en son sürümüne yükseltmeUpgrading to the latest version of the SDK

Zaten Azure Bilişsel Arama .NET SDK 'nın daha eski bir sürümünü kullanıyorsanız ve en son genel kullanıma sunulan sürüme yükseltmek istiyorsanız, Bu makalede nasıl yapılacağı açıklanmaktadır.If you're already using an older version of the Azure Cognitive Search .NET SDK and you'd like to upgrade to the latest generally available version, this article explains how.

SDK gereksinimleriRequirements for the SDK

  1. Visual Studio 2017 veya üzeri.Visual Studio 2017 or later.
  2. Kendi Azure Bilişsel Arama hizmetiniz.Your own Azure Cognitive Search service. SDK 'yı kullanmak için hizmetinizin adı ve bir veya daha fazla API anahtarı gerekir.In order to use the SDK, you will need the name of your service and one or more API keys. Portalda bir hizmet oluşturmak , bu adımlarda size yardımcı olur.Create a service in the portal will help you through these steps.
  3. Visual Studio 'daki "NuGet Paketlerini Yönet" i kullanarak Azure Bilişsel Arama .NET SDK NuGet paketini indirin.Download the Azure Cognitive Search .NET SDK NuGet package by using "Manage NuGet Packages" in Visual Studio. Yalnızca NuGet.org üzerinde Microsoft.Azure.Search paket adını (veya yalnızca bir işlevin alt kümesine ihtiyacınız varsa yukarıdaki diğer paket adlarından birini) aratın.Just search for the package name Microsoft.Azure.Search on NuGet.org (or one of the other package names above if you only need a subset of the functionality).

Azure Bilişsel Arama .NET SDK, .NET Framework 4.5.2 ve üstünü hedefleyen uygulamaları ve .NET Core 2,0 ve üstünü de destekler.The Azure Cognitive Search .NET SDK supports applications targeting the .NET Framework 4.5.2 and higher, as well as .NET Core 2.0 and higher.

Temel senaryolarCore scenarios

Arama uygulamanızda yapmanız gereken birkaç nokta vardır.There are several things you'll need to do in your search application. Bu öğreticide, şu temel senaryoları ele alacağız:In this tutorial, we'll cover these core scenarios:

  • Dizin oluşturmaCreating an index
  • Dizini belgelerle doldurmaPopulating the index with documents
  • Tam metin arama ve filtreleri kullanarak belge aramaSearching for documents using full-text search and filters

Aşağıdaki örnek kodda bu senaryoların her biri gösterilmektedir.The following sample code illustrates each of these scenarios. Kod parçacıklarını kendi uygulamanızda kullanmayı ücretsiz olarak kullanabilirsiniz.Feel free to use the code snippets in your own application.

Genel BakışOverview

Araştırdığımız örnek uygulama "oteller" adlı yeni bir dizin oluşturur, bunu birkaç belgeyle doldurur, sonra bazı arama sorgularını yürütür.The sample application we'll be exploring creates a new index named "hotels", populates it with a few documents, then executes some search queries. Genel akışı gösteren ana program aşağıda verilmiştir:Here is the main program, showing the overall flow:

// This sample shows how to delete, create, upload documents and query an index
static void Main(string[] args)
{
    IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
    IConfigurationRoot configuration = builder.Build();

    SearchServiceClient serviceClient = CreateSearchServiceClient(configuration);

    string indexName = configuration["SearchIndexName"];

    Console.WriteLine("{0}", "Deleting index...\n");
    DeleteIndexIfExists(indexName, serviceClient);

    Console.WriteLine("{0}", "Creating index...\n");
    CreateIndex(indexName, serviceClient);

    ISearchIndexClient indexClient = serviceClient.Indexes.GetClient(indexName);

    Console.WriteLine("{0}", "Uploading documents...\n");
    UploadDocuments(indexClient);

    ISearchIndexClient indexClientForQueries = CreateSearchIndexClient(configuration);

    RunQueries(indexClientForQueries);

    Console.WriteLine("{0}", "Complete.  Press any key to end application...\n");
    Console.ReadKey();
}

Not

Bu kılavuzda kullanılan örnek uygulamanın tam kaynak kodunu GitHub üzerinde bulabilirsiniz.You can find the full source code of the sample application used in this walk through on GitHub.

Bu adım adım adım izlenecek.We'll walk through this step by step. İlk olarak yeni bir SearchServiceClientoluşturmanız gerekir.First we need to create a new SearchServiceClient. Bu nesne, dizinleri yönetmenizi sağlar.This object allows you to manage indexes. Bir tane oluşturmak için, Azure Bilişsel Arama hizmet adınızı ve bir yönetici API anahtarını sağlamanız gerekir.In order to construct one, you need to provide your Azure Cognitive Search service name as well as an admin API key. Bu bilgileri örnek uygulamanınappsettings.json dosyasına girebilirsiniz.You can enter this information in the appsettings.json file of the sample application.

private static SearchServiceClient CreateSearchServiceClient(IConfigurationRoot configuration)
{
    string searchServiceName = configuration["SearchServiceName"];
    string adminApiKey = configuration["SearchServiceAdminApiKey"];

    SearchServiceClient serviceClient = new SearchServiceClient(searchServiceName, new SearchCredentials(adminApiKey));
    return serviceClient;
}

Not

Yanlış bir anahtar (örneğin, bir yönetici anahtarının gerekli olduğu bir sorgu anahtarı) sağlarsanız, SearchServiceClient, Indexes.Creategibi bir işlem yöntemi çağırdığınızda "yasak" hata iletisiyle bir CloudException oluşturur.If you provide an incorrect key (for example, a query key where an admin key was required), the SearchServiceClient will throw a CloudException with the error message "Forbidden" the first time you call an operation method on it, such as Indexes.Create. Bu durumda, API anahtarımızı çift kontrol edin.If this happens to you, double-check our API key.

Sonraki birkaç satır, "oteller" adlı bir dizin oluşturmak için Yöntemler çağırır, zaten varsa onu siliyor.The next few lines call methods to create an index named "hotels", deleting it first if it already exists. Bu yöntemlerin biraz daha sonra izlenecek.We will walk through these methods a little later.

Console.WriteLine("{0}", "Deleting index...\n");
DeleteIndexIfExists(indexName, serviceClient);

Console.WriteLine("{0}", "Creating index...\n");
CreateIndex(indexName, serviceClient);

Sonra, dizinin doldurulması gerekir.Next, the index needs to be populated. Dizini doldurmak için bir SearchIndexClientgerekir.To do populate the index, we will need a SearchIndexClient. Bir tane elde etmenin iki yolu vardır: oluşturarak veya SearchServiceClient``Indexes.GetClient çağırarak.There are two ways to obtain one: by constructing it, or by calling Indexes.GetClient on the SearchServiceClient. Daha kolay bir kullanım için kullanırız.We use the latter for convenience.

ISearchIndexClient indexClient = serviceClient.Indexes.GetClient(indexName);

Not

Tipik bir arama uygulamasında dizin yönetimi ve popülasyon, arama sorgularından ayrı bir bileşen tarafından işlenebilir.In a typical search application, index management and population may be handled by a separate component from search queries. Indexes.GetClient, ek SearchCredentialssağlamaya yönelik bir sorunu kaydettiğinden, bir dizini doldurmak için kullanışlıdır.Indexes.GetClient is convenient for populating an index because it saves you the trouble of providing additional SearchCredentials. Yeni SearchServiceClient için SearchIndexClient oluşturmak üzere kullandığınız yönetici anahtarını geçirerek bunu yapar.It does this by passing the admin key that you used to create the SearchServiceClient to the new SearchIndexClient. Ancak, uygulamanızın sorguları yürüten bölümünde, bir sorgu anahtarı geçirebilmeniz için SearchIndexClient doğrudan oluşturulması daha iyidir. böylece, bir yönetici anahtarı yerine yalnızca verileri okuyabilmenizi sağlar.However, in the part of your application that executes queries, it is better to create the SearchIndexClient directly so that you can pass in a query key, which only allows you to read data, instead of an admin key. Bu, en az ayrıcalık ilkesiyle tutarlıdır ve uygulamanızın daha güvenli olmasına yardımcı olur.This is consistent with the principle of least privilege and will help to make your application more secure. Yönetici anahtarları ve sorgu anahtarları hakkında daha fazla bilgiyi buradanedinebilirsiniz.You can find out more about admin keys and query keys here.

Artık bir SearchIndexClientolduğuna göre dizini doldururuz.Now that we have a SearchIndexClient, we can populate the index. Dizin popülasyonu, daha sonra izlenecek bir başka yöntem tarafından yapılır.Index population is done by another method that we will walk through later.

Console.WriteLine("{0}", "Uploading documents...\n");
UploadDocuments(indexClient);

Son olarak, birkaç arama sorgusu yürütüyoruz ve sonuçları görüntüyoruz.Finally, we execute a few search queries and display the results. Bu kez, farklı bir SearchIndexClientkullanırız:This time we use a different SearchIndexClient:

ISearchIndexClient indexClientForQueries = CreateSearchIndexClient(indexName, configuration);

RunQueries(indexClientForQueries);

Daha sonra RunQueries yöntemine daha yakından bakacağız.We will take a closer look at the RunQueries method later. Yeni SearchIndexClientoluşturma kodu aşağıda verilmiştir:Here is the code to create the new SearchIndexClient:

private static SearchIndexClient CreateSearchIndexClient(string indexName, IConfigurationRoot configuration)
{
    string searchServiceName = configuration["SearchServiceName"];
    string queryApiKey = configuration["SearchServiceQueryApiKey"];

    SearchIndexClient indexClient = new SearchIndexClient(searchServiceName, indexName, new SearchCredentials(queryApiKey));
    return indexClient;
}

Bu süre, dizine yazma erişimi gerektirmeyen bir sorgu anahtarı kullanıyoruz.This time we use a query key since we do not need write access to the index. Bu bilgileri örnek uygulamanınappsettings.json dosyasına girebilirsiniz.You can enter this information in the appsettings.json file of the sample application.

Bu uygulamayı geçerli bir hizmet adı ve API anahtarları ile çalıştırırsanız, çıkış şu örnekteki gibi görünmelidir: (bazı konsol çıktıları "..." ile değiştirilmiştir) çizim amaçları için.)If you run this application with a valid service name and API keys, the output should look like this example: (Some console output has been replaced with "..." for illustration purposes.)

Deleting index...

Creating index...

Uploading documents...

Waiting for documents to be indexed...

Search the entire index for the term 'motel' and return only the HotelName field:

Name: Secret Point Motel

Name: Twin Dome Motel


Apply a filter to the index to find hotels with a room cheaper than $100 per night, and return the hotelId and description:

HotelId: 1
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 Times 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.

HotelId: 2
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.


Search the entire index, order by a specific field (lastRenovationDate) in descending order, take the top two results, and show only hotelName and lastRenovationDate:

Name: Triple Landscape Hotel
Last renovated on: 9/20/2015 12:00:00 AM +00:00

Name: Twin Dome Motel
Last renovated on: 2/18/1979 12:00:00 AM +00:00


Search the hotel names for the term 'hotel':

HotelId: 3
Name: Triple Landscape Hotel
...

Complete.  Press any key to end application... 

Uygulamanın tam kaynak kodu, bu makalenin sonunda verilmiştir.The full source code of the application is provided at the end of this article.

Sonra, Maintarafından çağrılan yöntemlerin her birine daha yakından bakacağız.Next, we will take a closer look at each of the methods called by Main.

Dizin oluşturmaCreating an index

Bir SearchServiceClientoluşturduktan sonra, Main "oteller" dizinini zaten varsa siler.After creating a SearchServiceClient, Main deletes the "hotels" index if it already exists. Bu silme işlemi aşağıdaki yöntem tarafından yapılır:That deletion is done by the following method:

private static void DeleteIndexIfExists(string indexName, SearchServiceClient serviceClient)
{
    if (serviceClient.Indexes.Exists(indexName))
    {
        serviceClient.Indexes.Delete(indexName);
    }
}

Bu yöntem, dizinin mevcut olup olmadığını denetlemek için verilen SearchServiceClient kullanır ve varsa silin.This method uses the given SearchServiceClient to check if the index exists, and if so, delete it.

Not

Bu makaledeki örnek kod, basitlik için Azure Bilişsel Arama .NET SDK 'sının zaman uyumlu yöntemlerini kullanır.The example code in this article uses the synchronous methods of the Azure Cognitive Search .NET SDK for simplicity. Kendi uygulamalarınızda zaman uyumsuz yöntemler kullanarak bunları ölçeklenebilir ve esnek tutmanızı öneririz.We recommend that you use the asynchronous methods in your own applications to keep them scalable and responsive. Örneğin, yukarıdaki yöntemde Exists ve Deleteyerine ExistsAsync ve DeleteAsync kullanabilirsiniz.For example, in the method above you could use ExistsAsync and DeleteAsync instead of Exists and Delete.

Sonra, Main bu yöntemi çağırarak yeni bir "oteller" dizini oluşturur:Next, Main creates a new "hotels" index by calling this method:

private static void CreateIndex(string indexName, SearchServiceClient serviceClient)
{
    var definition = new Index()
    {
        Name = indexName,
        Fields = FieldBuilder.BuildForType<Hotel>()
    };
    
    serviceClient.Indexes.Create(definition);
}

Bu yöntem, yeni dizinin şemasını tanımlayan bir Field nesneleri listesi ile yeni bir Index nesnesi oluşturur.This method creates a new Index object with a list of Field objects that defines the schema of the new index. Her alan, arama davranışını tanımlayan bir ad, veri türü ve birkaç özniteliğe sahiptir.Each field has a name, data type, and several attributes that define its search behavior. FieldBuilder sınıfı, belirtilen Hotel model sınıfının ortak özelliklerini ve özniteliklerini inceleyerek, dizin için Field nesnelerinin bir listesini oluşturmak üzere yansıma kullanır.The FieldBuilder class uses reflection to create a list of Field objects for the index by examining the public properties and attributes of the given Hotel model class. Daha sonra Hotel sınıfına daha yakından bakacağız.We'll take a closer look at the Hotel class later on.

Not

Gerekirse FieldBuilder kullanmak yerine Field nesnelerinin listesini her zaman doğrudan oluşturabilirsiniz.You can always create the list of Field objects directly instead of using FieldBuilder if needed. Örneğin, bir model sınıfı kullanmak istemeyebilirsiniz veya öznitelikler ekleyerek değiştirmek istemediğiniz mevcut bir model sınıfını kullanmanız gerekebilir.For example, you may not want to use a model class or you may need to use an existing model class that you don't want to modify by adding attributes.

Alanlara ek olarak, dizine Puanlama profilleri, öneri araçları veya CORS seçenekleri de ekleyebilirsiniz (Bu parametreler, breçekimi için örnekten çıkarılır).In addition to fields, you can also add scoring profiles, suggesters, or CORS options to the Index (these parameters are omitted from the sample for brevity). Dizin nesnesi hakkında daha fazla bilgi ve SDK başvurusuiçindeki bileşen parçaları ve Azure bilişsel arama REST API başvurusuhakkında daha fazla bilgi edinebilirsiniz.You can find more information about the Index object and its constituent parts in the SDK reference, as well as in the Azure Cognitive Search REST API reference.

Dizin dolduruluyorPopulating the index

Main sonraki adım, yeni oluşturulan dizini doldurur.The next step in Main populates the newly-created index. Bu dizin oluşturma işlemi şu yöntemde yapılır: (bazı kodlar "... ile değiştirilmiştir" illüstrasyon amaçlıdır.This index population is done in the following method: (Some code replaced with "..." for illustration purposes. Tam veri popülasyon kodu için tam örnek çözümüne bakın.)See the full sample solution for the full data population code.)

private static void UploadDocuments(ISearchIndexClient indexClient)
{
    var hotels = new Hotel[]
    {
        new Hotel()
        {
            HotelId = "1",
            HotelName = "Secret Point Motel",
            ...
            Address = new Address()
            {
                StreetAddress = "677 5th Ave",
                ...
            },
            Rooms = new Room[]
            {
                new Room()
                {
                    Description = "Budget Room, 1 Queen Bed (Cityside)",
                    ...
                },
                new Room()
                {
                    Description = "Budget Room, 1 King Bed (Mountain View)",
                    ...
                },
                new Room()
                {
                    Description = "Deluxe Room, 2 Double Beds (City View)",
                    ...
                }
            }
        },
        new Hotel()
        {
            HotelId = "2",
            HotelName = "Twin Dome Motel",
            ...
            {
                StreetAddress = "140 University Town Center Dr",
                ...
            },
            Rooms = new Room[]
            {
                new Room()
                {
                    Description = "Suite, 2 Double Beds (Mountain View)",
                    ...
                },
                new Room()
                {
                    Description = "Standard Room, 1 Queen Bed (City View)",
                    ...
                },
                new Room()
                {
                    Description = "Budget Room, 1 King Bed (Waterfront View)",
                    ...
                }
            }
        },
        new Hotel()
        {
            HotelId = "3",
            HotelName = "Triple Landscape Hotel",
            ...
            Address = new Address()
            {
                StreetAddress = "3393 Peachtree Rd",
                ...
            },
            Rooms = new Room[]
            {
                new Room()
                {
                    Description = "Standard Room, 2 Queen Beds (Amenities)",
                    ...
                },
                new Room ()
                {
                    Description = "Standard Room, 2 Double Beds (Waterfront View)",
                    ...
                },
                new Room()
                {
                    Description = "Deluxe Room, 2 Double Beds (Cityside)",
                    ...
                }
            }
        }
    };

    var batch = IndexBatch.Upload(hotels);

    try
    {
        indexClient.Documents.Index(batch);
    }
    catch (IndexBatchException e)
    {
        // Sometimes when your Search service is under load, indexing will fail for some of the documents in
        // the batch. Depending on your application, you can take compensating actions like delaying and
        // retrying. For this simple demo, we just log the failed document keys and continue.
        Console.WriteLine(
            "Failed to index some of the documents: {0}",
            String.Join(", ", e.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key)));
    }

    Console.WriteLine("Waiting for documents to be indexed...\n");
    Thread.Sleep(2000);
}

Bu yöntemin dört bölümü vardır.This method has four parts. İlki, dizine yüklemek üzere giriş verilerimizin olarak kullanılacak 3 Room nesne içeren 3 Hotel nesne dizisi oluşturur.The first creates an array of 3 Hotel objects each with 3 Room objects that will serve as our input data to upload to the index. Bu veriler kolaylık sağlaması için sabit olarak kodlanır.This data is hard-coded for simplicity. Kendi uygulamanızda, verileriniz büyük olasılıkla SQL veritabanı gibi bir dış veri kaynağından gelmiş olacaktır.In your own application, your data will likely come from an external data source such as a SQL database.

İkinci bölüm, belgeleri içeren bir IndexBatch oluşturur.The second part creates an IndexBatch containing the documents. Bu durumda, IndexBatch.Uploadçağırarak toplu işe uygulamak istediğiniz işlemi belirlersiniz.You specify the operation you want to apply to the batch at the time you create it, in this case by calling IndexBatch.Upload. Batch daha sonra Documents.Index yöntemi tarafından Azure Bilişsel Arama dizinine yüklenir.The batch is then uploaded to the Azure Cognitive Search index by the Documents.Index method.

Not

Bu örnekte, belgeleri karşıya yüklüyoruz.In this example, we are just uploading documents. Değişiklikleri varolan belgelere birleştirmek veya belge silmek istiyorsanız, bunun yerine IndexBatch.Merge, IndexBatch.MergeOrUploadveya IndexBatch.Delete çağırarak toplu işlemler oluşturabilirsiniz.If you wanted to merge changes into existing documents or delete documents, you could create batches by calling IndexBatch.Merge, IndexBatch.MergeOrUpload, or IndexBatch.Delete instead. Ayrıca, her biri Azure Bilişsel Arama bir belge üzerinde belirli bir işlemi gerçekleştirmesini söyleyen IndexAction IndexBatch.Newçağırarak, tek bir toplu işte farklı işlemleri de karıştırabilirsiniz.You can also mix different operations in a single batch by calling IndexBatch.New, which takes a collection of IndexAction objects, each of which tells Azure Cognitive Search to perform a particular operation on a document. IndexAction.Merge, IndexAction.Uploadvb. gibi karşılık gelen yöntemi çağırarak her bir IndexAction kendi işlemiyle oluşturabilirsiniz.You can create each IndexAction with its own operation by calling the corresponding method such as IndexAction.Merge, IndexAction.Upload, and so on.

Bu yöntemin üçüncü bölümü, dizin oluşturma için önemli bir hata durumunu işleyen bir catch bloğudur.The third part of this method is a catch block that handles an important error case for indexing. Azure Bilişsel Arama hizmetiniz toplu işteki bazı belgelerden Dizin kuramazsa, Documents.Indextarafından bir IndexBatchException oluşturulur.If your Azure Cognitive Search service fails to index some of the documents in the batch, an IndexBatchException is thrown by Documents.Index. Bu özel durum, hizmetiniz ağır yük altındayken belge dizinleniyorsa gerçekleşebilir.This exception can happen if you are indexing documents while your service is under heavy load. Bu durumu, kodunuzda açık şekilde işlemenizi kesinlikle öneririz.We strongly recommend explicitly handling this case in your code. Başarısız olan belgelere dizin oluşturmayı geciktirip sonra yeniden deneyebilir veya günlük tutup örneğin devam ettiği şekilde devam edebilir veya uygulamanızın veri tutarlılığı gereksinimlerine bağlı olarak başka bir şey yapabilirsiniz.You can delay and then retry indexing the documents that failed, or you can log and continue like the sample does, or you can do something else depending on your application's data consistency requirements.

Not

FindFailedActionsToRetry yöntemini, yalnızca önceki Indexyapılan çağrıda başarısız olan eylemleri içeren yeni bir toplu iş oluşturmak için kullanabilirsiniz.You can use the FindFailedActionsToRetry method to construct a new batch containing only the actions that failed in a previous call to Index. StackOverflow üzerindedüzgün bir şekilde nasıl kullanılacağına ilişkin bir tartışma vardır.There is a discussion of how to properly use it on StackOverflow.

Son olarak, UploadDocuments yöntemi iki saniye gecikedir.Finally, the UploadDocuments method delays for two seconds. Azure Bilişsel Arama hizmetinizde dizin oluşturma zaman uyumsuz olarak gerçekleştirilir, bu nedenle örnek uygulamanın arama için kullanılabilir olduğundan emin olmak için kısa bir süre beklemesi gerekir.Indexing happens asynchronously in your Azure Cognitive Search service, so the sample application needs to wait a short time to ensure that the documents are available for searching. Bu gibi gecikmeler genellikle yalnızca gösterilerde, testlerde ve örnek uygulamalarda gereklidir.Delays like this are typically only necessary in demos, tests, and sample applications.

.NET SDK belgeleri nasıl işler?How the .NET SDK handles documents

Azure Bilişsel Arama .NET SDK 'sının, Hotel gibi Kullanıcı tanımlı bir sınıfın örneklerini dizine nasıl yükleyebilmediğinizi merak ediyor olabilirsiniz.You may be wondering how the Azure Cognitive Search .NET SDK is able to upload instances of a user-defined class like Hotel to the index. Bu sorunun yanıtlanmasına yardımcı olmak için Hotel sınıfına bakalım:To help answer that question, let's look at the Hotel class:

using System;
using Microsoft.Azure.Search;
using Microsoft.Azure.Search.Models;
using Microsoft.Spatial;
using Newtonsoft.Json;

public partial class Hotel
{
    [System.ComponentModel.DataAnnotations.Key]
    [IsFilterable]
    public string HotelId { get; set; }

    [IsSearchable, IsSortable]
    public string HotelName { get; set; }

    [IsSearchable]
    [Analyzer(AnalyzerName.AsString.EnLucene)]
    public string Description { get; set; }

    [IsSearchable]
    [Analyzer(AnalyzerName.AsString.FrLucene)]
    [JsonProperty("Description_fr")]
    public string DescriptionFr { get; set; }

    [IsSearchable, IsFilterable, IsSortable, IsFacetable]
    public string Category { get; set; }

    [IsSearchable, IsFilterable, IsFacetable]
    public string[] Tags { get; set; }

    [IsFilterable, IsSortable, IsFacetable]
    public bool? ParkingIncluded { get; set; }

    // SmokingAllowed reflects whether any room in the hotel allows smoking.
    // The JsonIgnore attribute indicates that a field should not be created 
    // in the index for this property and it will only be used by code in the client.
    [JsonIgnore]
    public bool? SmokingAllowed => (Rooms != null) ? Array.Exists(Rooms, element => element.SmokingAllowed == true) : (bool?)null;

    [IsFilterable, IsSortable, IsFacetable]
    public DateTimeOffset? LastRenovationDate { get; set; }

    [IsFilterable, IsSortable, IsFacetable]
    public double? Rating { get; set; }

    public Address Address { get; set; }

    [IsFilterable, IsSortable]
    public GeographyPoint Location { get; set; }

    public Room[] Rooms { get; set; }
}

İlk olarak, Hotel sınıftaki her bir ortak özelliğin adının, Dizin tanımında aynı ada sahip bir alanla eşleştiğine dikkat edin.The first thing to notice is that the name of each public property in the Hotel class will map to a field with the same name in the index definition. Her bir alanın küçük harfle başlamasını istiyorsanız ("Camel Case"), SDK 'ya özellik adlarını, sınıftaki [SerializePropertyNamesAsCamelCase] özniteliğiyle otomatik olarak uyumlu olacak şekilde eşlemenizi söyleyebilirsiniz.If you would like each field to start with a lower-case letter ("camel case"), you can tell the SDK to map the property names to camel-case automatically with the [SerializePropertyNamesAsCamelCase] attribute on the class. Bu senaryo, .NET 'teki "Pascal case" adlandırma kılavuzlarını ihlal etmek zorunda kalmadan, hedef şemanın uygulama geliştiricisinin denetimi dışında olduğu veri bağlamayı gerçekleştiren .NET uygulamalarında yaygındır.This scenario is common in .NET applications that perform data-binding where the target schema is outside the control of the application developer without having to violate the "Pascal case" naming guidelines in .NET.

Not

Azure Bilişsel Arama .NET SDK 'Sı, özel model nesnelerinizi JSON 'a ve veritabanından seri hale getirmek ve seri durumdan çıkarmak için Newtonsoft JSON.net kitaplığını kullanır.The Azure Cognitive Search .NET SDK uses the NewtonSoft JSON.NET library to serialize and deserialize your custom model objects to and from JSON. Gerekirse bu seri hale getirmeyi özelleştirebilirsiniz.You can customize this serialization if needed. Daha fazla bilgi için bkz. JSON.net Ile özel serileştirme.For more information, see Custom Serialization with JSON.NET.

Dikkat edilecek ikinci şey, her bir özellik IsFilterable, IsSearchable, Keyve Analyzergibi özniteliklerle tasarlanmalıdır.The second thing to notice is each property is decorated with attributes such as IsFilterable, IsSearchable, Key, and Analyzer. Bu öznitelikler, bir Azure bilişsel arama dizininde karşılık gelen alan özniteliklerinedoğrudan eşlenir.These attributes map directly to the corresponding field attributes in an Azure Cognitive Search index. FieldBuilder sınıfı, dizin için alan tanımları oluşturmak üzere bu özellikleri kullanır.The FieldBuilder class uses these properties to construct field definitions for the index.

Hotel sınıfıyla ilgili üçüncü önemli şey, genel özelliklerin veri türleridir.The third important thing about the Hotel class is the data types of the public properties. Bu özelliklerin .NET türleri, dizin tanımında eşdeğer alan türleriyle eşlenir.The .NET types of these properties map to their equivalent field types in the index definition. Örneğin, Category dize özelliği category türündeki Edm.String alanına eşlenir.For example, the Category string property maps to the category field, which is of type Edm.String. bool?, Edm.Boolean, DateTimeOffset?ve Edm.DateTimeOffset arasında benzer tür eşlemeleri vardır.There are similar type mappings between bool?, Edm.Boolean, DateTimeOffset?, and Edm.DateTimeOffset and so on. Tür eşlemesine yönelik belirli kurallar, Azure bilişsel arama .NET SDK başvurusundaDocuments.Get yöntemiyle belgelenmiştir.The specific rules for the type mapping are documented with the Documents.Get method in the Azure Cognitive Search .NET SDK reference. FieldBuilder sınıfı sizin için bu eşlemeyi üstlenir, ancak herhangi bir serileştirme sorununa sorun gidermeniz gerektiğinde anlaşılması yararlı olabilir.The FieldBuilder class takes care of this mapping for you, but it can still be helpful to understand in case you need to troubleshoot any serialization issues.

SmokingAllowed özelliğine bildirimde bulunuldunuz musunuz?Did you happen to notice the SmokingAllowed property?

[JsonIgnore]
public bool? SmokingAllowed => (Rooms != null) ? Array.Exists(Rooms, element => element.SmokingAllowed == true) : (bool?)null;

Bu özelliğindeki JsonIgnore özniteliği, FieldBuilder bir alan olarak dizine serileştirmeyeceğini söyler.The JsonIgnore attribute on this property tells the FieldBuilder to not serialize it to the index as a field. Bu, uygulamanızda yardımcılar olarak kullanabileceğiniz istemci tarafı hesaplanmış Özellikler oluşturmanın harika bir yoludur.This is a great way to create client-side calculated properties you can use as helpers in your application. Bu durumda SmokingAllowed özelliği, Rooms koleksiyondaki herhangi bir Room smome izin verip etmediğini yansıtır.In this case, the SmokingAllowed property reflects whether any Room in the Rooms collection allows smoking. Tümü yanlışsa, tüm otelin smome izin vermiyor olduğunu gösterir.If all are false, it indicates that the entire hotel does not allow smoking.

Address ve Rooms gibi bazı özellikler .NET sınıflarının örnekleridir.Some properties such as Address and Rooms are instances of .NET classes. Bu özellikler daha karmaşık veri yapılarını temsil eder ve sonuç olarak dizinde karmaşık veri türüne sahip alanlar gerektirir.These properties represent more complex data structures and, as a result, require fields with a complex data type in the index.

Address özelliği, aşağıda tanımlanan Address sınıfında birden çok değer kümesini temsil eder:The Address property represents a set of multiple values in the Address class, defined below:

using System;
using Microsoft.Azure.Search;
using Microsoft.Azure.Search.Models;
using Newtonsoft.Json;

namespace AzureSearch.SDKHowTo
{
    public partial class Address
    {
        [IsSearchable]
        public string StreetAddress { get; set; }

        [IsSearchable, IsFilterable, IsSortable, IsFacetable]
        public string City { get; set; }

        [IsSearchable, IsFilterable, IsSortable, IsFacetable]
        public string StateProvince { get; set; }

        [IsSearchable, IsFilterable, IsSortable, IsFacetable]
        public string PostalCode { get; set; }

        [IsSearchable, IsFilterable, IsSortable, IsFacetable]
        public string Country { get; set; }
    }
}

Bu sınıf, Birleşik Devletler veya Kanada 'daki adresleri tanımlamakta kullanılan standart değerleri içerir.This class contains the standard values used to describe addresses in the United States or Canada. Mantıksal alanları dizinde gruplamak için bu gibi türleri kullanabilirsiniz.You can use types like this to group logical fields together in the index.

Rooms özelliği bir Room nesneleri dizisini temsil eder:The Rooms property represents an array of Room objects:

using System;
using Microsoft.Azure.Search;
using Microsoft.Azure.Search.Models;
using Newtonsoft.Json;

namespace AzureSearch.SDKHowTo
{
    public partial class Room
    {
        [IsSearchable]
        [Analyzer(AnalyzerName.AsString.EnMicrosoft)]
        public string Description { get; set; }

        [IsSearchable]
        [Analyzer(AnalyzerName.AsString.FrMicrosoft)]
        [JsonProperty("Description_fr")]
        public string DescriptionFr { get; set; }

        [IsSearchable, IsFilterable, IsFacetable]
        public string Type { get; set; }

        [IsFilterable, IsFacetable]
        public double? BaseRate { get; set; }

        [IsSearchable, IsFilterable, IsFacetable]
        public string BedOptions { get; set; }

        [IsFilterable, IsFacetable]
        public int SleepsCount { get; set; }

        [IsFilterable, IsFacetable]
        public bool? SmokingAllowed { get; set; }

        [IsSearchable, IsFilterable, IsFacetable]
        public string[] Tags { get; set; }
    }
}

.NET 'teki veri modeliniz ve ilgili dizin şeması, son kullanıcıya vermek istediğiniz arama deneyimini destekleyecek şekilde tasarlanmalıdır.Your data model in .NET and its corresponding index schema should be designed to support the search experience you'd like to give to your end user. .NET 'teki her üst düzey nesne, dizinde bulunan IE belgesi, Kullanıcı arabiriminizdeki mevcut bir arama sonucuna karşılık gelir.Each top level object in .NET, ie document in the index, corresponds to a search result you would present in your user interface. Örneğin, bir otel arama uygulamasında son kullanıcılarınızın otel adına, otel özelliklerine veya belirli bir odanın özelliklerine göre arama yapmak isteyebilirsiniz.For example, in a hotel search application your end users may want to search by hotel name, features of the hotel, or the characteristics of a particular room. Biraz daha sonra bazı sorgu örnekleri ele alınacaktır.We'll cover some query examples a little later.

Dizindeki belgelerle etkileşim kurmak için kendi sınıflarınızı kullanma özelliği her iki yönde de işe yarar; Ayrıca, bir sonraki bölümde göreceğiniz gibi, arama sonuçlarını alabilir ve SDK 'nın bunları dilediğiniz bir tür için otomatik olarak seri durumdan çıkarabilmeniz gerekir.This ability to use your own classes to interact with documents in the index works in both directions; You can also retrieve search results and have the SDK automatically deserialize them to a type of your choice, as we will see in the next section.

Not

Azure Bilişsel Arama .NET SDK, alan adlarının alan değerlerine anahtar/değer eşlemesi olan Document sınıfını kullanarak dinamik olarak yazılmış belgeleri de destekler.The Azure Cognitive Search .NET SDK also supports dynamically-typed documents using the Document class, which is a key/value mapping of field names to field values. Bu durum, tasarım sırasında dizin şemasını bilmediğiniz veya belirli model sınıflarına bağlamanın kullanışlı olmayacağı senaryolarda kullanışlıdır.This is useful in scenarios where you don't know the index schema at design-time, or where it would be inconvenient to bind to specific model classes. SDK'da belgelerle ilgili tüm yöntemler, Document sınıfıyla çalışan aşırı yüklerin yanı sıra genel türde bir parametre alan kesin tür belirtilmiş aşırı yüklere de sahiptir.All the methods in the SDK that deal with documents have overloads that work with the Document class, as well as strongly-typed overloads that take a generic type parameter. Bu öğreticideki örnek kodda yalnızca ikincisi kullanılır.Only the latter are used in the sample code in this tutorial. Document sınıfı Dictionary<string, object>devralır.The Document class inherits from Dictionary<string, object>.

Neden boş değer atanabilir türleri kullanmalısınız?Why you should use nullable data types

Kendi model sınıflarınızı bir Azure Bilişsel Arama diziniyle eşlenecek şekilde tasarlarken, bool ve int gibi değer türlerinin özelliklerini (örneğin, boolyerine bool?) bildirmenizi öneririz.When designing your own model classes to map to an Azure Cognitive Search index, we recommend declaring properties of value types such as bool and int to be nullable (for example, bool? instead of bool). Boş değer atanamayan bir özellik kullanırsanız buna karşılık gelen alan için dizininizdeki hiçbir belgenin boş bir değer içermediğini garanti etmeniz gerekir.If you use a non-nullable property, you have to guarantee that no documents in your index contain a null value for the corresponding field. SDK ne de Azure Bilişsel Arama hizmeti bunu zorunlu kılmaya yardımcı olacaktır.Neither the SDK nor the Azure Cognitive Search service will help you to enforce this.

Bu yalnızca kuramsal bir sorun değildir: Var olan Edm.Int32 türünde bir dizine yeni bir alan eklediğiniz bir senaryoyu düşünün.This is not just a hypothetical concern: Imagine a scenario where you add a new field to an existing index that is of type Edm.Int32. Dizin tanımını güncelleştirdikten sonra, tüm belgeler bu yeni alan için null değere sahip olur (çünkü tüm türler Azure Bilişsel Arama null yapılabilir olduğundan).After updating the index definition, all documents will have a null value for that new field (since all types are nullable in Azure Cognitive Search). Ardından bu alan için boş değer atanamayan bir int özelliğiyle bir model sınıfı kullanırsanız belgeleri almaya çalışırken bunun gibi bir JsonSerializationException alırsınız:If you then use a model class with a non-nullable int property for that field, you will get a JsonSerializationException like this when trying to retrieve documents:

Error converting value {null} to type 'System.Int32'. Path 'IntValue'.

Bu nedenle, en iyi uygulama olarak model sınıflarınızda boş değer atanabilir türler kullanmanızı öneririz.For this reason, we recommend that you use nullable types in your model classes as a best practice.

JSON.NET ile özel serileştirmeCustom Serialization with JSON.NET

SDK, belgeleri serileştirmek ve seri durumdan çıkarmak için JSON.NET kullanır.The SDK uses JSON.NET for serializing and deserializing documents. Kendi JsonConverter veya IContractResolvertanımlayarak gerekirse serileştirme ve seri durumdan çıkarma özelleştirebilirsiniz.You can customize serialization and deserialization if needed by defining your own JsonConverter or IContractResolver. Daha fazla bilgi için JSON.net belgelerinebakın.For more information, see the JSON.NET documentation. Bu, uygulamanızı Azure Bilişsel Arama ile kullanmak için mevcut bir model sınıfını ve diğer gelişmiş senaryoları uyarlamak istediğinizde yararlı olabilir.This can be useful when you want to adapt an existing model class from your application for use with Azure Cognitive Search, and other more advanced scenarios. Örneğin, özel serileştirme ile şunları yapabilirsiniz:For example, with custom serialization you can:

  • Model sınıfınızın belirli özelliklerini belge alanları olarak depolanmak üzere dahil edin veya hariç tutun.Include or exclude certain properties of your model class from being stored as document fields.
  • Kodunuzda kodunuzun ve alan adlarınızın Özellik adları arasında eşleme yapın.Map between property names in your code and field names in your index.
  • Belge alanlarına özellikleri eşlemek için kullanılabilecek özel öznitelikler oluşturun.Create custom attributes that can be used for mapping properties to document fields.

GitHub 'da Azure Bilişsel Arama .NET SDK için birim testlerinde özel serileştirme uygulama örneklerini bulabilirsiniz.You can find examples of implementing custom serialization in the unit tests for the Azure Cognitive Search .NET SDK on GitHub. Bu klasöriyi bir başlangıç noktasıdır.A good starting point is this folder. Özel serileştirme testleri tarafından kullanılan sınıfları içerir.It contains classes that are used by the custom serialization tests.

Dizinde belge aramaSearching for documents in the index

Örnek uygulamadaki son adım, dizinde bazı belgeleri aramak içindir:The last step in the sample application is to search for some documents in the index:

private static void RunQueries(ISearchIndexClient indexClient)
{
    SearchParameters parameters;
    DocumentSearchResult<Hotel> results;

    Console.WriteLine("Search the entire index for the term 'motel' and return only the HotelName field:\n");

    parameters =
        new SearchParameters()
        {
            Select = new[] { "HotelName" }
        };

    results = indexClient.Documents.Search<Hotel>("motel", parameters);

    WriteDocuments(results);

    Console.Write("Apply a filter to the index to find hotels with a room cheaper than $100 per night, ");
    Console.WriteLine("and return the hotelId and description:\n");

    parameters =
        new SearchParameters()
        {
            Filter = "Rooms/any(r: r/BaseRate lt 100)",
            Select = new[] { "HotelId", "Description" }
        };

    results = indexClient.Documents.Search<Hotel>("*", parameters);

    WriteDocuments(results);

    Console.Write("Search the entire index, order by a specific field (lastRenovationDate) ");
    Console.Write("in descending order, take the top two results, and show only hotelName and ");
    Console.WriteLine("lastRenovationDate:\n");

    parameters =
        new SearchParameters()
        {
            OrderBy = new[] { "LastRenovationDate desc" },
            Select = new[] { "HotelName", "LastRenovationDate" },
            Top = 2
        };

    results = indexClient.Documents.Search<Hotel>("*", parameters);

    WriteDocuments(results);

    Console.WriteLine("Search the entire index for the term 'hotel':\n");

    parameters = new SearchParameters();
    results = indexClient.Documents.Search<Hotel>("hotel", parameters);

    WriteDocuments(results);
}

Sorgu her yürütüldüğünde, bu yöntem ilk olarak yeni bir SearchParameters nesnesi oluşturur.Each time it executes a query, this method first creates a new SearchParameters object. Bu nesne, sorgu için sıralama, filtreleme, sayfalama ve Faks oluşturma gibi ek seçenekleri belirtmek için kullanılır.This object is used to specify additional options for the query such as sorting, filtering, paging, and faceting. Bu yöntemde, farklı sorgular için Filter, Select, OrderByve Top özelliği ayarlıyoruz.In this method, we're setting the Filter, Select, OrderBy, and Top property for different queries. Tüm SearchParameters özellikleri buradabelgelenmiştir.All the SearchParameters properties are documented here.

Sonraki adım aslında arama sorgusunu yürütmekte.The next step is to actually execute the search query. Aramayı çalıştırmak Documents.Search yöntemi kullanılarak yapılır.Running the search is done using the Documents.Search method. Her sorgu için arama metnini bir dize olarak (veya arama metni yoksa "*") ve daha önce oluşturulan arama parametrelerini geçiririz.For each query, we pass the search text to use as a string (or "*" if there is no search text), plus the search parameters created earlier. Ayrıca, SDK 'nın arama sonuçlarındaki belgelerin Hoteltüründeki nesnelere serisini kaldırmak için Documents.Searchtür parametresi olarak Hotel belirttik.We also specify Hotel as the type parameter for Documents.Search, which tells the SDK to deserialize documents in the search results into objects of type Hotel.

Not

Arama sorgusu ifade sözdizimi hakkında daha fazla bilgiyi buradabulabilirsiniz.You can find more information about the search query expression syntax here.

Son olarak, her bir sorgudan bu yöntem her bir belgeyi konsola yazdırarak arama sonuçlarındaki tüm eşleştirmelerle yinelenir:Finally, after each query this method iterates through all the matches in the search results, printing each document to the console:

private static void WriteDocuments(DocumentSearchResult<Hotel> searchResults)
{
    foreach (SearchResult<Hotel> result in searchResults.Results)
    {
        Console.WriteLine(result.Document);
    }

    Console.WriteLine();
}

Her sorguya sırayla daha yakından göz atalım.Let's take a closer look at each of the queries in turn. İlk sorguyu yürütmek için kod aşağıda verilmiştir:Here is the code to execute the first query:

parameters =
    new SearchParameters()
    {
        Select = new[] { "HotelName" }
    };

results = indexClient.Documents.Search<Hotel>("motel", parameters);

WriteDocuments(results);

Bu durumda, herhangi bir aranabilir alanda "Motel" sözcüğünün tüm dizinini arıyor ve yalnızca Select parametresi tarafından belirtilen otel adlarını almak istiyoruz.In this case, we're searching the entire index for the word "motel" in any searchable field and we only want to retrieve the hotel names, as specified by the Select parameter. Sonuçlar şunlardır:Here are the results:

Name: Secret Point Motel

Name: Twin Dome Motel

Sonraki sorgu biraz daha ilginç.The next query is a little more interesting. Gece ücreti $100 ' den az olan ve yalnızca otel KIMLIĞI ve açıklama döndüren bir salya sahip olan oteller bulmak istiyoruz:We want to find any hotels that have a room with a nightly rate of less than $100 and return only the hotel ID and description:

parameters =
    new SearchParameters()
    {
        Filter = "Rooms/any(r: r/BaseRate lt 100)",
        Select = new[] { "HotelId", "Description" }
    };

results = indexClient.Documents.Search<Hotel>("*", parameters);

WriteDocuments(results);

Bu sorgu, dizindeki belgeleri filtrelemek için Rooms/any(r: r/BaseRate lt 100)bir OData $filter ifadesi kullanır.This query uses an OData $filter expression, Rooms/any(r: r/BaseRate lt 100), to filter the documents in the index. Bu, Oda koleksiyonundaki her öğeye ' BaseRate lt 100 ' öğesini uygulamak için Any işlecini kullanır.This uses the any operator to apply the 'BaseRate lt 100' to every item in the Rooms collection. Azure Bilişsel Arama tarafından desteklenen ODatasözdizimi hakkında daha fazla bilgi edinebilirsiniz.You can find out more about the OData syntax that Azure Cognitive Search supports here.

Sorgunun sonuçları aşağıdadır:Here are the results of the query:

HotelId: 1
Description: The hotel is ideally located on the main commercial artery of the city in the heart of New York...

HotelId: 2
Description: The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to...

Daha sonra, en son yeniden kiralanan en son iki otelyi bulmak istiyoruz ve otel adını ve son yeniden oluşturma tarihini gösterir.Next, we want to find the top two hotels that have been most recently renovated, and show the hotel name and last renovation date. Kod aşağıdaki gibidir:Here is the code:

parameters =
    new SearchParameters()
    {
        OrderBy = new[] { "LastRenovationDate desc" },
        Select = new[] { "HotelName", "LastRenovationDate" },
        Top = 2
    };

results = indexClient.Documents.Search<Hotel>("*", parameters);

WriteDocuments(results);

Bu durumda, lastRenovationDate descolarak OrderBy parametresini belirtmek için OData söz dizimini kullanırız.In this case, we again use OData syntax to specify the OrderBy parameter as lastRenovationDate desc. Ayrıca yalnızca en üstteki iki belgeyi aldığınızdan emin olmak için Top 2 olarak ayarlandık.We also set Top to 2 to ensure we only get the top two documents. Daha önce olduğu gibi, hangi alanların döndürüleceğini belirlemek için Select ayarlayacağız.As before, we set Select to specify which fields should be returned.

Sonuçlar şunlardır:Here are the results:

Name: Fancy Stay        Last renovated on: 6/27/2010 12:00:00 AM +00:00
Name: Roach Motel       Last renovated on: 4/28/1982 12:00:00 AM +00:00

Son olarak, "otel" kelimesiyle eşleşen tüm oteller adlarını bulmak istiyoruz:Finally, we want to find all hotels names that match the word "hotel":

parameters = new SearchParameters()
{
    SearchFields = new[] { "HotelName" }
};
results = indexClient.Documents.Search<Hotel>("hotel", parameters);

WriteDocuments(results);

Select özelliğini belirttiğimiz için tüm alanları içeren sonuçlar şunlardır:And here are the results, which include all fields since we did not specify the Select property:

HotelId: 3
Name: Triple Landscape Hotel
...

Bu adım öğreticiyi tamamlar, ancak burada durmayın.This step completes the tutorial, but don't stop here. * * Sonraki adımlarda, Azure Bilişsel Arama hakkında daha fazla bilgi edinmek için ek kaynaklar sağlanır.**Next steps provide additional resources for learning more about Azure Cognitive Search.

Sonraki adımlarNext steps