.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 SearchIndex
sınıfların yanı sıra ve gibi SearchIndexClient.CreateIndex
işlemleri SearchClient.Search
ve SearchClient
sınıflarını SearchIndexClient
SearchDocument
tanımlar. SearchField
Bu sınıflar aşağıdaki ad alanlarında düzenlenmiştir:
Azure.Search.Documents
Azure.Search.Documents.Indexes
Azure.Search.Documents.Indexes.Models
Azure.Search.Documents.Models
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
Visual Studio 2019 veya üzeri.
Kendi Azure AI Arama hizmeti. SDK'yı kullanmak için hizmetinizin adına ve bir veya daha fazla API anahtarına ihtiyacınız vardır. Yoksa portalda bir hizmet oluşturun.
Visual Studio'da Çözüm için NuGet Paketlerini Yönet Paket Yöneticisi> Araçlar>NuGet'i kullanarak NuGet paketini indirin. paket adını
Azure.Search.Documents
arayın.
.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:
İ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 DeleteIndex
kullanabilirsinizDeleteIndexAsync
.
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 FieldBuilder
bir 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 = true
gerekir; 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 , , IsSortable
IsKey
ve AnalyzerName
gibi 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.Boolean
DateTimeOffset?
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.Upload
oluş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.MergeOrUpload
veya IndexDocumentsAction.Delete
çağırarak IndexDocumentsAction.Merge
toplu 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.New
farklı işlemleri tek bir toplu işlemde karıştırabilirsiniz. , gibi IndexDocumentsAction.Merge
IndexAction.Upload
ilgili 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 , Select
ve 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 Hotel
parametresi SearchClient.Search
olarak 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.
İlgili içerik
Azure.Search.Documents ve REST API için API başvuru belgelerine göz atın
azure-search-dotnet-samples ve search-dotnet-getting-started içindeki Azure.Search.Documents'ı temel alan diğer kod örneklerine göz atın
Çeşitli nesneleri adlandırma kurallarını öğrenmek için adlandırma kurallarını gözden geçirin