Início Rápido: Criar um índice de pesquisa usando a biblioteca de clientes herdada do Microsoft.Azure.Search v10

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:

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:

  1. 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.

  2. 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.

Obter um ponto de extremidade HTTP e uma chave de acesso

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 .

  1. Nas Ferramentas>, Gerenciador de Pacotes NuGet, selecione Gerenciar Pacotes NuGet para Solução....

  2. Clique em Procurar.

  3. Pesquise por Microsoft.Azure.Search e selecione a versão 10.

  4. Clique em Instalar à direita para adicionar o assembly ao projeto e à solução.

  5. 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

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Adicionar>Novo Item... .

  2. Em Adicionar Novo Item, pesquise por "JSON" para retornar uma lista relacionada a JSON de tipos de item.

  3. Escolha Arquivo JSON, nomeie o arquivo como "appsettings.json" e clique em Adicionar.

  4. 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.

  5. Copie o JSON a seguir em seu novo arquivo JSON.

    {
      "SearchServiceName": "<YOUR-SEARCH-SERVICE-NAME>",
      "SearchServiceAdminApiKey": "<YOUR-ADMIN-API-KEY>",
      "SearchIndexName": "hotels-quickstart"
    }
    
  6. 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.

  1. Adicione duas definições de classe vazias ao seu projeto: Address.Methods.cs, Hotel.Methods.cs

  2. Em Address.Methods.cs, substitua o conteúdo padrão com o código a seguir, linhas 1 a 25.

  3. 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.

  1. Adicione duas definições de classe vazias ao seu projeto: Address.cs, Hotel.cs

  2. 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; }
        }
    }
    
  3. 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 IsSearchable atributo 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, e IsFacetable. 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 string deve 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. O description_fr campo está usando o analisador francês Lucene (FrLucene) porque armazena texto francês. Ele description está usando o analisador de idiomas opcional da Microsoft (EnMicrosoft).

  4. Em Program.cs, crie uma instância da SearchServiceClient classe para se conectar ao serviço usando valores armazenados no arquivo de configuração do aplicativo (appsettings.json).

    SearchServiceClient tem uma Indexes propriedade, 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 SearchServiceClient no 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 SearchCredentials objeto como parâmetros. SearchCredentials encapsula sua chave de api.

    Na definição de índice, a maneira mais fácil de criar os Field objetos é chamando o FieldBuilder.BuildForType mé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 Field objetos 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, como IsSearchable, IsFilterablepara citar algumas.

  5. 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).

  1. 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 oIndexBatch objeto, você pode enviá-lo para o índice chamando Documents.Index no seu objeto SearchIndexClient. Documents é uma propriedade de SearchIndexClient que fornece métodos para adicionar, modificar, excluir ou consultar documentos em seu índice.

    O try/catch entorno da chamada para o Index mé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.

  2. 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);
    
  3. 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.

  1. 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();
    }
    
  2. 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 IsSearchable no seu índice. Um filtro é uma expressão booliana que é avaliada sobre IsFilterable campos 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.Search método. Uma consulta de pesquisa pode ser passada no searchText parâmetro, enquanto uma expressão de filtro pode ser passada na Filter propriedade da SearchParameters classe. Para filtrar sem pesquisar, basta passar "*" para o parâmetro searchText. Para pesquisar sem filtragem, basta deixar a Filter propriedade não definida, ou não passar nenhuma instância de SearchParameters.

  3. 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);
    
  4. 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?