Upgrade na sadu .NET SDK služby Azure Search verze 1.1
Pokud používáte verzi 1.0.2-Preview nebo starší sadu .NET SDK služby Azure Search, pomůže vám tento článek upgradovat aplikaci tak, aby používala verzi 1.1.
Obecnější návod k sadě SDK, včetně příkladů, najdete v tématu Použití služby Azure Search z aplikace .NET.
Poznámka
Po upgradu na verzi 1.1 nebo pokud už používáte verzi mezi verzemi 1.1 a 2.0-Preview, měli byste upgradovat na verzi 3. Pokyny najdete v tématu Upgrade na sadu .NET SDK služby Azure Search verze 3 .
Nejprve aktualizujte NuGet reference pro Microsoft.Azure.Search
použití konzoly NuGet Správce balíčků nebo kliknutím pravým tlačítkem myši na odkazy na projekt a výběrem možnosti Spravovat NuGet Balíčky..." v Visual Studio.
Jakmile NuGet stáhne nové balíčky a jejich závislosti, znovu sestavte projekt.
Pokud jste dříve používali verzi 1.0.0-preview, 1.0.1-preview nebo 1.0.2-preview, měl by build proběhnout úspěšně a jste připravení!
Pokud jste dříve používali verzi 0.13.0-Preview nebo starší, měli byste vidět chyby sestavení, jako je následující:
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?)
Dalším krokem je oprava chyb sestavení o jeden po druhém. Většina bude vyžadovat změnu některých názvů tříd a metod, které byly přejmenovány v sadě SDK. Seznam zásadních změn ve verzi 1.1 obsahuje seznam těchto změn názvů.
Pokud k modelování dokumentů používáte vlastní třídy a tyto třídy mají vlastnosti nenulových primitivních typů (například int
v bool
jazyce C#), ve verzi 1.1 sady SDK, o které byste měli vědět, existuje oprava chyby. Další podrobnosti najdete v tématu Opravy chyb ve verzi 1.1 .
Nakonec, jakmile opravíte chyby sestavení, můžete v aplikaci udělat změny, abyste mohli využít nové funkce, pokud chcete.
Seznam zásadních změn ve verzi 1.1
Následující seznam je seřazený pravděpodobností, že změna ovlivní váš kód aplikace.
Změny IndexBatch a IndexAction
IndexBatch.Create
byl přejmenován IndexBatch.New
na a už nemá params
argument. Můžete použít IndexBatch.New
dávky, které kombinují různé typy akcí (sloučení, odstranění atd.). Kromě toho existují nové statické metody pro vytváření dávek, kde jsou všechny akce stejné: Delete
, , Merge
a MergeOrUpload
Upload
.
IndexAction
už nemá veřejné konstruktory a jeho vlastnosti jsou nyní neměnné. Nové statické metody byste měli použít k vytváření akcí pro různé účely: Delete
, Merge
, a MergeOrUpload
Upload
.
IndexAction.Create
byla odebrána. Pokud jste použili přetížení, které přebírá jenom dokument, nezapomeňte místo toho použít Upload
.
Příklad
Pokud váš kód vypadá takto:
var batch = IndexBatch.Create(documents.Select(doc => IndexAction.Create(doc)));
indexClient.Documents.Index(batch);
Můžete ho změnit tak, aby se opravily případné chyby sestavení:
var batch = IndexBatch.New(documents.Select(doc => IndexAction.Upload(doc)));
indexClient.Documents.Index(batch);
Pokud chcete, můžete to ještě zjednodušit:
var batch = IndexBatch.Upload(documents);
indexClient.Documents.Index(batch);
Změny indexBatchException
Vlastnost IndexBatchException.IndexResponse
byla přejmenována na IndexingResults
, a jeho typ je nyní IList<IndexingResult>
.
Příklad
Pokud váš kód vypadá takto:
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)));
}
Můžete ho změnit tak, aby se opravily případné chyby sestavení:
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)));
}
Změny metody operace
Každá operace v sadě .NET SDK služby Azure Search je vystavena jako sada přetížení metod pro synchronní a asynchronní volající. Podpisy a faktoring těchto přetížení metody se změnily ve verzi 1.1.
Například operace Získat statistiku indexu ve starších verzích sady SDK odhalila tyto podpisy:
V IIndexOperations
:
// Asynchronous operation with all parameters
Task<IndexGetStatisticsResponse> GetStatisticsAsync(
string indexName,
CancellationToken cancellationToken);
V IndexOperationsExtensions
:
// 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);
Podpisy metody pro stejnou operaci ve verzi 1.1 vypadají takto:
V IIndexesOperations
:
// 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));
V IndexesOperationsExtensions
:
// 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));
Počínaje verzí 1.1 uspořádá sada Azure Search .NET SDK metody operací odlišně:
- Volitelné parametry jsou nyní modelovány jako výchozí parametry, nikoli jako další přetížení metody. To snižuje počet přetížení metod, někdy dramaticky.
- Metody rozšíření teď skryjí spoustu nadbytečných podrobností PROTOKOLU HTTP od volajícího. Například starší verze sady SDK vrátily objekt odpovědi se stavovým kódem HTTP, který jste často nemuseli zkontrolovat, protože metody operace vyvolá
CloudException
všechny stavové kódy, které značí chybu. Nové metody rozšíření jenom vracejí objekty modelu, což vám ušetří potíže s tím, že je budete muset v kódu odbalit. - Naopak základní rozhraní teď zpřístupňují metody, které poskytují větší kontrolu na úrovni HTTP, pokud ho potřebujete. Teď můžete předat vlastní hlavičky HTTP, které se mají zahrnout do požadavků, a nový
AzureOperationResponse<T>
návratový typ vám poskytne přímý přístup k operaciHttpRequestMessage
aHttpResponseMessage
pro tuto operaci.AzureOperationResponse
je definován vMicrosoft.Rest.Azure
oboru názvů a nahrazujeHyak.Common.OperationResponse
.
Změny bodováníParameters
V nejnovější sadě SDK byla přidána nová třída s názvem ScoringParameter
, která usnadňuje zadávání parametrů pro bodování profilů ve vyhledávacím dotazu.
ScoringProfiles
Dříve byla vlastnost SearchParameters
třídy zadána jako IList<string>
; Nyní je zadán jako IList<ScoringParameter>
.
Příklad
Pokud váš kód vypadá takto:
var sp = new SearchParameters();
sp.ScoringProfile = "jobsScoringFeatured"; // Use a scoring profile
sp.ScoringParameters = new[] { "featuredParam-featured", "mapCenterParam-" + lon + "," + lat };
Můžete ho změnit tak, aby se opravily případné chyby sestavení:
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))
};
Změny třídy modelu
Vzhledem ke změnám podpisů popsaných v metodě Operace se mnoho tříd v Microsoft.Azure.Search.Models
oboru názvů přejmenovalo nebo odebralo. Příklad:
-
IndexDefinitionResponse
byla nahrazenaAzureOperationResponse<Index>
- Přejmenování
DocumentSearchResponse
naDocumentSearchResult
- Přejmenování
IndexResult
naIndexingResult
-
Documents.Count()
Nyní vrátílong
počet dokumentů místo počtu dokumentů.DocumentCountResponse
- Přejmenování
IndexGetStatisticsResponse
naIndexGetStatisticsResult
- Přejmenování
IndexListResponse
naIndexListResult
Pokud chcete sumarizovat, OperationResponse
byly odebrány odvozené třídy, které existovaly pouze k zabalení objektu modelu. Zbývající třídy měly jejich příponu změněnou od Response
na Result
.
Příklad
Pokud váš kód vypadá takto:
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;
Můžete ho změnit tak, aby se opravily případné chyby sestavení:
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;
Třídy odpovědí a IEnumerable
Další změna, která může ovlivnit váš kód, je, že třídy odpovědí, které obsahují kolekce, už neimplementují IEnumerable<T>
. Místo toho můžete k vlastnosti kolekce přistupovat přímo. Pokud například váš kód vypadá takto:
DocumentSearchResponse<Hotel> response = indexClient.Documents.Search<Hotel>(searchText, sp);
foreach (SearchResult<Hotel> result in response)
{
Console.WriteLine(result.Document);
}
Můžete ho změnit tak, aby se opravily případné chyby sestavení:
DocumentSearchResult<Hotel> response = indexClient.Documents.Search<Hotel>(searchText, sp);
foreach (SearchResult<Hotel> result in response.Results)
{
Console.WriteLine(result.Document);
}
Speciální případ pro webové aplikace
Pokud máte webovou aplikaci, která serializuje DocumentSearchResponse
přímo pro odesílání výsledků hledání do prohlížeče, budete muset změnit kód nebo výsledky nebudou serializovat správně. Pokud například váš kód vypadá takto:
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)
};
}
Můžete ho změnit tak, že .Results
získáte vlastnost odpovědi vyhledávání a opravíte vykreslování výsledků hledání:
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
};
}
V kódu budete muset hledat takové případy sami; Kompilátor vás nebude varovat , protože JsonResult.Data
je typ object
.
Změny cloudexceptionu
Třída CloudException
se přesunula z Hyak.Common
oboru názvů do Microsoft.Rest.Azure
oboru názvů. Také jeho Error
vlastnost byla přejmenována na Body
.
Změny SearchServiceClient a SearchIndexClient
Typ Credentials
vlastnosti se změnil z SearchCredentials
jeho základní třídy, ServiceClientCredentials
. Pokud potřebujete získat přístup k SearchCredentials
SearchIndexClient
nebo SearchServiceClient
, použijte novou SearchCredentials
vlastnost.
Ve starších verzích sady SDK a SearchIndexClient
měl konstruktory, SearchServiceClient
které vzaly HttpClient
parametr. Tyto objekty byly nahrazeny konstruktory, které přebírají HttpClientHandler
pole DelegatingHandler
objektů. To usnadňuje instalaci vlastních obslužných rutin pro předběžné zpracování požadavků HTTP v případě potřeby.
Nakonec konstruktory, které vzaly Uri
a SearchCredentials
změnily se. Pokud máte například kód, který vypadá takto:
var client =
new SearchServiceClient(
new SearchCredentials("abc123"),
new Uri("http://myservice.search.windows.net"));
Můžete ho změnit tak, aby se opravily případné chyby sestavení:
var client =
new SearchServiceClient(
new Uri("http://myservice.search.windows.net"),
new SearchCredentials("abc123"));
Všimněte si také, že typ parametru přihlašovacích údajů se změnil na ServiceClientCredentials
. To není pravděpodobné, že by to ovlivnilo váš kód, protože SearchCredentials
je odvozen z ServiceClientCredentials
.
Předání ID požadavku
Ve starších verzích sady SDK můžete nastavit ID požadavku na SearchServiceClient
rozhraní REST API nebo SearchIndexClient
ho zahrnout do každého požadavku rozhraní REST API. To je užitečné pro řešení problémů s vyhledávací službou, pokud potřebujete kontaktovat podporu. Je ale užitečnější nastavit jedinečné ID požadavku pro každou operaci, nikoli použít stejné ID pro všechny operace. Z tohoto důvodu SetClientRequestId
byly metody SearchServiceClient
a SearchIndexClient
byly odebrány. Místo toho můžete předat ID požadavku každé metodě operace prostřednictvím volitelného SearchRequestOptions
parametru.
Poznámka
V budoucí verzi sady SDK přidáme nový mechanismus pro globální nastavení ID požadavku na objekty klienta, který je konzistentní s přístupem používaným jinými sadami AZURE SDK.
Příklad
Pokud máte kód, který vypadá takto:
client.SetClientRequestId(Guid.NewGuid());
...
long count = client.Documents.Count();
Pokud chcete opravit případné chyby sestavení, můžete ho změnit na tento postup:
long count = client.Documents.Count(new SearchRequestOptions(requestId: Guid.NewGuid()));
Změny názvu rozhraní
Názvy rozhraní skupiny operací se změnily tak, aby byly konzistentní s odpovídajícími názvy vlastností:
- Typ
ISearchServiceClient.Indexes
se přejmenoval zIIndexOperations
naIIndexesOperations
. - Typ
ISearchServiceClient.Indexers
se přejmenoval zIIndexerOperations
naIIndexersOperations
. - Typ
ISearchServiceClient.DataSources
se přejmenoval zIDataSourceOperations
naIDataSourcesOperations
. - Typ
ISearchIndexClient.Documents
se přejmenoval zIDocumentOperations
naIDocumentsOperations
.
Tato změna pravděpodobně nemá vliv na váš kód, pokud jste pro účely testování nevytvořili napodobení těchto rozhraní.
Opravy chyb ve verzi 1.1
Ve starších verzích sady .NET SDK služby Azure Search došlo k chybě související se serializací vlastních tříd modelů. K chybě může dojít v případě, že jste vytvořili vlastní třídu modelu s vlastností typu hodnoty, která nemá hodnotu null.
Kroky pro reprodukci
Vytvořte vlastní třídu modelu s vlastností typu hodnoty, která není nullable. Přidejte například veřejnou UnitCount
vlastnost typu int
místo int?
.
Pokud indexujete dokument s výchozí hodnotou tohoto typu (například 0 pro int
), bude pole ve službě Azure Search null. Pokud následně vyhledáte tento dokument, Search
hovor si stěžuje JsonSerializationException
, že se nedá převést null
na int
.
Filtry také nemusí fungovat podle očekávání, protože hodnota null byla zapsána do indexu místo zamýšlené hodnoty.
Oprava podrobností
Tento problém jsme opravili ve verzi 1.1 sady SDK. Pokud teď máte třídu modelu takto:
public class Model
{
public string Key { get; set; }
public int IntValue { get; set; }
}
a nastavíte IntValue
hodnotu 0, tato hodnota je nyní správně serializována jako 0 na drátě a uložena jako 0 v indexu. Zaokrouhlování funguje podle očekávání.
Při použití tohoto přístupu je možné zjistit jeden potenciální problém: Pokud používáte typ modelu s nenulovou vlastností, musíte zaručit , že žádné dokumenty v indexu neobsahují hodnotu null pro odpovídající pole. S vynucování této sady vám pomůže sada SDK ani rozhraní REST API služby Azure Search.
Nejedná se pouze o hypotetický problém: představte si situaci, kdy přidáte nové pole do stávajícího indexu typu Edm.Int32
. Po aktualizaci definice indexu budou mít všechny dokumenty pro toto nové pole hodnotu null (protože všechny typy jsou ve službě Azure Search s možností null). Pokud pak použijete třídu modelu s vlastností int
se zakázanou hodnotou null, při pokusu o načtení dokumentů dojde k vyvolání podobné výjimky JsonSerializationException
:
Error converting value {null} to type 'System.Int32'. Path 'IntValue'.
Z tohoto důvodu stále doporučujeme používat typy s možnou hodnotou null ve třídách modelu jako osvědčený postup.
Další podrobnosti o této chybě a opravě najdete v tomto problému v GitHub.