Inicio rápido: Creación de un índice de búsqueda mediante la biblioteca cliente heredada Microsoft.Azure.Search v10

Este artículo es el inicio rápido de C# para la biblioteca cliente heredada Microsoft.Azure.Search (versión 10), ahora reemplazada por la biblioteca cliente Azure.Search.Documents (versión 11).

Nota:

Si tiene proyectos de desarrollo existentes o en proceso, puede seguir usando la versión 10. Pero para los nuevos proyectos o para usar nuevas características, debe realizar la transición a la nueva biblioteca.

Acerca de este inicio rápido

Cree una aplicación de consola de .NET Core en C# que cree, cargue y consulte un índice de Azure Cognitive Search mediante Visual Studio y las bibliotecas cliente Microsoft.Azure.Search.

En este artículo se explica cómo crear la aplicación. También puede descargar y ejecutar la aplicación completa.

Nota:

El código de demostración de este artículo usa los métodos sincrónicos del SDK de .NET de Azure Cognitive Search versión 10 para simplificar. Sin embargo, en escenarios de producción, se recomienda usar los métodos asincrónicos en sus propias aplicaciones para mantenerlos escalables y dinámicos. Por ejemplo, podría usar CreateAsync y DeleteAsync en lugar de Create y Delete.

Prerrequisitos

Antes de empezar, debe tener lo siguiente:

Obtención de una clave y una dirección URL

Las llamadas al servicio requieren un punto de conexión de dirección URL y una clave de acceso en cada solicitud. Se crea un servicio de búsqueda con ambos, por lo que si agregó Azure Cognitive Search a su suscripción, siga estos pasos para obtener la información necesaria:

  1. Inicie sesión en Azure Portal y, en la página Información general del servicio de búsqueda, obtenga la dirección URL. Un punto de conexión de ejemplo podría ser similar a https://mydemo.search.windows.net.

  2. En Configuración>Claves, obtenga una clave de administrador para tener derechos completos en el servicio. Se proporcionan dos claves de administrador intercambiables para lograr la continuidad empresarial, por si necesitara sustituir una de ellas. Puede usar la clave principal o secundaria en las solicitudes para agregar, modificar y eliminar objetos.

    Obtenga también la clave de consulta. Se recomienda emitir solicitudes de consulta con acceso de solo lectura.

Obtención de un punto de conexión HTTP y una clave de acceso

Todas las solicitudes requieren una clave de API en cada solicitud enviada al servicio. Tener una clave válida genera la confianza, solicitud a solicitud, entre la aplicación que envía la solicitud y el servicio que se encarga de ella.

Configuración del entorno

Para comenzar, abra Visual Studio y cree un nuevo proyecto de Aplicación de consola que pueda ejecutarse en .NET Core.

Instalación de paquetes NuGet

El paquete Microsoft.Azure.Search consta de algunas bibliotecas cliente que se distribuyen como paquetes NuGet.

Para este proyecto, use la versión 10 del Microsoft.Azure.Search paquete NuGet y el paquete NuGet más reciente Microsoft.Extensions.Configuration.Json .

  1. En Herramientas>Administrador de paquetes NuGet seleccione Administrar paquetes NuGet para la solución.... .

  2. Haga clic en Examinar.

  3. Microsoft.Azure.Search Busque y seleccione la versión 10.

  4. Haga clic en Instalar a la derecha para agregar el ensamblado al proyecto y la solución.

  5. Repita para Microsoft.Extensions.Configuration.Json, seleccionando la versión 2.2.0 o posterior.

Adición de información del servicio Azure Cognitive Search

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>nuevo elemento... .

  2. En Agregar nuevo elemento, busque "JSON" para devolver una lista relacionada con JSON de tipos de elementos.

  3. Elija Archivo JSON, asigne al archivo el nombre "appsettings.json" y haga clic en Agregar.

  4. Agregue el archivo al directorio de salida. Haga clic con el botón derecho en appsettings.json y seleccione Propiedades. En Copiar en el directorio de salida, seleccione Copiar si es más reciente.

  5. Copie el siguiente json en el nuevo archivo JSON.

    {
      "SearchServiceName": "<YOUR-SEARCH-SERVICE-NAME>",
      "SearchServiceAdminApiKey": "<YOUR-ADMIN-API-KEY>",
      "SearchIndexName": "hotels-quickstart"
    }
    
  6. Reemplace el nombre del servicio de búsqueda (YOUR-SEARCH-SERVICE-NAME) y la clave de API de administración (YOUR-ADMIN-API-KEY) por valores válidos. Si el punto de conexión de servicio es https://mydemo.search.windows.net, el nombre del servicio sería "mydemo".

Agregue los archivos ".Method" a su proyecto

Este paso es necesario para generar una salida significativa en la consola. Al imprimir los resultados en la ventana de la consola, los campos individuales del objeto Hotel deben devolverse como cadenas. Este paso implementa ToString() para realizar esta tarea, que se realiza copiando el código necesario en dos nuevos archivos.

  1. Agregue dos definiciones de clase vacías al proyecto: Address.Methods.cs, Hotel.Methods.cs

  2. En Address.Methods.cs, sobrescriba el contenido predeterminado con el código siguiente, líneas 1-25.

  3. En Hotel.Methods.cs, copie las líneas 1-68.

1 - Crear índice

El índice de hoteles consta de campos simples y complejos, donde un campo simple es "HotelName" o "Descripción", y los campos complejos son una dirección con subcampos, o una colección de salas. Cuando un índice incluye tipos complejos, aísle las definiciones de campo complejas en clases independientes.

  1. Agregue dos definiciones de clase vacías al proyecto: Address.cs, Hotel.cs

  2. En Address.cs, sobrescriba el contenido predeterminado con el código siguiente:

    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. En Hotel.cs, la clase define la estructura general del índice, incluidas las referencias a la clase address.

    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; }
        }
    }
    

    Los atributos del campo determinan cómo se usa en una aplicación. Por ejemplo, el IsSearchable atributo debe asignarse a todos los campos que se deben incluir en una búsqueda de texto completo.

    Nota:

    En el SDK de .NET, los campos deben atribuirse explícitamente como IsSearchable, IsFilterable, IsSortabley IsFacetable. Este comportamiento contrasta con la API REST que permite implícitamente la atribución basada en el tipo de datos (por ejemplo, los campos de cadena simples se pueden buscar automáticamente).

    Exactamente un campo del índice de tipo string debe ser el campo clave , identificando de forma única cada documento. En este esquema, la clave es HotelId.

    En este índice, los campos de descripción usan la propiedad opcional analyzer , especificada cuando desea invalidar el analizador de Lucene estándar predeterminado. El description_fr campo usa el analizador francés de Lucene (FrLucene) porque almacena texto francés. description usa el analizador de lenguaje opcional de Microsoft (EnMicrosoft).

  4. En Program.cs, cree una instancia de la SearchServiceClient clase para conectarse al servicio mediante valores almacenados en el archivo de configuración de la aplicación (appsettings.json).

    SearchServiceClient tiene una Indexes propiedad , proporcionando todos los métodos necesarios para crear, enumerar, actualizar o eliminar índices de 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);
            }
        }
    }    
    

    Si es posible, comparta una sola instancia de SearchServiceClient en la aplicación para evitar abrir demasiadas conexiones. Los métodos de clase son seguros para hilos para permitir dicho uso compartido.

    La clase tiene varios constructores. El que usted quiere utiliza el nombre del servicio de búsqueda y un objeto SearchCredentials como parámetros. SearchCredentials envuelve tu clave API.

    En la definición de índice, la manera más fácil de crear los Field objetos es llamando al FieldBuilder.BuildForType método y pasando una clase de modelo para el parámetro de tipo. Una clase de modelo tiene propiedades que se asignan a los campos del índice. Esta asignación permite vincular documentos desde el índice de búsqueda a instancias de tu clase de modelo.

    Nota:

    Si no tiene previsto usar una clase de modelo, puede definir el índice creando Field objetos directamente. Puede proporcionar el nombre del campo al constructor, junto con el tipo de datos (o analizador para campos de cadena). También puede establecer otras propiedades como IsSearchable, IsFilterable, para nombrar algunas.

  5. Presione F5 para compilar la aplicación y crear el índice.

    Si el proyecto se compila correctamente, se abre una ventana de consola y se escriben mensajes de estado en la pantalla para eliminar y crear el índice.

2 - Cargar documentos

En Azure Cognitive Search, los documentos son estructuras de datos que son entradas para indexar y salidas de consultas. Según se obtienen de una fuente de datos externa, las entradas de documento pueden ser filas en una base de datos, blobs en Blob Storage o documentos JSON en el disco. En este ejemplo, tomaremos un atajo embebiendo los documentos JSON para cuatro hoteles en el propio código.

Al cargar documentos, debe usar un objeto IndexBatch. IndexBatch Contiene una colección de IndexAction objetos, cada uno de los cuales contiene un documento y una propiedad que indica a Azure Cognitive Search qué acción realizar (carga, combinación, eliminación y mergeOrUpload).

  1. En Program.cs, cree una matriz de acciones de índice y documentos y, a continuación, pase la matriz a IndexBatch. Los documentos siguientes se ajustan al índice de inicio rápido del hotel, según lo definido por las clases de hotel y de dirección.

    // 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);
    }
    

    Una vez inicializado elIndexBatch objeto, puede enviarlo al índice llamando a Documents.Index en su SearchIndexClient objeto. Documents es una propiedad de SearchIndexClient que proporciona métodos para agregar, modificar, eliminar o consultar documentos en el índice.

    El try/catch entorno que rodea la llamada al método Index captura errores de indexación, lo que puede ocurrir si el servicio está bajo mucha carga. En el código de producción, podría retrasar y volver a intentar indexar los documentos con errores o registrar y continuar como hace el ejemplo, o controlarlo de alguna otra manera que cumpla los requisitos de coherencia de datos de la aplicación.

    El retraso de 2 segundos compensa por la indexación, que es asincrónica, por lo que todos los documentos se pueden indexar antes de que se ejecutan las consultas. Incluir un retraso en la codificación suele ser necesario solo en las demostraciones, pruebas y aplicaciones de ejemplo.

  2. En Program.cs, en main, descomente las líneas de "2 - Cargar documentos".

    // Uncomment next 3 lines in "2 - Load documents"
    ISearchIndexClient indexClient = serviceClient.Indexes.GetClient(indexName);
    Console.WriteLine("{0}", "Uploading documents...\n");
    UploadDocuments(indexClient);
    
  3. Presione F5 para recompilar la aplicación.

    Si el proyecto se compila correctamente, se abre una ventana de consola y se escriben mensajes de estado, esta vez con un mensaje sobre cómo cargar documentos. En Azure Portal, en la página información general del servicio de búsqueda, el índice hotels-quickstart debería tener ahora 4 documentos.

Para obtener más información sobre el procesamiento de documentos, vea "Cómo controla el SDK de .NET documentos".

3 - Buscar un índice

Puede obtener resultados de consulta tan pronto como se indexe el primer documento, pero las pruebas reales del índice deben esperar hasta que todos los documentos estén indexados.

Esta sección agrega dos funcionalidades: la lógica de consulta y los resultados. Para las consultas, use el método Search. Este método toma texto de búsqueda, así como otros parámetros.

La DocumentsSearchResult clase representa los resultados.

  1. En Program.cs, cree un método WriteDocuments que imprima los resultados de búsqueda en la consola.

    private static void WriteDocuments(DocumentSearchResult<Hotel> searchResults)
    {
        foreach (SearchResult<Hotel> result in searchResults.Results)
        {
            Console.WriteLine(result.Document);
        }
    
        Console.WriteLine();
    }
    
  2. Cree un método RunQueries para ejecutar consultas y devolver resultados. Los resultados son objetos de hotel. Puede usar el parámetro select para exponer campos individuales. Si no se incluye un campo en el parámetro select, la propiedad Hotel correspondiente 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);
    }
    

    Hay dos maneras de hacer coincidir términos en una consulta: búsqueda de texto completo y filtros. Una consulta de búsqueda de texto completo busca uno o varios términos en IsSearchable los campos del índice. Un filtro es una expresión booleana que se evalúa sobre los campos de un índice IsFilterable. Puede usar la búsqueda de texto completo y los filtros juntos o por separado.

    Las búsquedas y los filtros se realizan mediante el Documents.Search método . Se puede pasar una consulta de búsqueda en el searchText parámetro , mientras que se puede pasar una expresión de filtro en la Filter propiedad de la SearchParameters clase . Para filtrar sin buscar, basta con pasar "*" para el searchText parámetro . Para buscar sin filtrar, simplemente deje la propiedad Filter sin definir o no proporcione una instancia de SearchParameters en absoluto.

  3. En Program.cs, en la función principal, descomenta las líneas de "3 - Search".

    // Uncomment next 2 lines in "3 - Search an index"
    Console.WriteLine("{0}", "Searching documents...\n");
    RunQueries(indexClient);
    
  4. La solución ya está terminada. Presione F5 para recompilar la aplicación y ejecutar el programa en su totalidad.

    La salida incluye los mismos mensajes que antes, con la adición de información y resultados de la consulta.

Limpieza de recursos

Cuando esté trabajando en su propia suscripción, es una buena idea identificar, al final de un proyecto, si todavía necesita los recursos que ha creado. Los recursos que quedan en ejecución te pueden costar dinero. Puede eliminar recursos individualmente o eliminar el grupo de recursos para eliminar todo el conjunto de recursos.

Puede encontrar y administrar recursos en el portal mediante el vínculo Todos los recursos o Grupos de recursos en el panel de navegación izquierdo.

Si usa un servicio gratuito, recuerde que está limitado a tres índices, indexadores y orígenes de datos. Puede eliminar elementos individuales en el portal para que permanezcan por debajo del límite.

Pasos siguientes

En este inicio rápido de C#, ha trabajado en una serie de tareas para crear un índice, cargarlo con documentos y ejecutar consultas. En diferentes fases, tomamos atajos para simplificar el código y mejorar la legibilidad y la comprensión. Si está familiarizado con los conceptos básicos, se recomienda el siguiente artículo para una exploración de enfoques y conceptos alternativos que profundizarán en sus conocimientos.

El código de ejemplo y el índice son versiones expandidas de esta. En el ejemplo siguiente se agrega una colección Rooms, se usan diferentes clases y acciones, y se examina más detenidamente cómo funciona el procesamiento.

¿Quiere optimizar y ahorrar en el gasto en la nube?