Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo é o início rápido em C# da biblioteca de clientes herdada do Microsoft.Azure.Search (versão 10), agora substituída pela biblioteca de clientes do Azure.Search.Documents (versão 11).
Observação
Se você tiver projetos de desenvolvimento existentes ou de bordo, poderá continuar a usar a versão 10. Mas para novos projetos ou para usar novos recursos, você deve fazer a transição para a nova biblioteca.
Sobre este início rápido
Crie um aplicativo de console do .NET Core em C# que cria, carrega e consulta um índice do Azure Cognitive Search usando o Visual Studio e as bibliotecas de clientes do Microsoft.Azure.Search.
Este artigo explica como criar o aplicativo. Você também pode baixar e executar o aplicativo completo.
Observação
O código de demonstração neste artigo usa os métodos síncronos do SDK do .NET do Azure Cognitive Search versão 10 para simplificar. No entanto, para cenários de produção, recomendamos usar os métodos assíncronos em seus próprios aplicativos para mantê-los escalonáveis e responsivos. Por exemplo, você poderia usar CreateAsync e DeleteAsync em vez de Create e Delete.
Pré-requisitos
Antes de começar, verifique se você tem o seguinte:
Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
Um serviço do Azure Cognitive Search. Crie um serviço ou localize um serviço existente em sua assinatura atual. É possível usar um serviço gratuito para este início rápido.
Visual Studio, qualquer edição. O código de exemplo e as instruções foram testados na edição gratuita da Comunidade.
Obter uma chave e uma URL
As chamadas para o serviço exigem um ponto de extremidade de URL e uma chave de acesso em cada solicitação. Um serviço de pesquisa é criado com ambos, portanto, se você adicionou o Azure Cognitive Search à sua assinatura, siga estas etapas para obter as informações necessárias:
Entre no portal do Azure e, na página Visão geral do serviço de pesquisa, obtenha a URL. Um ponto de extremidade de exemplo pode ser algo como
https://mydemo.search.windows.net.Em Chaves de Configurações>, obtenha uma chave de administrador para obter direitos completos sobre o serviço. Há duas chaves de administração intercambiáveis, fornecidas para a continuidade dos negócios, caso seja necessário sobrepor uma. É possível usar a chave primária ou secundária em solicitações para adicionar, modificar e excluir objetos.
Obtenha a chave de consulta também. É uma prática recomendada emitir requisições de consulta com acesso somente leitura.
Todas as solicitações exigem uma chave de api em cada solicitação enviada ao seu serviço. Ter uma chave válida estabelece a relação de confiança, para cada solicitação, entre o aplicativo que envia a solicitação e o serviço que lida com ela.
Configure seu ambiente
Comece abrindo o Visual Studio e criando um novo projeto de aplicativo de console que possa ser executado no .NET Core.
Instalar pacotes NuGet
O pacote Microsoft.Azure.Search consiste em algumas bibliotecas de clientes distribuídas como pacotes NuGet.
Para este projeto, use a Microsoft.Azure.Search versão 10 do pacote NuGet e o pacote NuGet mais recente Microsoft.Extensions.Configuration.Json .
Nas Ferramentas>, Gerenciador de Pacotes NuGet, selecione Gerenciar Pacotes NuGet para Solução....
Clique em Procurar.
Pesquise por
Microsoft.Azure.Searche selecione a versão 10.Clique em Instalar à direita para adicionar o assembly ao projeto e à solução.
Repita para
Microsoft.Extensions.Configuration.Json, selecionando a versão 2.2.0 ou posterior.
Adicionar informações do serviço do Azure Cognitive Search
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Adicionar>Novo Item... .
Em Adicionar Novo Item, pesquise por "JSON" para retornar uma lista relacionada a JSON de tipos de item.
Escolha Arquivo JSON, nomeie o arquivo como "appsettings.json" e clique em Adicionar.
Adicione o arquivo ao diretório de saída. Clique com o botão direito do mouse em appsettings.json e selecione Propriedades. Em Copiar para Diretório de Saída, selecione Copiar se for mais recente.
Copie o JSON a seguir em seu novo arquivo JSON.
{ "SearchServiceName": "<YOUR-SEARCH-SERVICE-NAME>", "SearchServiceAdminApiKey": "<YOUR-ADMIN-API-KEY>", "SearchIndexName": "hotels-quickstart" }Substitua o nome do serviço de pesquisa (YOUR-SEARCH-SERVICE-NAME) e a chave de API de administrador (YOUR-ADMIN-API-KEY) por valores válidos. Se o endpoint de serviço for
https://mydemo.search.windows.net, o nome do serviço será "mydemo".
Adicionar arquivos de classe ".Method" ao seu projeto
Essa etapa é necessária para produzir uma saída significativa no console. Ao imprimir resultados na janela do console, campos individuais do objeto Hotel devem ser retornados como cadeias de caracteres. Esta etapa implementa ToString() para executar essa tarefa, o que você faz copiando o código necessário para dois novos arquivos.
Adicione duas definições de classe vazias ao seu projeto: Address.Methods.cs, Hotel.Methods.cs
Em Address.Methods.cs, substitua o conteúdo padrão com o código a seguir, linhas 1 a 25.
Em Hotel.Methods.cs, copie as linhas 1 a 68.
1 – Criar índice
O índice de hotéis consiste em campos simples e complexos, em que um campo simples é "HotelName" ou "Description", e campos complexos são um endereço com subcampos ou uma coleção de quartos. Quando um índice inclui tipos complexos, isole as definições de campo complexas em classes separadas.
Adicione duas definições de classe vazias ao seu projeto: Address.cs, Hotel.cs
Em Address.cs, substitua o conteúdo padrão com o seguinte código:
using System; using Microsoft.Azure.Search; using Microsoft.Azure.Search.Models; using Newtonsoft.Json; namespace AzureSearchQuickstart { public partial class Address { [IsSearchable] public string StreetAddress { get; set; } [IsSearchable, IsFilterable, IsSortable, IsFacetable] public string City { get; set; } [IsSearchable, IsFilterable, IsSortable, IsFacetable] public string StateProvince { get; set; } [IsSearchable, IsFilterable, IsSortable, IsFacetable] public string PostalCode { get; set; } [IsSearchable, IsFilterable, IsSortable, IsFacetable] public string Country { get; set; } } }Em Hotel.cs, a classe define a estrutura geral do índice, incluindo referências à classe de endereço.
namespace AzureSearchQuickstart { using System; using Microsoft.Azure.Search; using Microsoft.Azure.Search.Models; using Newtonsoft.Json; public partial class Hotel { [System.ComponentModel.DataAnnotations.Key] [IsFilterable] public string HotelId { get; set; } [IsSearchable, IsSortable] public string HotelName { get; set; } [IsSearchable] [Analyzer(AnalyzerName.AsString.EnMicrosoft)] public string Description { get; set; } [IsSearchable] [Analyzer(AnalyzerName.AsString.FrLucene)] [JsonProperty("Description_fr")] public string DescriptionFr { get; set; } [IsSearchable, IsFilterable, IsSortable, IsFacetable] public string Category { get; set; } [IsSearchable, IsFilterable, IsFacetable] public string[] Tags { get; set; } [IsFilterable, IsSortable, IsFacetable] public bool? ParkingIncluded { get; set; } [IsFilterable, IsSortable, IsFacetable] public DateTimeOffset? LastRenovationDate { get; set; } [IsFilterable, IsSortable, IsFacetable] public double? Rating { get; set; } public Address Address { get; set; } } }Os atributos no campo determinam como ele é usado em um aplicativo. Por exemplo, o
IsSearchableatributo deve ser atribuído a cada campo que deve ser incluído em uma pesquisa de texto completo.Observação
No SDK do .NET, os campos devem ser explicitamente atribuídos como
IsSearchable,IsFilterable,IsSortable, eIsFacetable. Esse comportamento contrasta com a API REST que habilita implicitamente a atribuição com base no tipo de dados (por exemplo, campos de cadeia de caracteres simples são pesquisáveis automaticamente).Exatamente um campo em seu índice de tipo
stringdeve ser o campo de chave , identificando exclusivamente cada documento. Neste esquema, a chave éHotelId.Nesse índice, os campos de descrição usam a propriedade opcional
analyzer, especificada quando se deseja substituir o analisador Lucene padrão. Odescription_frcampo está usando o analisador francês Lucene (FrLucene) porque armazena texto francês. Eledescriptionestá usando o analisador de idiomas opcional da Microsoft (EnMicrosoft).Em Program.cs, crie uma instância da
SearchServiceClientclasse para se conectar ao serviço usando valores armazenados no arquivo de configuração do aplicativo (appsettings.json).SearchServiceClienttem umaIndexespropriedade, fornecendo todos os métodos necessários para criar, listar, atualizar ou excluir índices do Azure Cognitive Search.using System; using System.Linq; using System.Threading; using Microsoft.Azure.Search; using Microsoft.Azure.Search.Models; using Microsoft.Extensions.Configuration; namespace AzureSearchQuickstart { class Program { // Demonstrates index delete, create, load, and query // Commented-out code is uncommented in later steps static void Main(string[] args) { IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json"); IConfigurationRoot configuration = builder.Build(); SearchServiceClient serviceClient = CreateSearchServiceClient(configuration); string indexName = configuration["SearchIndexName"]; Console.WriteLine("{0}", "Deleting index...\n"); DeleteIndexIfExists(indexName, serviceClient); Console.WriteLine("{0}", "Creating index...\n"); CreateIndex(indexName, serviceClient); // Uncomment next 3 lines in "2 - Load documents" // ISearchIndexClient indexClient = serviceClient.Indexes.GetClient(indexName); // Console.WriteLine("{0}", "Uploading documents...\n"); // UploadDocuments(indexClient); // Uncomment next 2 lines in "3 - Search an index" // Console.WriteLine("{0}", "Searching index...\n"); // RunQueries(indexClient); Console.WriteLine("{0}", "Complete. Press any key to end application...\n"); Console.ReadKey(); } // Create the search service client private static SearchServiceClient CreateSearchServiceClient(IConfigurationRoot configuration) { string searchServiceName = configuration["SearchServiceName"]; string adminApiKey = configuration["SearchServiceAdminApiKey"]; SearchServiceClient serviceClient = new SearchServiceClient(searchServiceName, new SearchCredentials(adminApiKey)); return serviceClient; } // Delete an existing index to reuse its name private static void DeleteIndexIfExists(string indexName, SearchServiceClient serviceClient) { if (serviceClient.Indexes.Exists(indexName)) { serviceClient.Indexes.Delete(indexName); } } // Create an index whose fields correspond to the properties of the Hotel class. // The Address property of Hotel will be modeled as a complex field. // The properties of the Address class in turn correspond to sub-fields of the Address complex field. // The fields of the index are defined by calling the FieldBuilder.BuildForType() method. private static void CreateIndex(string indexName, SearchServiceClient serviceClient) { var definition = new Microsoft.Azure.Search.Models.Index() { Name = indexName, Fields = FieldBuilder.BuildForType<Hotel>() }; serviceClient.Indexes.Create(definition); } } }Se possível, compartilhe uma única instância de
SearchServiceClientno seu aplicativo para evitar abrir muitas conexões. Os métodos de classe são thread-safe para permitir esse compartilhamento.A classe tem vários construtores. Aquele que você deseja usa o nome do serviço de pesquisa e um
SearchCredentialsobjeto como parâmetros.SearchCredentialsencapsula sua chave de api.Na definição de índice, a maneira mais fácil de criar os
Fieldobjetos é chamando oFieldBuilder.BuildForTypemétodo, passando uma classe de modelo para o parâmetro de tipo. Uma classe modelo possui propriedades que correspondem aos campos do seu índice. Esse mapeamento permite que você associe documentos do índice de pesquisa a instâncias da classe de modelo.Observação
Se você não planeja usar uma classe de modelo, ainda pode definir seu índice criando
Fieldobjetos diretamente. Você pode fornecer o nome do campo para o construtor, juntamente com o tipo de dados (ou analisador para campos de cadeia de caracteres). Você também pode definir outras propriedades, comoIsSearchable,IsFilterablepara citar algumas.Pressione F5 para criar o aplicativo e criar o índice.
Se o projeto for construído com êxito, uma janela do console será aberta, exibindo mensagens de status na tela para a exclusão e criação do índice.
2 – Carregar documentos
No Azure Cognitive Search, os documentos são estruturas de dados que são entradas para indexação e saídas de consultas. Conforme obtido de uma fonte de dados externa, as entradas de documento podem ser linhas em um banco de dados, blobs no Armazenamento de Blobs ou documentos JSON no disco. Neste exemplo, estamos usando um atalho e inserindo documentos JSON para quatro hotéis no próprio código.
Ao carregar documentos, você deve usar um IndexBatch objeto. Um IndexBatch contém uma coleção de IndexAction objetos, cada um deles contém um documento e uma propriedade informando ao Azure Cognitive Search qual ação executar (carregar, mesclar, excluir e mergeOrUpload).
Em Program.cs, crie uma matriz de documentos e ações de índice e, em seguida, passe a matriz para
IndexBatch. Os documentos abaixo estão de acordo com o índice de hotel-quickstart, conforme definido pelas classes de hotel e de endereço.// Upload documents as a batch private static void UploadDocuments(ISearchIndexClient indexClient) { var actions = new IndexAction<Hotel>[] { IndexAction.Upload( new Hotel() { HotelId = "1", HotelName = "Secret Point Motel", Description = "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.", DescriptionFr = "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.", Category = "Boutique", Tags = new[] { "pool", "air conditioning", "concierge" }, ParkingIncluded = false, LastRenovationDate = new DateTimeOffset(1970, 1, 18, 0, 0, 0, TimeSpan.Zero), Rating = 3.6, Address = new Address() { StreetAddress = "677 5th Ave", City = "New York", StateProvince = "NY", PostalCode = "10022", Country = "USA" } } ), IndexAction.Upload( new Hotel() { HotelId = "2", HotelName = "Twin Dome Motel", Description = "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.", DescriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.", Category = "Boutique", Tags = new[] { "pool", "free wifi", "concierge" }, ParkingIncluded = false, LastRenovationDate = new DateTimeOffset(1979, 2, 18, 0, 0, 0, TimeSpan.Zero), Rating = 3.60, Address = new Address() { StreetAddress = "140 University Town Center Dr", City = "Sarasota", StateProvince = "FL", PostalCode = "34243", Country = "USA" } } ), IndexAction.Upload( new Hotel() { HotelId = "3", HotelName = "Triple Landscape Hotel", Description = "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.", DescriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.", Category = "Resort and Spa", Tags = new[] { "air conditioning", "bar", "continental breakfast" }, ParkingIncluded = true, LastRenovationDate = new DateTimeOffset(2015, 9, 20, 0, 0, 0, TimeSpan.Zero), Rating = 4.80, Address = new Address() { StreetAddress = "3393 Peachtree Rd", City = "Atlanta", StateProvince = "GA", PostalCode = "30326", Country = "USA" } } ), IndexAction.Upload( new Hotel() { HotelId = "4", HotelName = "Sublime Cliff Hotel", Description = "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace.", DescriptionFr = "Le sublime Cliff Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Cliff fait partie d'un Palace 1800 restauré avec amour.", Category = "Boutique", Tags = new[] { "concierge", "view", "24-hour front desk service" }, ParkingIncluded = true, LastRenovationDate = new DateTimeOffset(1960, 2, 06, 0, 0, 0, TimeSpan.Zero), Rating = 4.6, Address = new Address() { StreetAddress = "7400 San Pedro Ave", City = "San Antonio", StateProvince = "TX", PostalCode = "78216", Country = "USA" } } ), }; var batch = IndexBatch.New(actions); try { indexClient.Documents.Index(batch); } catch (IndexBatchException e) { // When a service is under load, indexing might fail for some documents in the batch. // Depending on your application, you can compensate by 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}", String.Join(", ", e.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key))); } // Wait 2 seconds before starting queries Console.WriteLine("Waiting for indexing...\n"); Thread.Sleep(2000); }Depois de inicializar o
IndexBatchobjeto, você pode enviá-lo para o índice chamandoDocuments.Indexno seu objetoSearchIndexClient.Documentsé uma propriedade deSearchIndexClientque fornece métodos para adicionar, modificar, excluir ou consultar documentos em seu índice.O
try/catchentorno da chamada para oIndexmétodo captura falhas de indexação, o que pode acontecer se o serviço estiver sob carga pesada. No código de produção, você pode atrasar e repetir a indexação dos documentos que falharam, ou registrar em log e continuar como o exemplo, ou tratá-los de alguma outra maneira que atenda aos requisitos de consistência de dados da aplicação.O atraso de 2 segundos compensa a indexação, que é assíncrona, de modo que todos os documentos possam ser indexados antes da execução das consultas. Normalmente, inserir atraso no código só é necessário em demonstrações, testes e aplicativos de exemplo.
Em Program.cs, no main, descomente as linhas para "2 – Carregar documentos".
// Uncomment next 3 lines in "2 - Load documents" ISearchIndexClient indexClient = serviceClient.Indexes.GetClient(indexName); Console.WriteLine("{0}", "Uploading documents...\n"); UploadDocuments(indexClient);Pressione F5 para recompilar o aplicativo.
Se o projeto for compilado com êxito, uma janela do console será aberta, gravando mensagens de status, desta vez com uma mensagem sobre o carregamento de documentos. No portal do Azure, na página Visão geral do serviço de pesquisa, o índice de início rápido de hotéis agora deve ter 4 documentos.
Para obter mais informações sobre o processamento de documentos, consulte "Como o SDK do .NET manipula documentos".
3 – Pesquisar um índice
Você poderá obter os resultados da consulta, assim que o primeiro documento for indexado, mas o teste real do índice deverá aguardar até todos os documentos serem indexados.
Esta seção adiciona duas funcionalidades: lógica da consulta e resultados. Para consultas, use o Search método. Esse método usa texto de pesquisa, bem como outros parâmetros.
A DocumentsSearchResult classe representa os resultados.
Em Program.cs, crie um método WriteDocuments que imprime os resultados da pesquisa no console.
private static void WriteDocuments(DocumentSearchResult<Hotel> searchResults) { foreach (SearchResult<Hotel> result in searchResults.Results) { Console.WriteLine(result.Document); } Console.WriteLine(); }Crie um método RunQueries para executar consultas e retornar resultados. Os resultados são objetos do tipo Hotel. Você pode usar o parâmetro select para exibir campos individuais. Se um campo não estiver incluído no parâmetro select, a propriedade correspondente do Hotel será nula.
private static void RunQueries(ISearchIndexClient indexClient) { SearchParameters parameters; DocumentSearchResult<Hotel> results; // Query 1 Console.WriteLine("Query 1: Search for term 'Atlanta' with no result trimming"); parameters = new SearchParameters(); results = indexClient.Documents.Search<Hotel>("Atlanta", parameters); WriteDocuments(results); // Query 2 Console.WriteLine("Query 2: Search on the term 'Atlanta', with trimming"); Console.WriteLine("Returning only these fields: HotelName, Tags, Address:\n"); parameters = new SearchParameters() { Select = new[] { "HotelName", "Tags", "Address" }, }; results = indexClient.Documents.Search<Hotel>("Atlanta", parameters); WriteDocuments(results); // Query 3 Console.WriteLine("Query 3: Search for the terms 'restaurant' and 'wifi'"); Console.WriteLine("Return only these fields: HotelName, Description, and Tags:\n"); parameters = new SearchParameters() { Select = new[] { "HotelName", "Description", "Tags" } }; results = indexClient.Documents.Search<Hotel>("restaurant, wifi", parameters); WriteDocuments(results); // Query 4 -filtered query Console.WriteLine("Query 4: Filter on ratings greater than 4"); Console.WriteLine("Returning only these fields: HotelName, Rating:\n"); parameters = new SearchParameters() { Filter = "Rating gt 4", Select = new[] { "HotelName", "Rating" } }; results = indexClient.Documents.Search<Hotel>("*", parameters); WriteDocuments(results); // Query 5 - top 2 results Console.WriteLine("Query 5: Search on term 'boutique'"); Console.WriteLine("Sort by rating in descending order, taking the top two results"); Console.WriteLine("Returning only these fields: HotelId, HotelName, Category, Rating:\n"); parameters = new SearchParameters() { OrderBy = new[] { "Rating desc" }, Select = new[] { "HotelId", "HotelName", "Category", "Rating" }, Top = 2 }; results = indexClient.Documents.Search<Hotel>("boutique", parameters); WriteDocuments(results); }Há duas maneiras de corresponder termos em uma consulta: pesquisa de texto completo e filtros. Uma consulta de pesquisa de texto completo pesquisa um ou mais termos nos campos
IsSearchableno seu índice. Um filtro é uma expressão booliana que é avaliada sobreIsFilterablecampos em um índice. Você pode usar a pesquisa de texto completo e filtros juntos ou separadamente.Pesquisas e filtros são executados usando o
Documents.Searchmétodo. Uma consulta de pesquisa pode ser passada nosearchTextparâmetro, enquanto uma expressão de filtro pode ser passada naFilterpropriedade daSearchParametersclasse. Para filtrar sem pesquisar, basta passar"*"para o parâmetrosearchText. Para pesquisar sem filtragem, basta deixar aFilterpropriedade não definida, ou não passar nenhuma instância deSearchParameters.Em Program.cs, no principal, descompacte as linhas para "3 – Pesquisar".
// Uncomment next 2 lines in "3 - Search an index" Console.WriteLine("{0}", "Searching documents...\n"); RunQueries(indexClient);A solução já foi concluída. Pressione F5 para recompilar o aplicativo e executar o programa em sua totalidade.
A saída inclui as mesmas mensagens de antes, com adição de informações de consulta e resultados.
Limpar os recursos
Quando você está trabalhando em sua própria assinatura, é uma boa ideia, ao final de um projeto, verificar se você ainda precisa dos recursos que você criou. Os recursos deixados em execução podem te custar dinheiro. Você pode excluir recursos individualmente ou excluir o grupo de recursos para excluir todo o conjunto de recursos.
Você pode encontrar e gerenciar recursos no portal usando o link Todos os recursos ou grupos de recursos no painel de navegação à esquerda.
Se você estiver usando um serviço gratuito, lembre-se de que está limitado a três índices, indexadores e fontes de dados. Você pode excluir itens individuais no portal para permanecer abaixo do limite.
Próximas etapas
Neste início rápido do C#, você trabalhou em uma série de tarefas para criar um índice, carregá-lo com documentos e executar consultas. Em diferentes estágios, usamos atalhos para simplificar o código a fim de facilitar a leitura e a compreensão. Se você estiver familiarizado com os conceitos básicos, recomendamos o próximo artigo para uma exploração de abordagens e conceitos alternativos que aprofundarão seu conhecimento.
O código de exemplo e o índice são versões expandidas deste. O exemplo a seguir adiciona uma coleção Rooms, usa classes e ações diferentes e analisa mais de perto como o processamento funciona.
Deseja otimizar e reduzir seus gastos com a nuvem?