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

Not

Azure Yapay Zeka Arama Azure portalı, REST API'leri ve Azure SDK’ları aracılığıyla kullanılabilir. Ayrıca kuruluş içeriğini Microsoft Foundry portalındaki aracılar için yeniden kullanılabilir, izin kullanan bilgi bankalarına dönüştüren yönetilen bilgi katmanı Foundry IQ'yu temel alır.

Bu makalede, C# ve Azure kullanarak arama nesnelerinin nasıl oluşturulacağı ve yönetileceğini açıklanmaktadır. .NET için Azure SDK Search.Documents istemci kitaplığı.

Aşağıdakiler dahil olmak üzere veri düzlemi işlemleri için 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ştirmelerini (beceri kümelerini) ve çıktılarını çalıştı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ığı, SearchIndex, SearchField ve SearchDocument gibi sınıfların yanı sıra SearchIndexClient.CreateIndex ve SearchClient.Search sınıflarında SearchIndexClient ve SearchClient gibi işlemleri tanımlar. Bu sınıflar aşağıdaki ad alanlarında düzenlenmiştir:

Azure. Search.Documents istemci 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'deki Azure.ResourceManager.Search kitaplığını kullanın.

SDK gereksinimleri

  • Visual Studio 2019 veya üzeri.

  • Azure AI Arama Hizmeti

  • Visual Studio'da Araçlar>> seçeneğini kullanarak NuGet paketini indirin. paket adını Azure.Search.Documentsarayın.

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

Örnek uygulama

Bu makalede, Azure Yapay Zeka Arama'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 yerde bir sorgu anahtarı), SearchClient üzerinde ilk kez bir işlem yöntemi çağırdığınızda, CloudException hata iletisini içeren bir oluşturur. Böyle bir durumla karşınıza çıkarsa API anahtarını bir kez daha denetleyin.

Dizini silme

Geliştirmenin ilk aşamalarında, güncellenmiş bir tanımla yeniden oluşturabilmek için, üzerinde çalışılan bir dizini silen bir DeleteIndex ifadesi eklemek isteyebilirsiniz. Azure Yapay Zeka Arama için örnek kod genellikle örneği yeniden çalıştırabilmeniz için bir silme adımı içerir.

Aşağıdaki satır DeleteIndexIfExists öğesini çağırır:

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 DeleteIndexAsync yerine DeleteIndex kullanabilirsiniz.

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, FieldBuilder kullanılarak bir model sınıfından tanımlanabilir. FieldBuilder sınıfı, verilen SearchField model sınıfının ortak özelliklerini ve özniteliklerini inceleyerek dizin için Hotel nesnelerinin bir listesini oluşturmak üzere yansımayı kullanır. Hotel sınıfını daha sonra daha yakından inceleyeceğiz.

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, Field kullanmak yerine FieldBuilder nesnelerinin listesini her zaman doğrudan 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, tek düzeyli karmaşık bir türe (çok parçalı bir alan) ve Address'ye (çok parçalı alanlardan oluşan bir koleksiyon) başvuran Room'e başvurur.

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 genel özelliğin adı, dizin tanımında aynı ada sahip bir alana eşlenir.

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

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 IsHidden = true bulunması gerekir; bu da arama sonuçlarında görünemeyeceğ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ünde olabilir, her zaman aranabilir değildir (tam metin arama sorgularında yok sayılır) ve alınabilirdir (gizli değildir). Diğer öznitelikler varsayılan olarak kapalıdır, ancak etkinleştirilebilir. Belge kimlikleri veya yalnızca filtrelerde, yüzlerde ya da puanlama profillerinde kullanılan alanlar için bir SimpleField kullanabilirsiniz. Bu durumda, belge kimliği için IsKey = true gibi senaryo açısından gerekli tüm öznitelikleri eklediğinizden emin olun. Daha fazla bilgi için, kaynak kodundaki SimpleFieldAttribute.cs dosyasına bakın.
SearchableField Yardımcı model. Bir dize olmalıdır ve her zaman aranabilir ve getirilebilir. 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 , , IsFilterableIsSortableve IsKeygibi AnalyzerNameözniteliklerle nasıl dekore olduğuna dikkat edin. Bu öznitelikler, Azure Yapay Zeka Arama dizinindeki ilgili alan özniteliklerine doğrudan karşılık gelir. 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ürlerine karşılık gelir. Örneğin, Category dize özelliği category türündeki Edm.String alanına eşlenir. bool?, Edm.Boolean, DateTimeOffset? ve Edm.DateTimeOffset arasında ve benzerleri için benzer tür eşlemeleri vardır.

SmokingAllowed özelliğini fark etmiş miydiniz?

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

Bu özelliğin üzerindeki JsonIgnore özniteliği, FieldBuilder bileşenine bunu dizine alan olarak serileştirmemesini söyler. Bu, uygulamanızda yardımcı olarak kullanabileceğiniz istemci tarafı hesaplanmış özellikleri oluşturmanın harika bir yoludur. Bu durumda, SmokingAllowed özelliği, Room koleksiyonundaki herhangi bir Rooms öğesinin sigara içmeye izin verip vermediğini yansıtır. Tümü false ise, bu, otelin tamamında sigara içilmesine izin verilmediğini gösterir.

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üklemek için giriş verilerimiz olarak kullanılan, her biri üç Hotel nesnesi içeren üç Room nesneden oluşan 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şe uygulamak istediğiniz işlemi, bu durumda oluşturma sırasında IndexDocumentsAction.Upload çağrısı yaparak belirtirsiniz. Toplu işlem daha sonra IndexDocuments yöntemiyle Azure Yapay Zeka Arama dizinine yüklenir.

Not

Bu örnekte yalnızca belgeleri yüklüyorsunuz. Değişiklikleri mevcut belgelerle birleştirmek veya belgeleri silmek istiyorsanız, bunun yerine IndexDocumentsAction.Merge, IndexDocumentsAction.MergeOrUpload ya da IndexDocumentsAction.Delete çağırarak toplu işlemler oluşturabilirsiniz. Ayrıca, belge üzerinde belirli bir işlemi gerçekleştirmesini Azure Yapay Zeka Arama’e bildiren IndexBatch.New nesnelerinden oluşan bir koleksiyon alan IndexDocumentsAction öğesini çağırarak, farklı işlemleri tek bir toplu işlemde birleştirebilirsiniz. IndexDocumentsAction, IndexDocumentsAction.Merge gibi ilgili yöntemi çağırarak her IndexAction.Upload öğesini 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şteki bazı belgeleri dizine ekleyemezse, bir RequestFailedException fırlatılır. 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'i çağırın

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

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

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ı SearchClientokuyan bir 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 , Filterve Select özelliğini ayarlıyoruzOrderBy. Arama sorgusu ifade söz dizimi hakkında daha fazla bilgi için, Basit sorgu söz dizimi.

Sonraki adım sorgu yürütmedir. Arama, SearchClient.Search yöntemi kullanılarak çalıştırı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, Hotel için tür parametresi olarak SearchClient.Search belirtiriz; bu, SDK'ya arama sonuçlarındaki belgeleri Hotel türündeki nesnelere seri durumdan çıkarmasını söyler.

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, dizindeki belgeleri filtrelemek için $filter olan bir OData Rooms/any(r: r/BaseRate lt 100) ifadesi kullanır. Rooms koleksiyonundaki her öğeye 'BaseRate lt 100' uygulamak için any işlecini 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 Yapay Zeka Arama ile programlama hakkında daha fazla bilgi edinmek için diğer kaynaklar önerildi.