Azure Search .NET SDK sürüm 1.1'e yükseltme
Azure Search .NET SDK'sının 1.0.2-preview veya daha eski bir sürümünü kullanıyorsanız, bu makale uygulamanızı 1.1 sürümünü kullanacak şekilde yükseltmenize yardımcı olur.
Örnekler de dahil olmak üzere SDK'nın daha genel bir kılavuzu için bkz. .NET Uygulamasından Azure Search'ü kullanma.
Not
Sürüm 1.1'e yükseltdiğinizde veya zaten 1.1 ile 2.0-preview (dahil) arasında bir sürüm kullanıyorsanız sürüm 3'e yükseltmeniz gerekir. Yönergeler için bkz. Azure Search .NET SDK sürüm 3'e yükseltme .
İlk olarak, NuGet Paket Yöneticisi Konsolu'nu kullanmak için Microsoft.Azure.Search
NuGet başvurunuzu güncelleştirin veya proje başvurularınıza sağ tıklayıp "NuGet Paketlerini Yönet..." seçeneğini belirleyin. Visual Studio...
NuGet yeni paketleri ve bağımlılıklarını indirdikten sonra projenizi yeniden derleyin.
Daha önce 1.0.0-preview, 1.0.1-preview veya 1.0.2-preview sürümünü kullanıyorsanız derleme başarılı olmalı ve başlamaya hazırsınız demektir!
Daha önce 0.13.0-preview veya daha eski bir sürümü kullanıyorsanız, aşağıdakine benzer derleme hataları görmeniz gerekir:
Program.cs(137,56,137,62): error CS0117: 'Microsoft.Azure.Search.Models.IndexBatch' does not contain a definition for 'Create'
Program.cs(137,99,137,105): error CS0117: 'Microsoft.Azure.Search.Models.IndexAction' does not contain a definition for 'Create'
Program.cs(146,41,146,54): error CS1061: 'Microsoft.Azure.Search.IndexBatchException' does not contain a definition for 'IndexResponse' and no extension method 'IndexResponse' accepting a first argument of type 'Microsoft.Azure.Search.IndexBatchException' could be found (are you missing a using directive or an assembly reference?)
Program.cs(163,13,163,42): error CS0246: The type or namespace name 'DocumentSearchResponse' could not be found (are you missing a using directive or an assembly reference?)
Sonraki adım, derleme hatalarını tek tek düzeltmektir. Çoğu, SDK'da yeniden adlandırılmış bazı sınıf ve yöntem adlarını değiştirmeyi gerektirir. Sürüm 1.1'deki hataya neden olan değişikliklerin listesi, bu ad değişikliklerinin listesini içerir.
Belgelerinizi modellemek için özel sınıflar kullanıyorsanız ve bu sınıfların null atanamayan ilkel türlerin özellikleri varsa (örneğin, int
C bool
# dilinde), SDK'nın 1.1 sürümünde farkında olmanız gereken bir hata düzeltmesi vardır. Diğer ayrıntılar için bkz. Sürüm 1.1'deki hata düzeltmeleri .
Son olarak, derleme hatalarını düzeltdikten sonra, isterseniz yeni işlevlerden yararlanmak için uygulamanızda değişiklikler yapabilirsiniz.
Sürüm 1.1'deki hataya neden olan değişikliklerin listesi
Aşağıdaki liste, değişikliğin uygulama kodunuzu etkileme olasılığına göre sıralanır.
IndexBatch ve IndexAction değişiklikleri
IndexBatch.Create
olarak yeniden adlandırıldı IndexBatch.New
ve artık bağımsız params
değişkeni yok. Farklı eylem türlerini (birleştirmeler, silmeler vb.) karıştıran toplu işlemler için kullanabilirsiniz IndexBatch.New
. Ayrıca, tüm eylemlerin aynı olduğu toplu işlemler oluşturmak için yeni statik yöntemler vardır: Delete
, Merge
, MergeOrUpload
ve Upload
.
IndexAction
artık ortak oluşturucuları yok ve özellikleri artık sabit. Farklı amaçlarla eylem oluşturmak için yeni statik yöntemleri kullanmalısınız: Delete
, Merge
, MergeOrUpload
ve Upload
.
IndexAction.Create
Kaldırıldı. Yalnızca bir belgeyi alan aşırı yüklemeyi kullandıysanız, bunun yerine kullandığınızdan Upload
emin olun.
Örnek
Kodunuz aşağıdaki gibi görünüyorsa:
var batch = IndexBatch.Create(documents.Select(doc => IndexAction.Create(doc)));
indexClient.Documents.Index(batch);
Derleme hatalarını düzeltmek için bunu şu şekilde değiştirebilirsiniz:
var batch = IndexBatch.New(documents.Select(doc => IndexAction.Upload(doc)));
indexClient.Documents.Index(batch);
İsterseniz bunu daha da basitleştirebilirsiniz:
var batch = IndexBatch.Upload(documents);
indexClient.Documents.Index(batch);
IndexBatchException değişiklikleri
IndexBatchException.IndexResponse
özelliği olarak yeniden adlandırılmıştır IndexingResults
ve türü artık IList<IndexingResult>
şeklindedir.
Örnek
Kodunuz aşağıdaki gibi görünüyorsa:
catch (IndexBatchException e)
{
Console.WriteLine(
"Failed to index some of the documents: {0}",
String.Join(", ", e.IndexResponse.Results.Where(r => !r.Succeeded).Select(r => r.Key)));
}
Derleme hatalarını düzeltmek için bunu şu şekilde değiştirebilirsiniz:
catch (IndexBatchException e)
{
Console.WriteLine(
"Failed to index some of the documents: {0}",
String.Join(", ", e.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key)));
}
İşlem yöntemi değişiklikleri
Azure Search .NET SDK'sı içindeki her işlem, zaman uyumlu ve zaman uyumsuz çağıranlar için bir dizi yöntem aşırı yüklemesi olarak kullanıma sunulur. Bu yöntem aşırı yüklemelerinin imzaları ve çarpanları sürüm 1.1'de değişmiştir.
Örneğin, SDK'nın eski sürümlerindeki "Dizin İstatistiklerini Al" işlemi şu imzaları kullanıma sunar:
IIndexOperations
içinde:
// Asynchronous operation with all parameters
Task<IndexGetStatisticsResponse> GetStatisticsAsync(
string indexName,
CancellationToken cancellationToken);
IndexOperationsExtensions
içinde:
// Asynchronous operation with only required parameters
public static Task<IndexGetStatisticsResponse> GetStatisticsAsync(
this IIndexOperations operations,
string indexName);
// Synchronous operation with only required parameters
public static IndexGetStatisticsResponse GetStatistics(
this IIndexOperations operations,
string indexName);
Sürüm 1.1'deki aynı işlem için yöntem imzaları şöyle görünür:
IIndexesOperations
içinde:
// Asynchronous operation with lower-level HTTP features exposed
Task<AzureOperationResponse<IndexGetStatisticsResult>> GetStatisticsWithHttpMessagesAsync(
string indexName,
SearchRequestOptions searchRequestOptions = default(SearchRequestOptions),
Dictionary<string, List<string>> customHeaders = null,
CancellationToken cancellationToken = default(CancellationToken));
IndexesOperationsExtensions
içinde:
// Simplified asynchronous operation
public static Task<IndexGetStatisticsResult> GetStatisticsAsync(
this IIndexesOperations operations,
string indexName,
SearchRequestOptions searchRequestOptions = default(SearchRequestOptions),
CancellationToken cancellationToken = default(CancellationToken));
// Simplified synchronous operation
public static IndexGetStatisticsResult GetStatistics(
this IIndexesOperations operations,
string indexName,
SearchRequestOptions searchRequestOptions = default(SearchRequestOptions));
Sürüm 1.1'den başlayarak, Azure Search .NET SDK'sı işlem yöntemlerini farklı düzenler:
- İsteğe bağlı parametreler artık ek yöntem aşırı yüklemeleri yerine varsayılan parametreler olarak modellenir. Bu, yöntem aşırı yüklemelerinin sayısını bazen önemli ölçüde azaltır.
- Uzantı yöntemleri artık http'nin çok fazla ayrıntısını çağırandan gizler. Örneğin, SDK'nın eski sürümleri HTTP durum koduna sahip bir yanıt nesnesi döndürdü. İşlem yöntemleri
CloudException
hataya işaret eden herhangi bir durum kodu oluşturacağından genellikle denetlemeniz gerekmiyordu. Yeni uzantı yöntemleri yalnızca model nesnelerini döndürerek kodunuzda bunları açma zahmetini yaşamanızı sağlar. - Buna karşılık, çekirdek arabirimler artık ihtiyacınız olduğunda HTTP düzeyinde daha fazla denetim sağlayan yöntemleri kullanıma sunar. Artık isteklere dahil edilecek özel HTTP üst bilgilerini geçirebilirsiniz ve yeni
AzureOperationResponse<T>
dönüş türü, işlem için veHttpResponseMessage
öğesine doğrudan erişimHttpRequestMessage
sağlar.AzureOperationResponse
ad alanındaMicrosoft.Rest.Azure
tanımlanır ve öğesinin yerini alırHyak.Common.OperationResponse
.
ScoringParameters değişiklikleri
Arama sorgusundaki puanlama profillerine parametre sağlamayı kolaylaştırmak için en son SDK'ya adlı ScoringParameter
yeni bir sınıf eklendi.
ScoringProfiles
Daha önce sınıfının özelliği SearchParameters
olarak IList<string>
yazıldı; Şimdi olarak IList<ScoringParameter>
yazıldı.
Örnek
Kodunuz aşağıdaki gibi görünüyorsa:
var sp = new SearchParameters();
sp.ScoringProfile = "jobsScoringFeatured"; // Use a scoring profile
sp.ScoringParameters = new[] { "featuredParam-featured", "mapCenterParam-" + lon + "," + lat };
Derleme hatalarını düzeltmek için bunu şu şekilde değiştirebilirsiniz:
var sp = new SearchParameters();
sp.ScoringProfile = "jobsScoringFeatured"; // Use a scoring profile
sp.ScoringParameters =
new[]
{
new ScoringParameter("featuredParam", new[] { "featured" }),
new ScoringParameter("mapCenterParam", GeographyPoint.Create(lat, lon))
};
Model sınıfı değişiklikleri
İşlem yöntemi değişiklikleri'nde açıklanan imza değişiklikleri nedeniyle, ad alanında Microsoft.Azure.Search.Models
birçok sınıf yeniden adlandırıldı veya kaldırıldı. Örnek:
-
IndexDefinitionResponse
şununla değiştirildi:AzureOperationResponse<Index>
-
DocumentSearchResponse
,DocumentSearchResult
olarak yeniden adlandırıldı -
IndexResult
,IndexingResult
olarak yeniden adlandırıldı -
Documents.Count()
şimdi belge sayısı yerine birlong
döndürürDocumentCountResponse
-
IndexGetStatisticsResponse
,IndexGetStatisticsResult
olarak yeniden adlandırıldı -
IndexListResponse
,IndexListResult
olarak yeniden adlandırıldı
Özetlemek gerekirse, OperationResponse
yalnızca bir model nesnesini sarmalama amacıyla var olan türetilmiş sınıflar kaldırıldı. Kalan sınıfların sonekleri olarak değiştirildi Response
Result
.
Örnek
Kodunuz aşağıdaki gibi görünüyorsa:
IndexerGetStatusResponse statusResponse = null;
try
{
statusResponse = _searchClient.Indexers.GetStatus(indexer.Name);
}
catch (Exception ex)
{
Console.WriteLine("Error polling for indexer status: {0}", ex.Message);
return;
}
IndexerExecutionResult lastResult = statusResponse.ExecutionInfo.LastResult;
Derleme hatalarını düzeltmek için bunu şu şekilde değiştirebilirsiniz:
IndexerExecutionInfo status = null;
try
{
status = _searchClient.Indexers.GetStatus(indexer.Name);
}
catch (Exception ex)
{
Console.WriteLine("Error polling for indexer status: {0}", ex.Message);
return;
}
IndexerExecutionResult lastResult = status.LastResult;
Yanıt sınıfları ve IEnumerable
Kodunuzu etkileyebilecek ek bir değişiklik de, koleksiyonları barındıran yanıt sınıflarının artık uygulamasının olmamasıdır IEnumerable<T>
. Bunun yerine koleksiyon özelliğine doğrudan erişebilirsiniz. Örneğin, kodunuz aşağıdaki gibi görünüyorsa:
DocumentSearchResponse<Hotel> response = indexClient.Documents.Search<Hotel>(searchText, sp);
foreach (SearchResult<Hotel> result in response)
{
Console.WriteLine(result.Document);
}
Derleme hatalarını düzeltmek için bunu şu şekilde değiştirebilirsiniz:
DocumentSearchResult<Hotel> response = indexClient.Documents.Search<Hotel>(searchText, sp);
foreach (SearchResult<Hotel> result in response.Results)
{
Console.WriteLine(result.Document);
}
Web uygulamaları için özel durum
Arama sonuçlarını tarayıcıya göndermek için doğrudan seri hale DocumentSearchResponse
getiren bir web uygulamanız varsa kodunuzu değiştirmeniz gerekir, aksi takdirde sonuçlar doğru seri hale getirilmeyecektir. Örneğin, kodunuz aşağıdaki gibi görünüyorsa:
public ActionResult Search(string q = "")
{
// If blank search, assume they want to search everything
if (string.IsNullOrWhiteSpace(q))
q = "*";
return new JsonResult
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = _featuresSearch.Search(q)
};
}
Arama sonucunun işlenmesini .Results
düzeltmek için arama yanıtının özelliğini alarak bunu değiştirebilirsiniz:
public ActionResult Search(string q = "")
{
// If blank search, assume they want to search everything
if (string.IsNullOrWhiteSpace(q))
q = "*";
return new JsonResult
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = _featuresSearch.Search(q).Results
};
}
Bu tür durumları kodunuzda kendiniz aramanız gerekir; türü olduğundan JsonResult.Data
object
derleyici sizi uyarmaz.
CloudException değişiklikleri
CloudException
sınıfı ad alanından Hyak.Common
ad alanına Microsoft.Rest.Azure
taşındı. Ayrıca özelliği Error
olarak yeniden adlandırıldı Body
.
SearchServiceClient ve SearchIndexClient değişiklikleri
özelliğinin Credentials
türü , olan temel sınıfına ServiceClientCredentials
değiştirildiSearchCredentials
. veya SearchServiceClient
öğesine erişmeniz SearchCredentials
SearchIndexClient
gerekiyorsa lütfen yeni SearchCredentials
özelliğini kullanın.
SDK'nın SearchServiceClient
eski sürümlerinde ve SearchIndexClient
bir HttpClient
parametre alan oluşturucular vardı. Bunlar, bir HttpClientHandler
ve bir nesne dizisine DelegatingHandler
sahip oluşturucularla değiştirilmiştir. Bu, gerekirse HTTP isteklerini önceden işlemek için özel işleyicilerin yüklenmesini kolaylaştırır.
Son olarak, ve Uri
SearchCredentials
alan oluşturucular değişmiştir. Örneğin, şuna benzer bir kodunuz varsa:
var client =
new SearchServiceClient(
new SearchCredentials("abc123"),
new Uri("http://myservice.search.windows.net"));
Derleme hatalarını düzeltmek için bunu şu şekilde değiştirebilirsiniz:
var client =
new SearchServiceClient(
new Uri("http://myservice.search.windows.net"),
new SearchCredentials("abc123"));
Ayrıca credentials parametresinin türünün olarak değiştirildiğini ServiceClientCredentials
unutmayın. bu, kodunuz'dan ServiceClientCredentials
türetildiğinden kodunuzu SearchCredentials
etkileme olasılığı düşüktür.
İstek kimliğini geçirme
SDK'nın eski sürümlerinde, veya SearchIndexClient
üzerinde SearchServiceClient
bir istek kimliği ayarlayabilirsiniz ve bu kimlik REST API'ye yapılan her isteğe dahil edilebilir. Bu, desteğe başvurmanız gerekiyorsa arama hizmetinizle ilgili sorunları gidermek için yararlıdır. Ancak, tüm işlemler için aynı kimliği kullanmak yerine her işlem için benzersiz bir istek kimliği ayarlamak daha yararlıdır. Bu nedenle ve SetClientRequestId
SearchIndexClient
yöntemleri SearchServiceClient
kaldırılmıştır. Bunun yerine, isteğe bağlı SearchRequestOptions
parametresi aracılığıyla her işlem yöntemine bir istek kimliği geçirebilirsiniz.
Not
SDK'nın gelecek bir sürümünde, diğer Azure SDK'ları tarafından kullanılan yaklaşımla tutarlı istemci nesnelerinde genel olarak bir istek kimliği ayarlamak için yeni bir mekanizma ekleyeceğiz.
Örnek
Aşağıdakine benzer bir kodunuz varsa:
client.SetClientRequestId(Guid.NewGuid());
...
long count = client.Documents.Count();
Derleme hatalarını düzeltmek için bunu şu şekilde değiştirebilirsiniz:
long count = client.Documents.Count(new SearchRequestOptions(requestId: Guid.NewGuid()));
Arabirim adı değişiklikleri
İşlem grubu arabirim adlarının tümü karşılık gelen özellik adlarıyla tutarlı olacak şekilde değiştirildi:
- türü
ISearchServiceClient.Indexes
olarak yeniden adlandırıldıIIndexOperations
IIndexesOperations
. - türü
ISearchServiceClient.Indexers
olarak yeniden adlandırıldıIIndexerOperations
IIndexersOperations
. - türü
ISearchServiceClient.DataSources
olarak yeniden adlandırıldıIDataSourceOperations
IDataSourcesOperations
. - türü
ISearchIndexClient.Documents
olarak yeniden adlandırıldıIDocumentOperations
IDocumentsOperations
.
Test amacıyla bu arabirimlerin sahtelerini oluşturmadığınız sürece bu değişikliğin kodunuzu etkileme olasılığı düşüktür.
Sürüm 1.1'de hata düzeltmeleri
Azure Search .NET SDK'sının özel model sınıflarının seri hale getirilmesiyle ilgili eski sürümlerinde bir hata oluştu. Hata, boş değer atanamayan bir değer türünün özelliğiyle özel bir model sınıfı oluşturduysanız oluşabilir.
Yeniden oluşturma adımları
Boş değer atanamayan değer türünde bir özelliğe sahip özel bir model sınıfı oluşturun. Örneğin, yerine int?
türünde int
bir ortak UnitCount
özellik ekleyin.
Bir belgenin dizinini bu türdeki varsayılan değerle (örneğin, için int
0) oluşturursanız, Azure Search'te alan null olur. Daha sonra bu belgeyi ararsanız, Search
çağrı dönüştürülemediğini null
int
belirten bir şikayet oluştururJsonSerializationException
.
Ayrıca, hedeflenen değer yerine dizine null yazıldığı için filtreler beklendiği gibi çalışmayabilir.
Düzeltme ayrıntıları
Bu sorunu SDK'nın 1.1 sürümünde düzeltildi. Şimdi, aşağıdaki gibi bir model sınıfınız varsa:
public class Model
{
public string Key { get; set; }
public int IntValue { get; set; }
}
ve 0 olarak ayarladığınızda IntValue
, bu değer artık kabloda doğru şekilde 0 olarak seri hale getirilir ve dizinde 0 olarak depolanır. Yuvarlama da beklendiği gibi çalışır.
Bu yaklaşımda dikkate alınması gereken olası bir sorun vardır: Null değer atanamayan bir özelliğe sahip bir model türü kullanıyorsanız, dizininizdeki hiçbir belgenin karşılık gelen alan için null değer içermediğini garanti etmeniz gerekir. Sdk veya Azure Search REST API'si bunu zorunlu kılmanıza yardımcı olmaz.
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. Dizin tanımını güncelleştirdikten sonra, tüm belgelerin bu yeni alan için boş bir değeri olur (bunun nedeni, Azure Search'te tüm türlerin boş değer atanabilir olmasıdır). 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:
Error converting value {null} to type 'System.Int32'. Path 'IntValue'.
Bu nedenle, yine de en iyi uygulama olarak model sınıflarınızda null atanabilir türler kullanmanızı öneririz.
Bu hata ve düzeltme hakkında daha fazla ayrıntı için lütfen GitHub'da bu soruna bakın.