.NET uygulamasında Azure.Search.Documents'ı kullanma

Bu makalede, .NET için Azure SDK'da C# ve Azure.Search.Documents (sürüm 11) istemci kitaplığını kullanarak arama nesnelerinin nasıl oluşturulacağı ve yönetileceğini açıklanmaktadır.

Sürüm 11 hakkında

.NET için Azure SDK, Azure SDK ekibinden bir Azure.Search.Documents istemci kitaplığı içerir ve bu kitaplık, önceki istemci kitaplığı olan Microsoft.Azure.Search ile işlevsel olarak eşdeğerdir. Sürüm 11, Azure programlama açısından daha tutarlıdır. Bazı örnekler arasında anahtar kimlik doğrulaması ve JSON serileştirmesi için System.Text.Json.Serialization sayılabilirAzureKeyCredential.

Önceki sürümlerde olduğu gibi, aşağıdakiler için de bu kitaplığı kullanabilirsiniz:

  • Arama dizinleri, veri kaynakları, dizin oluşturucular, beceri kümeleri ve eş anlamlı haritalar oluşturma ve yönetme
  • Dizindeki arama belgelerini yükleme ve yönetme
  • HTTP ve JSON ayrıntılarıyla ilgilenmek zorunda kalmadan sorgu yürütme
  • Yapay zeka zenginleştirme (beceri kümeleri) ve çıkışlarını çağırma ve yönetme

Kitaplık, bir arama hizmetine programlı erişim için kullanılan tüm API'leri içeren tek bir NuGet paketi olarak dağıtılır.

İstemci kitaplığı , ve gibi SearchIndexsınıfların yanı sıra ve gibi SearchIndexClient.CreateIndex işlemleri SearchClient.Search ve SearchClient sınıflarını SearchIndexClient SearchDocumenttanımlar. SearchField Bu sınıflar aşağıdaki ad alanlarında düzenlenmiştir:

Sürüm 11, 2020-06-30 arama hizmeti belirtimini hedefler.

İstemci kitaplığı, arama hizmetleri oluşturma ve ölçeklendirme ve API anahtarlarını yönetme gibi hizmet yönetimi işlemleri sağlamaz. Arama kaynaklarınızı bir .NET uygulamasından yönetmeniz gerekiyorsa.NET için Azure SDK'sında Microsoft.Azure.Management.Search kitaplığını kullanın.

v11'e yükseltme

.NET SDK'sının önceki sürümünü kullanıyorsanız ve genel kullanıma sunulan geçerli sürüme yükseltmek istiyorsanız bkz . Azure AI Search .NET SDK sürüm 11'e yükseltme.

SDK gereksinimleri

.NET için Azure SDK, .NET Standard 2.0 ile uyumludur.

Örnek uygulama

Bu makalede, Azure AI Search'teki temel kavramları ve arama dizini oluşturma, yükleme ve sorgulama konularını göstermek için GitHub'daki DotNetHowTo kod örneğine dayanarak örnek gösterilmektedir.

Bu makalenin geri kalanında, sonuçlarla eşleşen birkaç sorguyla birkaç belgeyle doldurulmuş hotels adlı yeni bir dizin varsayın.

Aşağıdaki örnekte, genel akışla birlikte ana program gösterilmektedir:

// 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();

    SearchIndexClient indexClient = CreateSearchIndexClient(configuration);

    string indexName = configuration["SearchIndexName"];

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

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

    SearchClient searchClient = indexClient.GetSearchClient(indexName);

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

    SearchClient indexClientForQueries = CreateSearchClientForQueries(indexName, configuration);

    Console.WriteLine("{0}", "Run queries...\n");
    RunQueries(indexClientForQueries);

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

Ardından, bu uygulamayı geçerli bir hizmet adı ve API anahtarlarıyla çalıştırdığınız varsayılarak çıktının kısmi ekran görüntüsü verilmiştir:

Örnek programdan Console.WriteLine çıkışının ekran görüntüsü.

İstemci türleri

İstemci kitaplığı çeşitli işlemler için üç istemci türü kullanır: SearchIndexClient dizinleri oluşturmak, güncelleştirmek veya silmek, SearchClient bir dizini yüklemek veya sorgulamak ve dizin oluşturucular ve SearchIndexerClient beceri kümeleriyle çalışmak. Bu makale ilk ikisine odaklanır.

En azından tüm istemciler hizmet adını veya uç noktayı ve bir API anahtarını gerektirir. DotNetHowTo örnek uygulamasının appsettings.json dosyasında bulduğunuza benzer şekilde, bu bilgileri bir yapılandırma dosyasında sağlamak yaygın bir işlemdir. Yapılandırma dosyasından okumak için programınıza ekleyin using Microsoft.Extensions.Configuration; .

Aşağıdaki deyim dizin oluşturmak, güncelleştirmek veya silmek için kullanılan dizin istemcisini oluşturur. Bir hizmet uç noktası ve yönetici API anahtarı alır.

private static SearchIndexClient CreateSearchIndexClient(IConfigurationRoot configuration)
{
    string searchServiceEndPoint = configuration["YourSearchServiceEndPoint"];
    string adminApiKey = configuration["YourSearchServiceAdminApiKey"];

    SearchIndexClient indexClient = new SearchIndexClient(new Uri(searchServiceEndPoint), new AzureKeyCredential(adminApiKey));
    return indexClient;
}

Sonraki deyim, belgeleri yüklemek veya sorgu çalıştırmak için kullanılan arama istemcisini oluşturur. SearchClient bir dizin gerektirir. Belgeleri yüklemek için bir yönetici API anahtarına ihtiyacınız vardır, ancak sorguları çalıştırmak için sorgu API'sini kullanabilirsiniz.

string indexName = configuration["SearchIndexName"];

private static SearchClient CreateSearchClientForQueries(string indexName, IConfigurationRoot configuration)
{
    string searchServiceEndPoint = configuration["YourSearchServiceEndPoint"];
    string queryApiKey = configuration["YourSearchServiceQueryApiKey"];

    SearchClient searchClient = new SearchClient(new Uri(searchServiceEndPoint), indexName, new AzureKeyCredential(queryApiKey));
    return searchClient;
}

Not

İçeri aktarma işlemi için geçersiz bir anahtar sağlarsanız (örneğin, yönetici anahtarının gerekli olduğu bir sorgu anahtarı), SearchClient üzerinde ilk kez bir işlem yöntemi çağırdığınızda Yasak hata iletisiyle bir oluştururCloudException. Böyle bir durumla karşınıza çıkarsa API anahtarını bir kez daha denetleyin.

Dizini silme

Geliştirmenin ilk aşamalarında, güncelleştirilmiş bir DeleteIndex tanımla yeniden oluşturabilmek için devam eden bir dizini silmek için bir deyim eklemek isteyebilirsiniz. Azure AI Search için örnek kod genellikle örneği yeniden çalıştırabilmeniz için bir silme adımı içerir.

Aşağıdaki satır şunu çağırır DeleteIndexIfExists:

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

Bu yöntem, dizinin mevcut olup olmadığını denetlemek için verilen SearchIndexClient öğesini kullanır ve varsa siler:

private static void DeleteIndexIfExists(string indexName, SearchIndexClient indexClient)
{
    try
    {
        if (indexClient.GetIndex(indexName) != null)
        {
            indexClient.DeleteIndex(indexName);
        }
    }
    catch (RequestFailedException e) when (e.Status == 404)
    {
        // Throw an exception if the index name isn't found
        Console.WriteLine("The index doesn't exist. No deletion occurred.");

Not

Bu makaledeki örnek kod, kolaylık sağlamak için zaman uyumlu yöntemleri kullanır, ancak bunları ölçeklenebilir ve duyarlı tutmak için kendi uygulamalarınızda zaman uyumsuz yöntemleri kullanmanız gerekir. Örneğin, önceki yöntemde yerine DeleteIndexkullanabilirsinizDeleteIndexAsync.

Dizin oluşturma

Dizin oluşturmak için kullanabilirsiniz SearchIndexClient .

Aşağıdaki yöntem, yeni SearchIndex dizinin şemasını tanımlayan nesnelerin listesiyle SearchField yeni bir nesne oluşturur. Her alanın bir adı, veri türü ve arama davranışını tanımlayan çeşitli öznitelikleri vardır.

Alanlar kullanılarak FieldBuilderbir model sınıfından tanımlanabilir. sınıfı, FieldBuilder verilen Hotel model sınıfının genel özelliklerini ve özniteliklerini inceleyerek dizine yönelik nesnelerin listesini SearchField oluşturmak için yansımayı kullanır. Daha sonra sınıfa Hotel daha yakından bakacağız.

private static void CreateIndex(string indexName, SearchIndexClient indexClient)
{
    FieldBuilder fieldBuilder = new FieldBuilder();
    var searchFields = fieldBuilder.Build(typeof(Hotel));

    var definition = new SearchIndex(indexName, searchFields);

    indexClient.CreateOrUpdateIndex(definition);
}

Alanların yanı sıra, dizine puanlama profilleri, önericiler veya CORS seçenekleri de ekleyebilirsiniz (bu parametreler örnekten kısa bir süre için atlanır). Nesne ve bileşenleri hakkında SearchIndex daha fazla bilgiyi SearchIndex özellikleri listesinde ve REST API başvurusunda bulabilirsiniz.

Not

Gerekirse kullanmak FieldBuilder yerine her zaman doğrudan nesne listesi Field oluşturabilirsiniz. Örneğin, bir model sınıfı kullanmak istemeyebilir veya öznitelik ekleyerek değiştirmek istemediğiniz mevcut bir model sınıfını kullanmanız gerekebilir.

Main() içinde CreateIndex çağrısı

Main yukarıdaki yöntemi çağırarak yeni bir oteller dizini oluşturur:

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

Veri gösterimi için model sınıfı kullanma

DotNetHowTo örneği Otel, Adres ve Oda veri yapıları için model sınıflarını kullanır. Hotel başvurular Address, tek düzeyli karmaşık tür (çok parçalı alan) ve Room (çok parçalı alanlar koleksiyonu).

Dizini oluşturup yüklemek ve bir sorgudan yanıtı yapılandırmak için şu türleri kullanabilirsiniz:

// Use-case: <Hotel> in a field definition
FieldBuilder fieldBuilder = new FieldBuilder();
var searchFields = fieldBuilder.Build(typeof(Hotel));

// Use-case: <Hotel> in a response
private static void WriteDocuments(SearchResults<Hotel> searchResults)
{
    foreach (SearchResult<Hotel> result in searchResults.GetResults())
    {
        Console.WriteLine(result.Document);
    }

    Console.WriteLine();
}

Alternatif bir yaklaşım, doğrudan dizine alan eklemektir. Aşağıdaki örnekte yalnızca birkaç alan gösterilmektedir.

 SearchIndex index = new SearchIndex(indexName)
 {
     Fields =
         {
             new SimpleField("hotelId", SearchFieldDataType.String) { IsKey = true, IsFilterable = true, IsSortable = true },
             new SearchableField("hotelName") { IsFilterable = true, IsSortable = true },
             new SearchableField("hotelCategory") { IsFilterable = true, IsSortable = true },
             new SimpleField("baseRate", SearchFieldDataType.Int32) { IsFilterable = true, IsSortable = true },
             new SimpleField("lastRenovationDate", SearchFieldDataType.DateTimeOffset) { IsFilterable = true, IsSortable = true }
         }
 };

Alan tanımları

.NET'teki veri modeliniz ve buna karşılık gelen dizin şeması, son kullanıcınıza vermek istediğiniz arama deneyimini desteklemelidir. Arama dizinindeki arama belgesi gibi .NET'teki her üst düzey nesne, kullanıcı arabiriminizde sunacağınız bir arama sonucuna karşılık gelir. Örneğin, bir otel arama uygulamasında son kullanıcılarınız otel adına, otelin özelliklerine veya belirli bir odanın özelliklerine göre arama yapmak isteyebilir.

Her sınıfta bir alan, nasıl kullanıldığını belirleyen bir veri türü ve öznitelikleriyle tanımlanır. Her sınıftaki her ortak özelliğin adı, dizin tanımında aynı ada sahip bir alanla eşler.

Hotel sınıfından birkaç alan tanımı çeken aşağıdaki kod parçacığına göz atın. ve'nin Rooms kendi sınıf tanımlarına sahip C# türleri olduğuna Address dikkat edin (bunları görüntülemek istiyorsanız örnek koda bakın). Her ikisi de karmaşık türlerdir. Daha fazla bilgi için bkz . Karmaşık türleri modelleme.

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(IsFilterable = true, IsSortable = true, IsFacetable = true)]
    public string Category { get; set; }

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

    [SearchableField]
    public Address Address { get; set; }

    public Room[] Rooms { get; set; }

Alan sınıfı seçme

Alanları tanımlarken, temel SearchField sınıfı kullanabilir veya önceden yapılandırılmış özelliklere sahip şablonlar olarak hizmet veren türev yardımcı modelleri kullanabilirsiniz.

Dizininizdeki tam olarak bir alanın belge anahtarı (IsKey = true) olarak görev yapması gerekir. Bu bir dize olmalı ve her belgeyi benzersiz olarak tanımlamalıdır. ayrıca olması IsHidden = truegerekir; bu da arama sonuçlarında görünebileceği anlamına gelir.

Alan türü Açıklama ve kullanım
SearchField Temel sınıf, çoğu özelliği null olarak ayarlanmıştır, ancak Name gerekli olan ve AnalyzerName varsayılan olarak standart Lucene'dir.
SimpleField Yardımcı model. 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 . Bu durumda, belge kimliği gibi IsKey = true senaryo için gerekli olan öznitelikleri uyguladığınıza emin olun. Daha fazla bilgi için bkz . kaynak kodunda SimpleFieldAttribute.cs .
SearchableField Yardımcı model. 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 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, önceki örnekte gösterildiği gibi IsFilterable, IsSortable ve IsFacetable açıkça ilişkilendirilmelidir.

Alan öznitelikleri ekleme

Her alanın , , IsSortableIsKeyve AnalyzerNamegibi IsFilterableözniteliklerle nasıl dekore olduğuna dikkat edin. Bu öznitelikler, bir Azure AI Search dizinindeki ilgili alan öznitelikleriyle doğrudan eşler. sınıfı, FieldBuilder dizin için alan tanımları oluşturmak için bu özellikleri kullanır.

Alan türü eşlemesi

Özelliklerin .NET türleri, dizin tanımındaki eşdeğer alan türleriyle eşler. Örneğin, Category dize özelliği Edm.String türündeki category alanına eşlenir. , , Edm.BooleanDateTimeOffset?ve Edm.DateTimeOffset benzeri arasında bool?benzer tür eşlemeleri vardır.

Bu özelliği fark SmokingAllowed ettiniz mi?

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

JsonIgnore Bu özellik üzerindeki özniteliği, dizinini alan olarak seri hale getirmemelerini söylerFieldBuilder. Bu, uygulamanızda yardımcı olarak kullanabileceğiniz istemci tarafı hesaplanmış özellikleri oluşturmanın harika bir yoludur. Bu durumda, SmokingAllowed özellik koleksiyondaki herhangi bir Room kullanıcının Rooms sigara içmeye izin verip vermediğini yansıtır. Her şey yanlışsa, otelin tamamında sigara içilmez.

Dizin yükleme

içindeki bir sonraki adım Main , yeni oluşturulan oteller dizinini doldurur. Bu dizin popülasyonu şu yöntemde gerçekleştirilir: (Bazı kodlar çizim amacıyla ile ... değiştirilir. Tam veri popülasyon kodu için tam örnek çözüme bakın.)

private static void UploadDocuments(SearchClient searchClient)
{
    IndexDocumentsBatch<Hotel> batch = IndexDocumentsBatch.Create(
        IndexDocumentsAction.Upload(
            new Hotel()
            {
                HotelId = "1",
                HotelName = "Stay-Kay City Hotel",
                ...
                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)",
                        ...
                    }
                }
            }),
        IndexDocumentsAction.Upload(
            new Hotel()
            {
                HotelId = "2",
                HotelName = "Old Century Hotel",
                ...
                {
                    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)",
                        ...
                    }
                }
            }),
        IndexDocumentsAction.Upload(
            new Hotel()
            {
                HotelId = "3",
                HotelName = "Gastronomic 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)",
                        ...
                    }
                }
            }
        };

    try
    {
        IndexDocumentsResult result = searchClient.IndexDocuments(batch);
    }
    catch (Exception)
    {
        // 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}");
    }

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

Bu yöntemin dört bölümü vardır. İlki, dizine yüklenecek giriş verilerimiz olarak hizmet veren üç nesneden oluşan üç Room nesneden oluşan Hotel bir dizi oluşturur. Bu veriler basitlik açısından sabit kodlanmıştır. Gerçek bir uygulamada veriler büyük olasılıkla SQL veritabanı gibi bir dış veri kaynağından gelir.

İkinci bölüm, belgeleri içeren bir IndexDocumentsBatch oluşturur. Toplu işleme uygulamak istediğiniz işlemi, bu durumda öğesini çağırarak IndexDocumentsAction.Uploadoluştururken belirtirsiniz. Toplu işlem daha sonra yöntemiyle Azure AI Search dizinine IndexDocuments yüklenir.

Not

Bu örnekte yalnızca belgeleri karşıya yüklüyorsunuz. Değişiklikleri var olan belgelerle birleştirmek veya silmek istiyorsanız, , IndexDocumentsAction.MergeOrUploadveya IndexDocumentsAction.Delete çağırarak IndexDocumentsAction.Mergetoplu iş oluşturabilirsiniz. Ayrıca, her biri Azure AI Search'e belge üzerinde belirli bir işlemi gerçekleştirmesini söyleyen bir nesne koleksiyonu IndexDocumentsAction alan öğesini çağırarak IndexBatch.Newfarklı işlemleri tek bir toplu işlemde karıştırabilirsiniz. , gibi IndexDocumentsAction.MergeIndexAction.Uploadilgili yöntemi çağırarak her IndexDocumentsAction bir işlemi kendi işlemiyle oluşturabilirsiniz.

Bu yöntemin üçüncü bölümü, dizin oluşturma için önemli bir hata durumunu işleyen bir catch bloğudur. Arama hizmetiniz toplu işlemdeki bazı belgelerin dizinini oluşturamazsa, bir RequestFailedException oluşturulur. Hizmetiniz yoğun yük altındayken belgeleri dizine eklerken bir özel durum oluşabilir. Bu durumu, kodunuzda açık şekilde işlemenizi kesinlikle öneririz. 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. Alternatif olarak, başarısız dizin oluşturma eylemleri için akıllı toplu işlem, otomatik temizleme ve yeniden denemeler için SearchIndexingBufferedSender'ı kullanabilirsiniz. Daha fazla bağlam için SearchIndexingBufferedSender örneğine bakın.

Son olarak, UploadDocuments yöntem iki saniye boyunca geciktirildi. Dizin oluşturma, arama hizmetinizde zaman uyumsuz olarak gerçekleşir, bu nedenle belgelerin aranabilmesi için örnek uygulamanın kısa bir süre beklemesi gerekir. Bu gibi gecikmeler genellikle yalnızca gösterilerde, testlerde ve örnek uygulamalarda gereklidir.

Main() içinde UploadDocuments Çağrısı

Aşağıdaki kod parçacığı, indexClient yöntemini kullanarak GetSearchClient bir örneğini SearchClient ayarlar. indexClient, isteklerinde belgeleri yüklemek veya yenilemek için gereken bir yönetici API anahtarı kullanır.

Alternatif bir yaklaşım, üzerinde bir yönetici API anahtarı geçirerek doğrudan çağırmaktır SearchClient AzureKeyCredential.

SearchClient searchClient = indexClient.GetSearchClient(indexName);

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

Sorgu çalıştırma

İlk olarak, appsettings.json hizmet uç noktasını ve sorgu API anahtarını okuyan bir SearchClient ayarlayın:

private static SearchClient CreateSearchClientForQueries(string indexName, IConfigurationRoot configuration)
{
    string searchServiceEndPoint = configuration["YourSearchServiceEndPoint"];
    string queryApiKey = configuration["YourSearchServiceQueryApiKey"];

    SearchClient searchClient = new SearchClient(new Uri(searchServiceEndPoint), indexName, new AzureKeyCredential(queryApiKey));
    return searchClient;
}

İkincisi, sorgu isteği gönderen bir yöntem tanımlayın.

Yöntem her sorgu yürüttüğünde yeni SearchOptions bir nesne oluşturur. Bu nesne, sorgu için sıralama, filtreleme, sayfalama ve model oluşturma gibi ek seçenekleri belirtmek için kullanılır. Bu yöntemde, farklı sorgular için , Selectve OrderBy özelliğini ayarlıyoruzFilter. Arama sorgusu ifadesi söz dizimi hakkında daha fazla bilgi için Basit sorgu söz dizimi.

Sonraki adım sorgu yürütmedir. Aramanın çalıştırılması yöntemi kullanılarak SearchClient.Search yapılır. Her sorgu için, dize olarak kullanılacak arama metnini (veya "*" arama metni yoksa) ve daha önce oluşturulan arama seçeneklerini geçirin. Ayrıca, SDK'ya arama sonuçlarındaki belgeleri türündeki nesnelere seri durumdan çıkarmasını söyleyen için tür Hotelparametresi SearchClient.Searcholarak da belirteceğizHotel.

private static void RunQueries(SearchClient searchClient)
{
    SearchOptions options;
    SearchResults<Hotel> results;

    Console.WriteLine("Query 1: Search for 'motel'. Return only the HotelName in results:\n");

    options = new SearchOptions();
    options.Select.Add("HotelName");

    results = searchClient.Search<Hotel>("motel", options);

    WriteDocuments(results);

    Console.Write("Query 2: Apply a filter to find hotels with rooms cheaper than $100 per night, ");
    Console.WriteLine("returning the HotelId and Description:\n");

    options = new SearchOptions()
    {
        Filter = "Rooms/any(r: r/BaseRate lt 100)"
    };
    options.Select.Add("HotelId");
    options.Select.Add("Description");

    results = searchClient.Search<Hotel>("*", options);

    WriteDocuments(results);

    Console.Write("Query 3: 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");

    options =
        new SearchOptions()
        {
            Size = 2
        };
    options.OrderBy.Add("LastRenovationDate desc");
    options.Select.Add("HotelName");
    options.Select.Add("LastRenovationDate");

    results = searchClient.Search<Hotel>("*", options);

    WriteDocuments(results);

    Console.WriteLine("Query 4: Search the HotelName field for the term 'hotel':\n");

    options = new SearchOptions();
    options.SearchFields.Add("HotelName");

    //Adding details to select, because "Location" isn't supported yet when deserializing search result to "Hotel"
    options.Select.Add("HotelId");
    options.Select.Add("HotelName");
    options.Select.Add("Description");
    options.Select.Add("Category");
    options.Select.Add("Tags");
    options.Select.Add("ParkingIncluded");
    options.Select.Add("LastRenovationDate");
    options.Select.Add("Rating");
    options.Select.Add("Address");
    options.Select.Add("Rooms");

    results = searchClient.Search<Hotel>("hotel", options);

    WriteDocuments(results);
}

Üçüncüsü, yanıtı yazan ve her belgeyi konsola yazdıran bir yöntem tanımlayın:

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

    Console.WriteLine();
}

Main() içinde RunQueries'i çağırma

SearchClient indexClientForQueries = CreateSearchClientForQueries(indexName, configuration);

Console.WriteLine("{0}", "Running queries...\n");
RunQueries(indexClientForQueries);

Sorgu yapılarını keşfetme

Şimdi sırayla sorguların her birine daha yakından bakalım. İlk sorguyu yürütmek için kod aşağıdadır:

options = new SearchOptions();
options.Select.Add("HotelName");

results = searchClient.Search<Hotel>("motel", options);

WriteDocuments(results);

Bu durumda, aranabilir herhangi bir alanda motel sözcüğünün tüm dizinini arıyoruz ve yalnızca seçenekte Select belirtildiği gibi otel adlarını almak istiyoruz. Sonuçlar şunlardır:

Name: Stay-Kay City Hotel

Name: Old Century Hotel

İkinci sorguda, gecelik fiyatı 100 TL'nin altında olan odaları seçmek için filtre kullanın. Sonuçlarda yalnızca otel kimliğini ve açıklamasını döndür:

options = new SearchOptions()
{
    Filter = "Rooms/any(r: r/BaseRate lt 100)"
};
options.Select.Add("HotelId");
options.Select.Add("Description");

results = searchClient.Search<Hotel>("*", options);

Bu sorgu, Rooms/any(r: r/BaseRate lt 100)dizindeki belgeleri filtrelemek için bir OData $filter ifadesi kullanır. Rooms koleksiyonundaki her öğeye 'BaseRate lt 100' uygulamak için herhangi bir işleci kullanır. Daha fazla bilgi için bkz . OData filtre söz dizimi.

Üçüncü sorguda, en son yenilenen ilk iki oteli bulun ve otel adını ve son yenileme tarihini gösterin. Kod şu şekildedir:

options =
    new SearchOptions()
    {
        Size = 2
    };
options.OrderBy.Add("LastRenovationDate desc");
options.Select.Add("HotelName");
options.Select.Add("LastRenovationDate");

results = searchClient.Search<Hotel>("*", options);

WriteDocuments(results);

Son sorguda, otel sözcüğüyle eşleşen tüm otel adlarını bulun:

options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Description");
options.Select.Add("Category");
options.Select.Add("Tags");
options.Select.Add("ParkingIncluded");
options.Select.Add("LastRenovationDate");
options.Select.Add("Rating");
options.Select.Add("Address");
options.Select.Add("Rooms");

results = searchClient.Search<Hotel>("hotel", options);

WriteDocuments(results);

Bu bölümde .NET SDK'sına giriş yapılır ancak burada durmayın. Sonraki bölümde, Azure AI Search ile programlama hakkında daha fazla bilgi edinmek için diğer kaynaklar önerildi.