Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este inicio rápido, usará la biblioteca cliente Búsqueda de Azure AI para .NET para crear, cargar y consultar un índice de búsqueda para full-text search, también conocido como búsqueda de palabras clave.
La búsqueda de texto completo usa Apache Lucene para indexar y consultar y el algoritmo de clasificación BM25 para obtener resultados de puntuación. En este inicio rápido se usan datos ficticios del hotel del repositorio azure-search-sample-data GitHub para rellenar el índice.
Sugerencia
¿Quieres empezar de inmediato? Descargue el código source en GitHub.
Requisitos previos
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Un servicio Búsqueda de Azure AI. Puede usar un servicio gratuito para este inicio rápido.
.NET 8 o posterior.
Git para clonar el repositorio de ejemplo.
El CLI de Azure para la autenticación sin claves con Microsoft Entra ID.
Configurar el acceso
Antes de empezar, asegúrese de que tiene permisos para acceder al contenido y las operaciones en Búsqueda de Azure AI. En este inicio rápido se usa Microsoft Entra ID para la autenticación y el acceso basado en roles para la autorización. Debe ser Propietario o Administrador de acceso de usuario para asignar roles. Si los roles no son factibles, use la autenticación basada en claves en su lugar.
Para configurar el acceso basado en rol recomendado:
Habilite el acceso basado en roles para el servicio de búsqueda.
Asigne los siguientes roles a la cuenta de usuario.
Colaborador del servicio Search
Colaborador de datos de índice de búsqueda
Lector de datos de índice de búsqueda
Obtención del punto de conexión
Cada servicio Búsqueda de Azure AI tiene un endpoint, que es una dirección URL única que identifica y proporciona acceso de red al servicio. En una sección posterior, especifique este punto de conexión para conectarse al servicio de búsqueda mediante programación.
Para obtener el punto de conexión:
Inicie sesión en el portal Azure y seleccione el servicio de búsqueda.
En el panel izquierdo, seleccione Información general.
Anote el punto de conexión, que debería tener un aspecto similar a .
Configuración del entorno
Use Git para clonar el repositorio de ejemplo.
git clone https://github.com/Azure-Samples/azure-search-dotnet-samplesDirígete a la carpeta quickstart y ábrela en Visual Studio Code.
cd azure-search-dotnet-samples/quickstart-keyword-search/AzureSearchQuickstart code .En , reemplace el valor de marcador de posición por la dirección URL que obtuvo en Obtener punto de conexión.
Instale las dependencias desde .
dotnet restoreCuando se complete la restauración, compruebe que no aparece ningún error en la salida.
Para la autenticación sin claves con Microsoft Entra ID, inicie sesión en la cuenta de Azure. Si tiene varias suscripciones, seleccione la que contiene el servicio Búsqueda de Azure AI.
az login
Ejecución del código
Compile y ejecute la aplicación.
dotnet run
Salida
La salida debe ser similar a la siguiente:
Deleting index...
Creating index...
Uploading documents...
Waiting for indexing...
Starting queries...
Query #1: Search on empty term '*' to return all documents, showing a subset of fields...
HotelId: 3
Name: Gastronomic Landscape Hotel
Rating: 4.8
HotelId: 2
Name: Old Century Hotel
Rating: 3.6
HotelId: 4
Name: Sublime Palace Hotel
Rating: 4.6
HotelId: 1
Name: Stay-Kay City Hotel
Rating: 3.6
Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...
HotelId: 3
Name: Gastronomic Landscape Hotel
Rating: 4.8
HotelId: 4
Name: Sublime Palace Hotel
Rating: 4.6
Query #3: Limit search to specific fields (pool in Tags field)...
HotelId: 2
Name: Old Century Hotel
Tags: [ pool, free wifi, concierge ]
Query #4: Facet on 'Category'...
HotelId: 3
Name: Gastronomic Landscape Hotel
Category: Suite
HotelId: 2
Name: Old Century Hotel
Category: Boutique
HotelId: 4
Name: Sublime Palace Hotel
Category: Boutique
HotelId: 1
Name: Stay-Kay City Hotel
Category: Boutique
Query #5: Look up a specific document...
3
Query #6: Call Autocomplete on HotelName...
san
sarasota
Complete. Press any key to end this program...
Descripción del código
Nota:
Es posible que los fragmentos de código de esta sección se hayan modificado para mejorar la legibilidad. Para obtener un ejemplo de trabajo completo, consulte el código fuente.
Ahora que ha ejecutado el código, vamos a desglosar los pasos clave:
- Creación de un cliente de búsqueda
- Creación de un índice de búsqueda
- Carga de documentos en el índice
- Consulta del índice
Creación de un cliente de búsqueda
En , creará dos clientes:
- SearchIndexClient crea el índice.
- SearchClient carga y consulta un índice existente.
Ambos clientes requieren el punto de conexión de servicio y una credencial para la autenticación. En este inicio rápido, usará DefaultAzureCredential para la autenticación sin claves con Microsoft Entra ID.
Creación de un índice de búsqueda
En este inicio rápido se crea un índice de hoteles que se cargará con datos de hotel y en el que se ejecutarán consultas. En este paso, se definen los campos en el índice. Cada definición de campo incluye un nombre, un tipo de datos y atributos que determinan cómo se usa el campo.
En este ejemplo se usan métodos sincrónicos de la clase SearchIndexClient para simplificar y leer. Sin embargo, en escenarios de producción, use métodos asincrónicos para mantener la aplicación escalable y con capacidad de respuesta. Por ejemplo, use CreateIndexAsync en lugar de CreateIndex.
Definición de las estructuras
Crea dos clases auxiliares, y , para definir la estructura de un documento de hotel y su dirección. La clase incluye campos para el id. del hotel, nombre, descripción, categoría, etiquetas, aparcamiento, fecha de renovación, calificación y dirección. La clase incluye campos para la dirección, la ciudad, el estado o provincia, el código postal y el país o región.
En el cliente de biblioteca Azure.Search.Documents, puede usar SearchableField y SimpleField para optimizar las definiciones de campo. Ambas son clases auxiliares que generan un SearchField y pueden simplificar el código:
puede ser cualquier tipo de datos, siempre no se puede buscar (se omite para las consultas de búsqueda de texto completo) y es recuperable (no oculto). Otros atributos están desactivados de forma predeterminada, pero se pueden habilitar. Puede usar un para los identificadores de documento o los campos que se usan solo en filtros, facetas o perfiles de puntuación. Si es así, aplique los atributos necesarios para el escenario, como para un identificador de documento.
debe ser una cadena y siempre permite búsquedas y se puede recuperar. Otros atributos están desactivados de forma predeterminada, pero se pueden habilitar. Ya que este tipo de campo se puede buscar, admite sinónimos y el complemento completo de las propiedades del analizador.
Tanto si usa la API básica de , como uno de los modelos auxiliares, debe habilitar explícitamente los atributos de filtro, faceta y ordenación. Por ejemplo, IsFilterable, IsSortabley IsFacetable se tienen que atribuir explícitamente, como se muestra en el ejemplo anterior.
Creación del índice de búsqueda
En , se crea un objeto SearchIndex y, a continuación, se llama al método CreateOrUpdateIndex para expresar el índice en el servicio de búsqueda. El índice también incluye SearchSuggester, que habilita la función autocompletar en los campos especificados.
// Create hotels-quickstart index
private static void CreateIndex(string indexName, SearchIndexClient searchIndexClient)
{
FieldBuilder fieldBuilder = new FieldBuilder();
var searchFields = fieldBuilder.Build(typeof(Hotel));
var definition = new SearchIndex(indexName, searchFields);
var suggester = new SearchSuggester("sg", new[] { "HotelName", "Category", "Address/City", "Address/StateProvince" });
definition.Suggesters.Add(suggester);
searchIndexClient.CreateOrUpdateIndex(definition);
}
Cargar documentos en el índice
Búsqueda de Azure AI busca en el contenido almacenado en el servicio. En este paso, cargará documentos JSON que se ajusten al índice de hoteles que creó.
En Búsqueda de Azure AI, los documentos de búsqueda son estructuras de datos que son entradas para la indexación y salidas de las consultas. Según se obtiene de un origen de datos externo, las entradas de documentos pueden ser filas en una base de datos, blobs en Azure Blob Storage o documentos JSON en el disco. En este ejemplo, se utiliza un atajo e incrustan directamente documentos JSON para cuatro hoteles.
Al cargar documentos, tiene que utilizar un objeto IndexDocumentsBatch. Un IndexDocumentsBatch objeto contiene una colección de Acciones, cada una de las cuales contiene un documento y una propiedad que indica a Búsqueda de Azure AI qué acción realizar (upload, merge, delete y mergeOrUpload).
En , se crea una matriz de documentos y acciones de índice y, a continuación, se pasa la matriz a . Los siguientes documentos se ajustan al índice hotels-quickstart, tal como se define mediante la clase hotel.
// Upload documents in a single Upload request.
private static void UploadDocuments(SearchClient searchClient)
{
IndexDocumentsBatch<Hotel> batch = IndexDocumentsBatch.Create(
IndexDocumentsAction.Upload(
new Hotel()
{
HotelId = "1",
HotelName = "Stay-Kay City Hotel",
Description = "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.",
Category = "Boutique",
Tags = new[] { "view", "air conditioning", "concierge" },
ParkingIncluded = false,
LastRenovationDate = new DateTimeOffset(2022, 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"
}
}),
// REDACTED FOR BREVITY
}
El método crea un IndexDocumentsBatch y llama a IndexDocuments en searchClient para cargar los documentos. En este inicio rápido se obtiene de utilizando GetSearchClient, que reutiliza las mismas credenciales.
SearchClient ingesterClient = searchIndexClient.GetSearchClient(indexName);
// Load documents
Console.WriteLine("{0}", "Uploading documents...\n");
UploadDocuments(ingesterClient);
Dado que esta aplicación de consola ejecuta todos los comandos secuencialmente, el código agrega un tiempo de espera de dos segundos entre la indexación y las consultas.
// Wait 2 seconds for indexing to complete before starting queries (for demo and console-app purposes only)
Console.WriteLine("Waiting for indexing...\n");
System.Threading.Thread.Sleep(2000);
El retraso de dos segundos compensa la indexación, que es asincrónica, de modo que todos los documentos se puedan indexar antes de que se ejecuten las consultas. La codificación en un retraso solo suele ser necesaria en las pruebas, demostraciones y aplicaciones de ejemplo.
Consultas al í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. En el caso de las consultas, use el método Search. Este método admite texto de búsqueda (la cadena de consulta) y otras opciones.
La clase SearchResults representa los resultados.
En , el método imprime los resultados de la búsqueda en la consola.
// Write search results to console
private static void WriteDocuments(SearchResults<Hotel> searchResults)
{
foreach (SearchResult<Hotel> result in searchResults.GetResults())
{
Console.WriteLine(result.Document);
}
Console.WriteLine();
}
private static void WriteDocuments(AutocompleteResults autoResults)
{
foreach (AutocompleteItem result in autoResults.Results)
{
Console.WriteLine(result.Text);
}
Console.WriteLine();
}
Ejemplo de consulta 1
El método ejecuta consultas y devuelve resultados. Los resultados son objetos de Hotel. Este ejemplo muestra la firma del método y la primera consulta. Esta consulta muestra el parámetro que permite crear el resultado con los campos seleccionados del documento.
// Run queries, use WriteDocuments to print output
private static void RunQueries(SearchClient searchClient)
{
SearchOptions options;
SearchResults<Hotel> response;
// Query 1
Console.WriteLine("Query #1: Search on empty term '*' to return all documents, showing a subset of fields...\n");
options = new SearchOptions()
{
IncludeTotalCount = true,
Filter = "",
OrderBy = { "" }
};
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Rating");
response = searchClient.Search<Hotel>("*", options);
WriteDocuments(response);
// REDACTED FOR BREVITY
}
Ejemplo de consulta 2
En la segunda consulta, busque en un término, agregue un filtro que seleccione documentos donde sea mayor que 4 y, a continuación, ordene por en orden descendente. Un filtro es una expresión booleana evaluada sobre los campos IsFilterable en un índice. Las consultas de filtro incluyen o excluyen valores. Como tal, no hay puntuaciones de relevancia asociadas a una consulta de filtro.
// Query 2
Console.WriteLine("Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...\n");
options = new SearchOptions()
{
Filter = "Rating gt 4",
OrderBy = { "Rating desc" }
};
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Rating");
response = searchClient.Search<Hotel>("hotels", options);
WriteDocuments(response);
Ejemplo de consulta 3
La tercera consulta muestra , que se usa para definir el ámbito de una operación de búsqueda de texto completo en campos específicos.
// Query 3
Console.WriteLine("Query #3: Limit search to specific fields (pool in Tags field)...\n");
options = new SearchOptions()
{
SearchFields = { "Tags" }
};
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Tags");
response = searchClient.Search<Hotel>("pool", options);
WriteDocuments(response);
Ejemplo de consulta 4
La cuarta consulta muestra , que se puede usar para estructurar una estructura de navegación por facetas.
// Query 4
Console.WriteLine("Query #4: Facet on 'Category'...\n");
options = new SearchOptions()
{
Filter = ""
};
options.Facets.Add("Category");
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Category");
response = searchClient.Search<Hotel>("*", options);
WriteDocuments(response);
Ejemplo de consulta 5
En la quinta consulta se devuelve un documento específico. Una búsqueda de documentos es una respuesta típica a un evento en un conjunto de resultados.
// Query 5
Console.WriteLine("Query #5: Look up a specific document...\n");
Response<Hotel> lookupResponse;
lookupResponse = searchClient.GetDocument<Hotel>("3");
Console.WriteLine(lookupResponse.Value.HotelId);
Ejemplo de consulta 6
La última consulta muestra la sintaxis de autocompletar; se simula una entrada de usuario parcial sa que se resuelve en dos posibles coincidencias en los asociados al que se ha definido en el índice.
// Query 6
Console.WriteLine("Query #6: Call Autocomplete on HotelName...\n");
var autoresponse = searchClient.Autocomplete("sa", "sg");
WriteDocuments(autoresponse);
Resumen de consultas
Las consultas anteriores muestran varias maneras de buscar términos coincidentes en una consulta: búsqueda de texto completo, filtros y autocompletar.
El método SearchClient.Search realiza búsquedas de texto completo y filtros. Puede pasar una consulta de búsqueda en la cadena , mientras que una expresión de filtro se puede pasar en la propiedad Filter de la clase SearchOptions. Para filtrar sin buscar, solo tiene que pasar al parámetro del método Search. Para buscar sin filtrar, deje la propiedad sin establecer, o no pase ninguna instancia de .
En este inicio rápido, usará la biblioteca cliente Búsqueda de Azure AI para Java para crear, cargar y consultar un índice de búsqueda para full-text search, también conocido como búsqueda de palabras clave.
La búsqueda de texto completo usa Apache Lucene para indexar y consultar y el algoritmo de clasificación BM25 para obtener resultados de puntuación. En este inicio rápido se usan datos ficticios del hotel del repositorio azure-search-sample-data GitHub para rellenar el índice.
Sugerencia
¿Quieres empezar de inmediato? Descargue el código source en GitHub.
Requisitos previos
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Un servicio Búsqueda de Azure AI. Puede usar un servicio gratuito para este inicio rápido.
Git para clonar el repositorio de ejemplo.
El CLI de Azure para la autenticación sin claves con Microsoft Entra ID.
Configurar el acceso
Antes de empezar, asegúrese de que tiene permisos para acceder al contenido y las operaciones en Búsqueda de Azure AI. En este inicio rápido se usa Microsoft Entra ID para la autenticación y el acceso basado en roles para la autorización. Debe ser Propietario o Administrador de acceso de usuario para asignar roles. Si los roles no son factibles, use la autenticación basada en claves en su lugar.
Para configurar el acceso basado en rol recomendado:
Habilite el acceso basado en roles para el servicio de búsqueda.
Asigne los siguientes roles a la cuenta de usuario.
Colaborador del servicio Search
Colaborador de datos de índice de búsqueda
Lector de datos de índice de búsqueda
Obtención del punto de conexión
Cada servicio Búsqueda de Azure AI tiene un endpoint, que es una dirección URL única que identifica y proporciona acceso de red al servicio. En una sección posterior, especifique este punto de conexión para conectarse al servicio de búsqueda mediante programación.
Para obtener el punto de conexión:
Inicie sesión en el portal Azure y seleccione el servicio de búsqueda.
En el panel izquierdo, seleccione Información general.
Anote el punto de conexión, que debería tener un aspecto similar a .
Configuración del entorno
Use Git para clonar el repositorio de ejemplo.
git clone https://github.com/Azure-Samples/azure-search-java-samplesDirígete a la carpeta quickstart y ábrela en Visual Studio Code.
cd azure-search-java-samples/quickstart-keyword-search code .En , reemplace el valor de marcador de posición por la dirección URL que obtuvo en Obtener punto de conexión.
Instale las dependencias.
mvn clean dependency:copy-dependenciesCuando se complete la compilación, compruebe que no aparece ningún error en la salida.
Para la autenticación sin claves con Microsoft Entra ID, inicie sesión en la cuenta de Azure. Si tiene varias suscripciones, seleccione la que contiene el servicio Búsqueda de Azure AI.
az login
Ejecución del código
Compile y ejecute la aplicación.
- Windows
- macOS
- Linux
javac -d target/classes -cp "target/dependency/*" src/main/java/azure/search/sample/*.java
java -cp "target/classes;target/dependency/*" azure.search.sample.App
Salida
La salida debe ser similar a la siguiente:
Waiting for indexing...
Starting queries...
Query #1: Search on empty term '*' to return all documents, showing a subset of fields...
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Address":{"City":"Atlanta"}}
{"HotelId":"2","HotelName":"Old Century Hotel","Address":{"City":"Sarasota"}}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Address":{"City":"San Antonio"}}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Address":{"City":"New York"}}
Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
Query #3: Limit search to specific fields (pool in Tags field)...
{"HotelId":"2","HotelName":"Old Century Hotel","Tags":["pool","free wifi","concierge"]}
Query #4: Facet on 'Category'...
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Category":"Suite"}
{"HotelId":"2","HotelName":"Old Century Hotel","Category":"Boutique"}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Category":"Boutique"}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Category":"Boutique"}
Query #5: Look up a specific document...
3
Query #6: Call Autocomplete on HotelName that starts with 's'...
stay
sublime
Complete.
Descripción del código
Nota:
Es posible que los fragmentos de código de esta sección se hayan modificado para mejorar la legibilidad. Para obtener un ejemplo de trabajo completo, consulte el código fuente.
Ahora que ha ejecutado el código, vamos a desglosar los pasos clave:
- Creación de un cliente de búsqueda
- Creación de un índice de búsqueda
- Carga de documentos en el índice
- Consulta del índice
Creación de un cliente de búsqueda
En , creará dos clientes:
- SearchIndexClient crea el índice.
- SearchClient carga y consulta un índice existente.
Ambos clientes requieren el punto de conexión de servicio y una credencial para la autenticación. En este inicio rápido, usará DefaultAzureCredential para la autenticación sin claves con Microsoft Entra ID.
Creación de un índice de búsqueda
En este inicio rápido se crea un índice de hoteles que se cargará con datos de hotel y en el que se ejecutarán consultas. En este paso, se definen los campos en el índice. Cada definición de campo incluye un nombre, un tipo de datos y atributos que determinan cómo se usa el campo.
En este ejemplo se usan métodos sincrónicos de la clase SearchIndexClient para simplificar y leer. Sin embargo, en escenarios de producción, use la clase SearchIndexAsyncClient para mantener la aplicación escalable y con capacidad de respuesta.
Definición de las estructuras
Crea dos clases auxiliares, y , para definir la estructura de un documento de hotel y su dirección. La clase incluye campos para el id. del hotel, nombre, descripción, categoría, etiquetas, aparcamiento, fecha de renovación, calificación y dirección. La clase incluye campos para la dirección, la ciudad, el estado o provincia, el código postal y el país o región.
En la biblioteca cliente azure-search-documents, puede usar SearchableField y SimpleField para simplificar las definiciones de campo. Ambas son anotaciones que se pueden aplicar a campos o métodos para generar un searchField:
- puede ser cualquier tipo de datos, siempre no se puede buscar (se omite para las consultas de búsqueda de texto completo) y es recuperable (no oculto). Otros atributos están desactivados de forma predeterminada, pero se pueden habilitar. Puede usar un para los identificadores de documento o los campos que se usan solo en filtros, facetas o perfiles de puntuación. Si es así, aplique los atributos necesarios para el escenario, como para un identificador de documento.
- debe ser una cadena y siempre permite búsquedas y se puede recuperar. Otros atributos están desactivados de forma predeterminada, pero se pueden habilitar. Ya que este tipo de campo se puede buscar, admite sinónimos y el complemento completo de las propiedades del analizador.
Tanto si usa la API básica de , como uno de los modelos auxiliares, debe habilitar explícitamente los atributos de filtro, faceta y ordenación. Por ejemplo, isFilterable, isSortable y isFacetable deben atribuirse explícitamente, como se muestra en el ejemplo anterior.
Creación del índice de búsqueda
En , se crea un objeto SearchIndex y, a continuación, se llama al método createOrUpdateIndex para expresar el índice en el servicio de búsqueda. El índice también incluye SearchSuggester, que habilita la función autocompletar en los campos especificados.
// Create Search Index for Hotel model
searchIndexClient.createOrUpdateIndex(
new SearchIndex(indexName, SearchIndexClient.buildSearchFields(Hotel.class, null))
.setSuggesters(new SearchSuggester("sg", Arrays.asList("HotelName"))));
Cargar documentos en el índice
Búsqueda de Azure AI busca en el contenido almacenado en el servicio. En este paso, cargará documentos JSON que se ajusten al índice de hoteles que creó.
En Búsqueda de Azure AI, los documentos de búsqueda son estructuras de datos que son entradas para la indexación y salidas de las consultas. Tal y como se obtiene de una fuente de datos externa, los documentos de entrada pueden ser filas en una base de datos, blobs en Azure Blob Storage o documentos JSON en el disco. En este ejemplo, se utiliza un atajo e incrustan directamente documentos JSON para cuatro hoteles.
Al cargar documentos, tiene que utilizar un objeto IndexDocumentsBatch. Un objeto IndexDocumentsBatch contiene una colección de IndexActions cada uno de los cuales contiene un documento y una propiedad que indica Búsqueda de Azure AI qué acción realizar (upload, merge, delete y mergeOrUpload).
En , se crea una matriz de documentos y acciones de índice y, a continuación, se pasa la matriz a . Los siguientes documentos se ajustan al índice hotels-quickstart, tal como se define mediante la clase hotel.
private static void uploadDocuments(SearchClient searchClient)
{
var hotelList = new ArrayList<Hotel>();
var hotel = new Hotel();
hotel.hotelId = "1";
hotel.hotelName = "Stay-Kay City Hotel";
hotel.description = "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.",
hotel.category = "Boutique";
hotel.tags = new String[] { "view", "air conditioning", "concierge" };
hotel.parkingIncluded = false;
hotel.lastRenovationDate = OffsetDateTime.of(LocalDateTime.of(LocalDate.of(2022, 1, 18), LocalTime.of(0, 0)), ZoneOffset.UTC);
hotel.rating = 3.6;
hotel.address = new Address();
hotel.address.streetAddress = "677 5th Ave";
hotel.address.city = "New York";
hotel.address.stateProvince = "NY";
hotel.address.postalCode = "10022";
hotel.address.country = "USA";
hotelList.add(hotel);
// REDACTED FOR BREVITY
var batch = new IndexDocumentsBatch<Hotel>();
batch.addMergeOrUploadActions(hotelList);
try
{
searchClient.indexDocuments(batch);
}
catch (Exception e)
{
e.printStackTrace();
// If for some reason any documents are dropped during indexing, you can compensate by delaying and
// retrying. This simple demo just logs failure and continues
System.err.println("Failed to index some of the documents");
}
}
El método crea un IndexDocumentsBatch y llama a indexDocuments en searchClient para cargar los documentos. En este inicio rápido se crea de forma independiente mediante SearchClientBuilder, que requiere configurar el punto de conexión y las credenciales por separado.
uploadDocuments(searchClient);
Dado que esta aplicación de consola ejecuta todos los comandos secuencialmente, el código agrega un tiempo de espera de dos segundos entre la indexación y las consultas.
// Wait 2 seconds for indexing to complete before starting queries (for demo and console-app purposes only)
System.out.println("Waiting for indexing...\n");
try
{
Thread.sleep(2000);
}
catch (InterruptedException e)
{
}
El retraso de dos segundos compensa la indexación, que es asincrónica, de modo que todos los documentos se puedan indexar antes de que se ejecuten las consultas. La codificación en un retraso solo suele ser necesaria en las pruebas, demostraciones y aplicaciones de ejemplo.
Consultas al í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. En el caso de las consultas, use el método de búsqueda . Este método admite texto de búsqueda (la cadena de consulta) y otras opciones.
La clase SearchPagedIterable representa los resultados.
En , el método imprime los resultados de la búsqueda en la consola.
// Write search results to console
private static void WriteSearchResults(SearchPagedIterable searchResults)
{
searchResults.iterator().forEachRemaining(result ->
{
Hotel hotel = result.getDocument(Hotel.class);
System.out.println(hotel);
});
System.out.println();
}
// Write autocomplete results to console
private static void WriteAutocompleteResults(AutocompletePagedIterable autocompleteResults)
{
autocompleteResults.iterator().forEachRemaining(result ->
{
String text = result.getText();
System.out.println(text);
});
System.out.println();
}
Ejemplo de consulta 1
El método ejecuta consultas y devuelve resultados. Los resultados son objetos de Hotel. Este ejemplo muestra la firma del método y la primera consulta. Esta consulta muestra el parámetro que permite crear el resultado con los campos seleccionados del documento.
// Run queries, use WriteDocuments to print output
private static void RunQueries(SearchClient searchClient)
{
// Query 1
System.out.println("Query #1: Search on empty term '*' to return all documents, showing a subset of fields...\n");
SearchOptions options = new SearchOptions();
options.setIncludeTotalCount(true);
options.setFilter("");
options.setOrderBy("");
options.setSelect("HotelId", "HotelName", "Address/City");
WriteSearchResults(searchClient.search("*", options, Context.NONE));
}
Ejemplo de consulta 2
En la segunda consulta, busque en un término, agregue un filtro que seleccione documentos donde sea mayor que 4 y, a continuación, ordene por en orden descendente. Un filtro es una expresión booleana evaluada sobre campos que se pueden filtrar en un índice. Las consultas de filtro incluyen o excluyen valores. Como tal, no hay puntuaciones de relevancia asociadas a una consulta de filtro.
// Query 2
System.out.println("Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...\n");
options = new SearchOptions();
options.setFilter("Rating gt 4");
options.setOrderBy("Rating desc");
options.setSelect("HotelId", "HotelName", "Rating");
WriteSearchResults(searchClient.search("hotels", options, Context.NONE));
Ejemplo de consulta 3
La tercera consulta muestra , que se usa para definir el ámbito de una operación de búsqueda de texto completo en campos específicos.
// Query 3
System.out.println("Query #3: Limit search to specific fields (pool in Tags field)...\n");
options = new SearchOptions();
options.setSearchFields("Tags");
options.setSelect("HotelId", "HotelName", "Tags");
WriteSearchResults(searchClient.search("pool", options, Context.NONE));
Ejemplo de consulta 4
La cuarta consulta muestra , que se puede usar para estructurar una estructura de navegación por facetas.
// Query 4
System.out.println("Query #4: Facet on 'Category'...\n");
options = new SearchOptions();
options.setFilter("");
options.setFacets("Category");
options.setSelect("HotelId", "HotelName", "Category");
WriteSearchResults(searchClient.search("*", options, Context.NONE));
Ejemplo de consulta 5
En la quinta consulta se devuelve un documento específico. Una búsqueda de documentos es una respuesta típica a un evento en un conjunto de resultados.
// Query 5
System.out.println("Query #5: Look up a specific document...\n");
Hotel lookupResponse = searchClient.getDocument("3", Hotel.class);
System.out.println(lookupResponse.hotelId);
System.out.println();
Ejemplo de consulta 6
La última consulta muestra la sintaxis de autocompletar; se simula una entrada de usuario parcial s que se resuelve en dos posibles coincidencias en los asociados al proveedor de sugerencias que se ha definido en el índice.
// Query 6
System.out.println("Query #6: Call Autocomplete on HotelName that starts with 's'...\n");
WriteAutocompleteResults(searchClient.autocomplete("s", "sg"));
Resumen de consultas
Las consultas anteriores muestran varias maneras de buscar términos coincidentes en una consulta: búsqueda de texto completo, filtros y autocompletar.
El método SearchClient.search realiza búsquedas de texto completo y filtros. Puede pasar una consulta de búsqueda en la cadena , mientras que una expresión de filtro se puede pasar en la propiedad filter de la clase SearchOptions. Para filtrar sin buscar, basta con pasar como en el método de búsqueda. Para buscar sin filtrar, deje la propiedad sin establecer, o no pase ninguna instancia de .
En este inicio rápido, usará la biblioteca cliente Búsqueda de Azure AI para JavaScript para crear, cargar y consultar un índice de búsqueda para full-text search, también conocido como búsqueda de palabras clave.
La búsqueda de texto completo usa Apache Lucene para indexar y consultar y el algoritmo de clasificación BM25 para obtener resultados de puntuación. En este inicio rápido se usan datos ficticios del hotel del repositorio azure-search-sample-data GitHub para rellenar el índice.
Sugerencia
¿Quieres empezar de inmediato? Descargue el código source en GitHub.
Requisitos previos
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Un servicio Búsqueda de Azure AI. Puede usar un servicio gratuito para este inicio rápido.
Node.js 20 LTS o posterior.
Git para clonar el repositorio de ejemplo.
El CLI de Azure para la autenticación sin claves con Microsoft Entra ID.
Configurar el acceso
Antes de empezar, asegúrese de que tiene permisos para acceder al contenido y las operaciones en Búsqueda de Azure AI. En este inicio rápido se usa Microsoft Entra ID para la autenticación y el acceso basado en roles para la autorización. Debe ser Propietario o Administrador de acceso de usuario para asignar roles. Si los roles no son factibles, use la autenticación basada en claves en su lugar.
Para configurar el acceso basado en rol recomendado:
Habilite el acceso basado en roles para el servicio de búsqueda.
Asigne los siguientes roles a la cuenta de usuario.
Colaborador del servicio Search
Colaborador de datos de índice de búsqueda
Lector de datos de índice de búsqueda
Obtención del punto de conexión
Cada servicio Búsqueda de Azure AI tiene un endpoint, que es una dirección URL única que identifica y proporciona acceso de red al servicio. En una sección posterior, especifique este punto de conexión para conectarse al servicio de búsqueda mediante programación.
Para obtener el punto de conexión:
Inicie sesión en el portal Azure y seleccione el servicio de búsqueda.
En el panel izquierdo, seleccione Información general.
Anote el punto de conexión, que debería tener un aspecto similar a .
Configuración del entorno
Use Git para clonar el repositorio de ejemplo.
git clone https://github.com/Azure-Samples/azure-search-javascript-samplesDirígete a la carpeta quickstart y ábrela en Visual Studio Code.
cd azure-search-javascript-samples/quickstart-keyword-search code .En , reemplace el valor de marcador de posición por la dirección URL que obtuvo en Obtener punto de conexión.
Cambie el nombre de a .
mv sample.env .envInstale las dependencias.
npm installCuando se complete la instalación, debería ver una carpeta en el directorio del proyecto.
Para la autenticación sin claves con Microsoft Entra ID, inicie sesión en la cuenta de Azure. Si tiene varias suscripciones, seleccione la que contiene el servicio Búsqueda de Azure AI.
az login
Ejecución del código
Ejecute la aplicación.
node index.js
Salida
La salida debe ser similar a la siguiente:
Running Azure AI Search Javascript quickstart...
Checking if index exists...
Deleting index...
Creating index...
Index named hotels-quickstart-js has been created.
Uploading documents...
Index operations succeeded: true
Querying the index...
Query #1 - search everything:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Result count: 4
Query #2 - search with filter, orderBy, and select:
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
Query #3 - limit searchFields:
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
Query #4 - limit searchFields and use facets:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Query #5 - Lookup document:
HotelId: 3; HotelName: Gastronomic Landscape Hotel
Descripción del código
Nota:
Es posible que los fragmentos de código de esta sección se hayan modificado para mejorar la legibilidad. Para obtener un ejemplo de trabajo completo, consulte el código fuente.
Ahora que ha ejecutado el código, vamos a desglosar los pasos clave:
- Creación de un cliente de búsqueda
- Creación de un índice de búsqueda
- Carga de documentos en el índice
- Consulta del índice
Creación de un cliente de búsqueda
En , creará dos clientes:
- SearchIndexClient crea el índice.
- SearchClient carga y consulta un índice existente.
Ambos clientes requieren el punto de conexión de servicio y una credencial para la autenticación. En este inicio rápido, usará DefaultAzureCredential para la autenticación sin claves con Microsoft Entra ID.
const credential = new DefaultAzureCredential();
const indexClient = new SearchIndexClient(endpoint, credential);
Creación de un índice de búsqueda
En este inicio rápido se crea un índice de hoteles que se cargará con datos de hotel y en el que se ejecutarán consultas. En este paso, importará una definición de índice desde un archivo JSON y creará el índice en el servicio de búsqueda.
El archivo define el esquema de índice, incluidos los campos y sus atributos. Cada campo se identifica con y tiene un específico. Cada campo también tiene una serie de atributos de índice que especifican si Búsqueda de Azure AI puede buscar, filtrar, ordenar y facetar el campo. La mayoría de los campos son tipos de datos simples, pero algunos, como , son tipos complejos que permiten crear estructuras de datos enriquecidas en el índice. Puede leer más sobre los tipos de datos admitidos y los atributos de índice descritos en Creación de un índice (REST).
El código siguiente importa en la parte superior de para que la función principal pueda acceder a la definición del índice.
const indexDefinition = require('./hotels_quickstart_index.json');
En este inicio rápido se elimina el índice si ya existe, que es una práctica habitual para el código de prueba o demostración. La función siguiente intenta eliminar el índice.
async function deleteIndexIfExists(indexClient, indexName) {
try {
await indexClient.deleteIndex(indexName);
console.log('Deleting index...');
} catch {
console.log('Index does not exist yet.');
}
}
El siguiente código extrae el nombre del índice de la definición de índice y pasa el junto con el a la función .
const indexName = indexDefinition["name"];
console.log('Checking if index exists...');
await deleteIndexIfExists(indexClient, indexName);
Después, crea el índice con el método .
console.log('Creating index...');
let index = await indexClient.createIndex(indexDefinition);
console.log(`Index named ${index.name} has been created.`);
Cargar documentos en el índice
En Búsqueda de Azure AI, los documentos son estructuras de datos que son entradas para indexar y salidas de consultas. Estos datos se pueden insertar en el índice, o bien se puede usar un indexador. En este inicio rápido, insertará los documentos en el índice mediante programación.
Las entradas de documento pueden ser filas de una base de datos, blobs en Azure Blob Storage o documentos JSON en el disco, como en este inicio rápido. De forma similar a , se importa en la parte superior de para que se pueda acceder a los datos en la función principal.
const hotelData = require('./hotels.json');
Para indexar datos en el índice de búsqueda, cree un searchClient. Mientras crea y administra un índice, carga documentos y consulta el índice.
En este inicio rápido se obtiene de usando getSearchClient, que reutiliza las mismas credenciales.
const searchClient = indexClient.getSearchClient(indexName);
El código siguiente carga los documentos en el índice de búsqueda mediante el método , que carga los documentos o los combina con un documento existente si ya existe un documento con la misma clave.
console.log('Uploading documents...');
let indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotelData['value']);
console.log(`Index operations succeeded: ${JSON.stringify(indexDocumentsResult.results[0].succeeded)}`);
Consultas al índice
Una vez que haya creado un índice y se hayan cargado los documentos, estará listo para enviarle consultas. En esta sección se envían cinco consultas diferentes al índice de búsqueda para mostrar diferentes partes de la funcionalidad de consulta disponibles.
Las consultas se escriben en una función llamada desde la función principal de la siguiente manera:
await sendQueries(searchClient);
El método de envía consultas. El primer parámetro es el texto de búsqueda y el segundo parámetro especifica opciones de búsqueda.
Ejemplo de consulta 1
La primera consulta busca , lo que equivale a buscar todo y seleccionar tres de los campos del índice. Es aconsejable usar solo en los campos en que sea necesario, ya que la extracción de datos innecesarios puede agregar latencia a las consultas.
En esta consulta, también tiene establecido en , lo que devuelve el número de resultados coincidentes que se han encontrado.
async function sendQueries(searchClient) {
console.log('Query #1 - search everything:');
let searchOptions = {
includeTotalCount: true,
select: ["HotelId", "HotelName", "Rating"]
};
let searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
console.log(`Result count: ${searchResults.count}`);
// remaining queries go here
}
Las restantes consultas que se describen a continuación también se deben agregar a la función . Aquí aparecen separadas para mejorar la legibilidad.
Ejemplo de consulta 2
La consulta siguiente especifica el término de búsqueda e incluye un filtro para devolver solo los resultados en los que el estado es igual a . Los resultados también se ordenan por el valor de del hotel. Un filtro es una expresión booleana evaluada sobre campos filtrables en un índice. Las consultas de filtro incluyen o excluyen valores. Como tal, no hay puntuaciones de relevancia asociadas a una consulta de filtro.
console.log('Query #2 - Search with filter, orderBy, and select:');
let state = 'FL';
searchOptions = {
filter: odata`Address/StateProvince eq ${state}`,
orderBy: ["Rating desc"],
select: ["HotelId", "HotelName", "Rating"]
};
searchResults = await searchClient.search("wifi", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
Ejemplo de consulta 3
La tercera consulta limita la búsqueda a un único campo que se puede buscar mediante el parámetro . Este enfoque es una excelente opción si desea que la consulta sea más eficaz, pero solo si sabe que le interesan las coincidencias de determinados campos.
console.log('Query #3 - Limit searchFields:');
searchOptions = {
select: ["HotelId", "HotelName", "Rating"],
searchFields: ["HotelName"]
};
searchResults = await searchClient.search("sublime cliff", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
Ejemplo de consulta 4
Otra opción común que se incluye en las consultas es . Las facetas le permiten crear filtros en la interfaz de usuario, con el fin de que los usuarios sepan fácilmente por qué valores pueden filtrar. Esta consulta también limita la búsqueda al campo.
console.log('Query #4 - limit searchFields and use facets:');
searchOptions = {
facets: ["Category"],
select: ["HotelId", "HotelName", "Rating"],
searchFields: ["HotelName"]
};
searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
Ejemplo de consulta 5
La consulta final utiliza el método de . Esto le permite recuperar de forma eficaz un documento por su clave.
console.log('Query #5 - Lookup document:');
let documentResult = await searchClient.getDocument(key='3')
console.log(`HotelId: ${documentResult.HotelId}; HotelName: ${documentResult.HotelName}`)
Resumen de consultas
Las consultas anteriores muestran varias formas de buscar términos coincidentes en una consulta: búsqueda de texto completo, filtros y búsqueda de documentos.
El método realiza la búsqueda de texto completo y los filtros. Puede pasar una consulta de búsqueda en la cadena , mientras que una expresión de filtro se puede pasar en la propiedad de la clase . Para filtrar sin buscar, basta con pasar para el parámetro del método . Para buscar sin filtrar, deje la propiedad sin establecer, o no pase ninguna instancia de .
En este inicio rápido, usará la biblioteca cliente Búsqueda de Azure AI para Python para crear, cargar y consultar un índice de búsqueda para búsqueda de texto completo, también conocido como búsqueda de palabras clave.
La búsqueda de texto completo usa Apache Lucene para indexar y consultar y el algoritmo de clasificación BM25 para obtener resultados de puntuación. En este inicio rápido se usan datos ficticios del hotel del repositorio azure-search-sample-data GitHub para rellenar el índice.
Sugerencia
¿Quieres empezar de inmediato? Descargue el código source en GitHub.
Requisitos previos
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Un servicio Búsqueda de Azure AI. Puede usar un servicio gratuito para este inicio rápido.
Python 3.8 o posterior.
Visual Studio Code con las extensiones Python y Jupyter.
Git para clonar el repositorio de ejemplo.
El CLI de Azure para la autenticación sin claves con Microsoft Entra ID.
Configurar el acceso
Antes de empezar, asegúrese de que tiene permisos para acceder al contenido y las operaciones en Búsqueda de Azure AI. En este inicio rápido se usa Microsoft Entra ID para la autenticación y el acceso basado en roles para la autorización. Debe ser Propietario o Administrador de acceso de usuario para asignar roles. Si los roles no son factibles, use la autenticación basada en claves en su lugar.
Para configurar el acceso basado en rol recomendado:
Habilite el acceso basado en roles para el servicio de búsqueda.
Asigne los siguientes roles a la cuenta de usuario.
Colaborador del servicio Search
Colaborador de datos de índice de búsqueda
Lector de datos de índice de búsqueda
Obtención del punto de conexión
Cada servicio Búsqueda de Azure AI tiene un endpoint, que es una dirección URL única que identifica y proporciona acceso de red al servicio. En una sección posterior, especifique este punto de conexión para conectarse al servicio de búsqueda mediante programación.
Para obtener el punto de conexión:
Inicie sesión en el portal Azure y seleccione el servicio de búsqueda.
En el panel izquierdo, seleccione Información general.
Anote el punto de conexión, que debería tener un aspecto similar a .
Configuración del entorno
Use Git para clonar el repositorio de ejemplo.
git clone https://github.com/Azure-Samples/azure-search-python-samplesDirígete a la carpeta quickstart y ábrela en Visual Studio Code.
cd azure-search-python-samples/Quickstart-Keyword-Search code .Abierto .
Presione Ctrl+Mayús+P, seleccione Cuaderno: Seleccione Kernel de cuaderno y siga las indicaciones para crear un entorno virtual.
Cuando haya finalizado, debería ver una carpeta en el directorio del proyecto.
Ejecute la primera celda de código para instalar los paquetes necesarios.
En la segunda celda de código, reemplace el valor de marcador de posición con la URL que obtuvo en el apartado Get endpoint y ejecute la celda.
Para la autenticación sin claves con Microsoft Entra ID, inicie sesión en la cuenta de Azure. Si tiene varias suscripciones, seleccione la que contiene el servicio Búsqueda de Azure AI.
az login
Ejecución del código
Ejecute las celdas de código restantes secuencialmente para crear un índice, cargar documentos y consultar el índice.
Salida
Cada celda de código imprime su salida en el cuaderno. El ejemplo siguiente es la salida de la primera consulta, una búsqueda vacía que devuelve todos los documentos del índice.
Total Documents Matching Query: 4
1.0
Gastronomic Landscape Hotel
['restaurant', 'bar', 'continental breakfast']
Description: The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.
1.0
Old Century Hotel
['pool', 'free wifi', 'concierge']
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. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.
1.0
Sublime Palace Hotel
['concierge', 'view', 'air conditioning']
Description: Sublime Palace 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 19th century resort, updated for every modern convenience.
1.0
Stay-Kay City Hotel
['view', 'air conditioning', 'concierge']
Description: This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.
Descripción del código
Nota:
Es posible que los fragmentos de código de esta sección se hayan modificado para mejorar la legibilidad. Para obtener un ejemplo de trabajo completo, consulte el código fuente.
Ahora que ha ejecutado el código, vamos a desglosar los pasos clave:
- Creación de los clientes
- Creación de un índice de búsqueda
- Carga de documentos en el índice
- Consulta del índice
- Quitar el índice
Creación de los clientes
El cuaderno crea dos clientes:
- SearchIndexClient crea y administra índices.
- SearchClient carga documentos y ejecuta consultas.
Ambos clientes requieren el punto de conexión de servicio y una credencial. En este inicio rápido, usará DefaultAzureCredential para la autenticación sin claves con Microsoft Entra ID.
Creación de un índice de búsqueda
En este inicio rápido se crea un índice de hoteles que se cargará con datos de hotel y en el que se ejecutarán consultas. En este paso, se definen los campos en el índice. Cada definición de campo incluye un nombre, un tipo de datos y atributos que determinan cómo se usa el campo.
El cuaderno usa , y del paquete de modelos para definir el esquema. Puede leer más sobre los tipos de datos admitidos y los atributos de índice descritos en Creación de un índice (REST).
# Create a search schema
index_client = SearchIndexClient(
endpoint=search_endpoint, credential=credential)
fields = [
SimpleField(name="HotelId", type=SearchFieldDataType.String, key=True),
SearchableField(name="HotelName", type=SearchFieldDataType.String, sortable=True),
SearchableField(name="Description", type=SearchFieldDataType.String, analyzer_name="en.lucene"),
SearchableField(name="Category", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
SearchableField(name="Tags", collection=True, type=SearchFieldDataType.String, facetable=True, filterable=True),
SimpleField(name="ParkingIncluded", type=SearchFieldDataType.Boolean, facetable=True, filterable=True, sortable=True),
SimpleField(name="LastRenovationDate", type=SearchFieldDataType.DateTimeOffset, facetable=True, filterable=True, sortable=True),
SimpleField(name="Rating", type=SearchFieldDataType.Double, facetable=True, filterable=True, sortable=True),
ComplexField(name="Address", fields=[
SearchableField(name="StreetAddress", type=SearchFieldDataType.String),
SearchableField(name="City", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
SearchableField(name="StateProvince", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
SearchableField(name="PostalCode", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
SearchableField(name="Country", type=SearchFieldDataType.String, facetable=True, filterable=True, sortable=True),
])
]
scoring_profiles = []
suggester = [{'name': 'sg', 'source_fields': ['Tags', 'Address/City', 'Address/Country']}]
# Create the search index=
index = SearchIndex(name=index_name, fields=fields, suggesters=suggester, scoring_profiles=scoring_profiles)
result = index_client.create_or_update_index(index)
print(f' {result.name} created')
Cargar documentos en el índice
Búsqueda de Azure AI busca en el contenido almacenado en el servicio. En este paso, cargará documentos JSON que se ajusten al índice de hoteles que creó.
En Búsqueda de Azure AI, los documentos son estructuras de datos que son entradas para indexar y salidas de consultas. El cuaderno define una carga de documentos como una lista de diccionarios que contienen datos de hotel.
# Create a documents payload
documents = [
{
"@search.action": "upload",
"HotelId": "1",
"HotelName": "Stay-Kay City Hotel",
"Description": "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.",
"Category": "Boutique",
"Tags": [ "view", "air conditioning", "concierge" ],
"ParkingIncluded": "false",
"LastRenovationDate": "2020-01-18T00:00:00Z",
"Rating": 3.60,
"Address": {
"StreetAddress": "677 5th Ave",
"City": "New York",
"StateProvince": "NY",
"PostalCode": "10022",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "2",
"HotelName": "Old Century Hotel",
"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. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
"Category": "Boutique",
"Tags": [ "pool", "free wifi", "concierge" ],
"ParkingIncluded": "false",
"LastRenovationDate": "2019-02-18T00:00:00Z",
"Rating": 3.60,
"Address": {
"StreetAddress": "140 University Town Center Dr",
"City": "Sarasota",
"StateProvince": "FL",
"PostalCode": "34243",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "3",
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
"Category": "Suite",
"Tags": [ "restaurant", "bar", "continental breakfast" ],
"ParkingIncluded": "true",
"LastRenovationDate": "2015-09-20T00:00:00Z",
"Rating": 4.80,
"Address": {
"StreetAddress": "3393 Peachtree Rd",
"City": "Atlanta",
"StateProvince": "GA",
"PostalCode": "30326",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "4",
"HotelName": "Sublime Palace Hotel",
"Description": "Sublime Palace 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 19th century resort, updated for every modern convenience.",
"Category": "Boutique",
"Tags": [ "concierge", "view", "air conditioning" ],
"ParkingIncluded": "true",
"LastRenovationDate": "2020-02-06T00:00:00Z",
"Rating": 4.60,
"Address": {
"StreetAddress": "7400 San Pedro Ave",
"City": "San Antonio",
"StateProvince": "TX",
"PostalCode": "78216",
"Country": "USA"
}
}
]
El método agrega documentos al índice, creándolos si no existen o actualizándolos si ya existen.
search_client = SearchClient(endpoint=search_endpoint,
index_name=index_name,
credential=credential)
try:
result = search_client.upload_documents(documents=documents)
print("Upload of new document succeeded: {}".format(result[0].succeeded))
except Exception as ex:
print (ex.message)
Consultas al í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.
Use el método searchClient para ejecutar consultas.
Las consultas de ejemplo del cuaderno muestran patrones comunes:
Búsqueda vacía: ejecuta una búsqueda vacía (), devolviendo una lista no bebida (puntuación de búsqueda = 1,0) de documentos arbitrarios. Dado que no hay ningún criterio, en los resultados se incluyen todos los documentos.
Búsqueda de términos: agrega términos completos a la expresión de búsqueda (). Esta consulta especifica que los resultados solo contienen esos campos en el parámetro . La limitación de los campos que se devuelven reduce la cantidad de datos que se envían mediante la conexión y reduce la latencia de búsqueda.
Búsqueda filtrada: agrega una expresión de filtro, devolviendo solo los hoteles con una clasificación superior a cuatro, ordenados en orden descendente.
Búsqueda por campos: agrega a la ejecución de consultas de ámbito a campos específicos.
Búsqueda por facetas: genera facetas para coincidencias positivas encontradas en los resultados de búsqueda. No hay ninguna coincidencia. Si los resultados de la búsqueda no incluyen el término "wifi", "wifi" no aparece en la estructura de navegación por facetas.
Búsqueda de documentos: devuelve un documento basado en su clave. Esta operación es útil si desea proporcionar detalles cuando un usuario selecciona un elemento en un resultado de búsqueda.
Autocompletar: ofrece sugerencias de coincidencias a medida que el usuario escribe en el cuadro de búsqueda. Autocompletar usa un proveedor de sugerencias () para saber qué campos contienen posibles coincidencias con las solicitudes del proveedor de sugerencias. En este inicio rápido, esos campos son , y . Para simular la función autocompletar, pase las letras "sa" como cadena parcial. El método de devuelve posibles coincidencias de términos.
Quitar el índice
Si ha terminado con este índice, puede eliminarlo ejecutando la celda de código . Eliminar índices innecesarios libera espacio para recorrer más inicios rápidos y tutoriales.
try:
result = index_client.delete_index(index_name)
print ('Index', index_name, 'Deleted')
except Exception as ex:
print (ex)
En este inicio rápido, usará la biblioteca cliente Búsqueda de Azure AI para JavaScript (compatible con TypeScript) para crear, cargar y consultar un índice de búsqueda para full-text search, también conocido como búsqueda de palabras clave.
La búsqueda de texto completo usa Apache Lucene para indexar y consultar y el algoritmo de clasificación BM25 para obtener resultados de puntuación. En este inicio rápido se usan datos ficticios del hotel del repositorio azure-search-sample-data GitHub para rellenar el índice.
Sugerencia
¿Quieres empezar de inmediato? Descargue el código source en GitHub.
Requisitos previos
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Un servicio Búsqueda de Azure AI. Puede usar un servicio gratuito para este inicio rápido.
Node.js 20 LTS o posterior para ejecutar el código compilado.
TypeScript para compilar TypeScript en JavaScript.
Git para clonar el repositorio de ejemplo.
El CLI de Azure para la autenticación sin claves con Microsoft Entra ID.
Configurar el acceso
Antes de empezar, asegúrese de que tiene permisos para acceder al contenido y las operaciones en Búsqueda de Azure AI. En este inicio rápido se usa Microsoft Entra ID para la autenticación y el acceso basado en roles para la autorización. Debe ser Propietario o Administrador de acceso de usuario para asignar roles. Si los roles no son factibles, use la autenticación basada en claves en su lugar.
Para configurar el acceso basado en rol recomendado:
Habilite el acceso basado en roles para el servicio de búsqueda.
Asigne los siguientes roles a la cuenta de usuario.
Colaborador del servicio Search
Colaborador de datos de índice de búsqueda
Lector de datos de índice de búsqueda
Obtención del punto de conexión
Cada servicio Búsqueda de Azure AI tiene un endpoint, que es una dirección URL única que identifica y proporciona acceso de red al servicio. En una sección posterior, especifique este punto de conexión para conectarse al servicio de búsqueda mediante programación.
Para obtener el punto de conexión:
Inicie sesión en el portal Azure y seleccione el servicio de búsqueda.
En el panel izquierdo, seleccione Información general.
Anote el punto de conexión, que debería tener un aspecto similar a .
Configuración del entorno
Use Git para clonar el repositorio de ejemplo.
git clone https://github.com/Azure-Samples/azure-search-javascript-samplesDirígete a la carpeta quickstart y ábrela en Visual Studio Code.
cd azure-search-javascript-samples/quickstart-keyword-search code .En , reemplace el valor de marcador de posición por la dirección URL que obtuvo en Obtener punto de conexión.
Cambie el nombre de a .
mv sample.env .envInstale las dependencias.
npm install npm install typescript @types/node --save-dev npm pkg set type=moduleCuando se complete la instalación, debería ver una carpeta en el directorio del proyecto.
Para la autenticación sin claves con Microsoft Entra ID, inicie sesión en la cuenta de Azure. Si tiene varias suscripciones, seleccione la que contiene el servicio Búsqueda de Azure AI.
az login
Ejecución del código
El código de ejemplo usa JavaScript de forma predeterminada. Para ejecutar el código con TypeScript:
Cree un archivo denominado y pegue el código siguiente en él.
{ "compilerOptions": { "module": "NodeNext", "target": "ES2022", "moduleResolution": "NodeNext", "skipLibCheck": true, "strict": true, "resolveJsonModule": true }, "include": ["*.ts"], "exclude": ["node_modules"] }Cambie el nombre del archivo a y, a continuación, reemplace el contenido por el código siguiente. Este código convierte la sintaxis de CommonJS en importaciones de módulos ES, que son necesarias para la compilación de TypeScript.
// Import from the @azure/search-documents library import { SearchIndexClient, SearchClient, SearchFieldDataType, odata, SearchIndex } from "@azure/search-documents"; // Import from the Azure Identity library import { DefaultAzureCredential } from "@azure/identity"; // Importing the hotels sample data import hotelData from './hotels.json' with { type: "json" }; // Load the .env file if it exists import "dotenv/config"; // Defining the index definition const indexDefinition: SearchIndex = { "name": "hotels-quickstart", "fields": [ { "name": "HotelId", "type": "Edm.String" as SearchFieldDataType, "key": true, "filterable": true }, { "name": "HotelName", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": false, "sortable": true, "facetable": false }, { "name": "Description", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzerName": "en.lucene" }, { "name": "Category", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true }, { "name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "sortable": false, "facetable": true }, { "name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": true, "sortable": true, "facetable": true }, { "name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true, "facetable": true }, { "name": "Rating", "type": "Edm.Double", "filterable": true, "sortable": true, "facetable": true }, { "name": "Address", "type": "Edm.ComplexType", "fields": [ { "name": "StreetAddress", "type": "Edm.String" as SearchFieldDataType, "filterable": false, "sortable": false, "facetable": false, "searchable": true }, { "name": "City", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true }, { "name": "StateProvince", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true }, { "name": "PostalCode", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true }, { "name": "Country", "type": "Edm.String" as SearchFieldDataType, "searchable": true, "filterable": true, "sortable": true, "facetable": true } ] } ], "suggesters": [ { "name": "sg", "searchMode": "analyzingInfixMatching", "sourceFields": [ "HotelName" ] } ] }; async function main() { // Your search service endpoint (from .env file) const searchServiceEndpoint = process.env.SEARCH_API_ENDPOINT || ""; // Use the recommended keyless credential instead of the AzureKeyCredential credential. const credential = new DefaultAzureCredential(); //const credential = new AzureKeyCredential(Your search service admin key); // Create a SearchIndexClient to send create/delete index commands const searchIndexClient: SearchIndexClient = new SearchIndexClient( searchServiceEndpoint, credential ); // Creating a search client to upload documents and issue queries const indexName: string = "hotels-quickstart"; const searchClient: SearchClient<any> = searchIndexClient.getSearchClient(indexName); console.log('Checking if index exists...'); await deleteIndexIfExists(searchIndexClient, indexName); console.log('Creating index...'); let index: SearchIndex = await searchIndexClient.createIndex(indexDefinition); console.log(`Index named ${index.name} has been created.`); console.log('Uploading documents...'); let indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotelData['value']); console.log(`Index operations succeeded: ${JSON.stringify(indexDocumentsResult.results[0].succeeded)} `); // waiting one second for indexing to complete (for demo purposes only) await sleep(1000); console.log('Querying the index...'); console.log(); await sendQueries(searchClient); } async function deleteIndexIfExists(searchIndexClient: SearchIndexClient, indexName: string) { try { await searchIndexClient.deleteIndex(indexName); console.log('Deleting index...'); } catch { console.log('Index does not exist yet.'); } } async function sendQueries(searchClient: SearchClient<any>) { // Query 1 console.log('Query #1 - search everything:'); let searchOptions: any = { includeTotalCount: true, select: ["HotelId", "HotelName", "Rating"] }; let searchResults = await searchClient.search("*", searchOptions); for await (const result of searchResults.results) { console.log(`${JSON.stringify(result.document)}`); } console.log(`Result count: ${searchResults.count}`); console.log(); // Query 2 console.log('Query #2 - search with filter, orderBy, and select:'); let state = 'FL'; searchOptions = { filter: odata`Address/StateProvince eq ${state}`, orderBy: ["Rating desc"], select: ["HotelId", "HotelName", "Rating"] }; searchResults = await searchClient.search("wifi", searchOptions); for await (const result of searchResults.results) { console.log(`${JSON.stringify(result.document)}`); } console.log(); // Query 3 console.log('Query #3 - limit searchFields:'); searchOptions = { select: ["HotelId", "HotelName", "Rating"], searchFields: ["HotelName"] }; searchResults = await searchClient.search("sublime palace", searchOptions); for await (const result of searchResults.results) { console.log(`${JSON.stringify(result.document)}`); } console.log(); // Query 4 console.log('Query #4 - limit searchFields and use facets:'); searchOptions = { facets: ["Category"], select: ["HotelId", "HotelName", "Rating"], searchFields: ["HotelName"] }; searchResults = await searchClient.search("*", searchOptions); for await (const result of searchResults.results) { console.log(`${JSON.stringify(result.document)}`); } console.log(); // Query 5 console.log('Query #5 - Lookup document:'); let documentResult = await searchClient.getDocument('3'); console.log(`HotelId: ${documentResult.HotelId}; HotelName: ${documentResult.HotelName}`); console.log(); } function sleep(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } main().catch((err) => { console.error("The sample encountered an error:", err); });Transpile de TypeScript a JavaScript.
npx tscEjecute la aplicación.
node index.js
Salida
La salida debe ser similar a la siguiente:
Checking if index exists...
Deleting index...
Creating index...
Index named hotels-quickstart has been created.
Uploading documents...
Index operations succeeded: true
Querying the index...
Query #1 - search everything:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Result count: 4
Query #2 - search with filter, orderBy, and select:
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
Query #3 - limit searchFields:
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
Query #4 - limit searchFields and use facets:
{"HotelId":"3","HotelName":"Gastronomic Landscape Hotel","Rating":4.8}
{"HotelId":"2","HotelName":"Old Century Hotel","Rating":3.6}
{"HotelId":"4","HotelName":"Sublime Palace Hotel","Rating":4.6}
{"HotelId":"1","HotelName":"Stay-Kay City Hotel","Rating":3.6}
Query #5 - Lookup document:
HotelId: 3; HotelName: Gastronomic Landscape Hotel
Descripción del código
Nota:
Es posible que los fragmentos de código de esta sección se hayan modificado para mejorar la legibilidad. Para obtener un ejemplo de trabajo completo, consulte el código fuente.
Ahora que ha ejecutado el código, vamos a desglosar los pasos clave:
- Creación de un cliente de búsqueda
- Creación de un índice de búsqueda
- Carga de documentos en el índice
- Consulta del índice
Creación de un cliente de búsqueda
En , creará dos clientes:
- SearchIndexClient crea el índice.
- SearchClient carga y consulta un índice existente.
Ambos clientes requieren el punto de conexión de servicio y una credencial para la autenticación. En este inicio rápido, usará DefaultAzureCredential para la autenticación sin claves con Microsoft Entra ID.
const credential = new DefaultAzureCredential();
const searchIndexClient: SearchIndexClient = new SearchIndexClient(
searchServiceEndpoint,
credential
);
Creación de un índice de búsqueda
En este inicio rápido se crea un índice de hoteles que se cargará con datos de hotel y en el que se ejecutarán consultas. En este paso, se definen los campos en el índice.
El objeto indexDefinition define cómo funciona Búsqueda de Azure AI con los documentos que se cargan en el paso siguiente. Cada campo se identifica con y tiene un específico. Cada campo también tiene una serie de atributos de índice que especifican si Búsqueda de Azure AI puede buscar, filtrar, ordenar y facetar en el campo. La mayoría de los campos son tipos de datos simples, pero algunos, como , son tipos complejos que permiten crear estructuras de datos enriquecidas en el índice. Puede leer más sobre los tipos de datos admitidos y los atributos de índice descritos en Creación de un índice (REST).
const indexDefinition: SearchIndex = {
"name": "hotels-quickstart",
"fields": [
{
"name": "HotelId",
"type": "Edm.String" as SearchFieldDataType,
"key": true,
"filterable": true
},
{
"name": "HotelName",
"type": "Edm.String" as SearchFieldDataType,
"searchable": true,
"filterable": false,
"sortable": true,
"facetable": false
},
// REDACTED FOR BREVITY
],
"suggesters": [
{
"name": "sg",
"searchMode": "analyzingInfixMatching",
"sourceFields": ["HotelName"]
}
]
};
En este inicio rápido se elimina el índice si ya existe, que es una práctica habitual para el código de prueba o demostración.
async function deleteIndexIfExists(searchIndexClient: SearchIndexClient, indexName: string) {
try {
await searchIndexClient.deleteIndex(indexName);
console.log('Deleting index...');
} catch {
console.log('Index does not exist yet.');
}
}
Después, el índice se crea con el método .
let index: SearchIndex = await searchIndexClient.createIndex(indexDefinition);
Cargar documentos en el índice
En Búsqueda de Azure AI, los documentos son estructuras de datos que son entradas para indexar y salidas de consultas. Estos datos se pueden insertar en el índice, o bien se puede usar un indexador. En este inicio rápido, insertará los documentos en el índice mediante programación.
Las entradas de documento pueden ser filas de una base de datos, blobs en Azure Blob Storage o documentos JSON en el disco, como en este inicio rápido. Los datos del hotel se importan en la parte superior del archivo.
import hotelData from './hotels.json' with { type: "json" };
Para indexar datos en el índice de búsqueda, cree un searchClient. Mientras crea y administra un índice, carga documentos y consulta el índice.
En este inicio rápido se obtiene de usando getSearchClient, que reutiliza las mismas credenciales.
const searchClient: SearchClient<any> = searchIndexClient.getSearchClient(indexName);
El método carga los documentos o los combina con un documento existente si ya existe un documento con la misma clave.
let indexDocumentsResult = await searchClient.mergeOrUploadDocuments(hotelData['value']);
Consultas al índice
Una vez que haya creado un índice y se hayan cargado los documentos, estará listo para enviarle consultas. En esta sección se envían cinco consultas diferentes al índice de búsqueda para mostrar diferentes partes de la funcionalidad de consulta disponibles.
Las consultas se escriben en una función a la que se llama en la función principal.
await sendQueries(searchClient);
Para enviar las consultas, se usa el método de . El primer parámetro es el texto de búsqueda y el segundo parámetro especifica opciones de búsqueda.
Ejemplo de consulta 1
La primera consulta busca , que equivale a buscar todo y selecciona tres de los campos del índice. Es aconsejable usar solo en los campos en que sea necesario, ya que la extracción de datos innecesarios puede agregar latencia a las consultas.
En esta consulta, también tiene establecido en , lo que devuelve el número de resultados coincidentes que se han encontrado.
console.log('Query #1 - search everything:');
let searchOptions: any = {
includeTotalCount: true,
select: ["HotelId", "HotelName", "Rating"]
};
let searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
console.log(`Result count: ${searchResults.count}`);
Ejemplo de consulta 2
En la siguiente consulta, el término de búsqueda se especifica con un filtro para devolver solo los resultados donde el estado es igual a . Los resultados también se ordenan por el valor de del hotel.
console.log('Query #2 - search with filter, orderBy, and select:');
let state = 'FL';
searchOptions = {
filter: odata`Address/StateProvince eq ${state}`,
orderBy: ["Rating desc"],
select: ["HotelId", "HotelName", "Rating"]
};
searchResults = await searchClient.search("wifi", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
Ejemplo de consulta 3
La búsqueda se limita a un único campo que se puede buscar mediante el parámetro . Este enfoque es una excelente opción si desea que la consulta sea más eficaz, pero solo si sabe que le interesan las coincidencias de determinados campos.
console.log('Query #3 - limit searchFields:');
searchOptions = {
select: ["HotelId", "HotelName", "Rating"],
searchFields: ["HotelName"]
};
searchResults = await searchClient.search("sublime palace", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
Ejemplo de consulta 4
Otra opción común que se incluye en las consultas es . Las facetas permiten proporcionar la exploración en profundidad autodireccional de los resultados en la interfaz de usuario. Los resultados de facetas se pueden convertir en casillas en el panel de resultados.
console.log('Query #4 - limit searchFields and use facets:');
searchOptions = {
facets: ["Category"],
select: ["HotelId", "HotelName", "Rating"],
searchFields: ["HotelName"]
};
searchResults = await searchClient.search("*", searchOptions);
for await (const result of searchResults.results) {
console.log(`${JSON.stringify(result.document)}`);
}
Ejemplo de consulta 5
La consulta final utiliza el método de . Esto le permite recuperar de forma eficaz un documento por su clave.
console.log('Query #5 - Lookup document:');
let documentResult = await searchClient.getDocument('3');
console.log(`HotelId: ${documentResult.HotelId}; HotelName: ${documentResult.HotelName}`);
Resumen de consultas
Las consultas anteriores muestran varias formas de buscar términos coincidentes en una consulta: búsqueda de texto completo, filtros y búsqueda de documentos.
El método realiza la búsqueda de texto completo y los filtros. Puede pasar una consulta de búsqueda en la cadena , mientras que una expresión de filtro se puede pasar en la propiedad de la clase . Para filtrar sin buscar, basta con pasar para el parámetro del método . Para buscar sin filtrar, deje la propiedad sin establecer, o no pase ninguna instancia de .
En esta guía de inicio rápido, usará las API REST de Búsqueda de Azure AI para crear, cargar y consultar un índice de búsqueda para búsqueda de texto completo, también conocido como búsqueda de palabras clave.
La búsqueda de texto completo usa Apache Lucene para indexar y consultar y el algoritmo de clasificación BM25 para obtener resultados de puntuación. En este inicio rápido se usan datos ficticios del hotel del repositorio azure-search-sample-data GitHub para rellenar el índice.
Sugerencia
¿Quieres empezar de inmediato? Descargue el código source en GitHub.
Requisitos previos
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Un servicio Búsqueda de Azure AI. Puede usar un servicio gratuito para este inicio rápido.
Visual Studio Code con la extensión REST Client.
Git para clonar el repositorio de ejemplo.
El CLI de Azure para la autenticación sin claves con Microsoft Entra ID.
Configurar el acceso
Antes de empezar, asegúrese de que tiene permisos para acceder al contenido y las operaciones en Búsqueda de Azure AI. En este inicio rápido se usa Microsoft Entra ID para la autenticación y el acceso basado en roles para la autorización. Debe ser Propietario o Administrador de acceso de usuario para asignar roles. Si los roles no son factibles, use la autenticación basada en claves en su lugar.
Para configurar el acceso basado en rol recomendado:
Habilite el acceso basado en roles para el servicio de búsqueda.
Asigne los siguientes roles a la cuenta de usuario.
Colaborador del servicio Search
Colaborador de datos de índice de búsqueda
Lector de datos de índice de búsqueda
Obtención del punto de conexión
Cada servicio Búsqueda de Azure AI tiene un endpoint, que es una dirección URL única que identifica y proporciona acceso de red al servicio. En una sección posterior, especifique este punto de conexión para conectarse al servicio de búsqueda mediante programación.
Para obtener el punto de conexión:
Inicie sesión en el portal Azure y seleccione el servicio de búsqueda.
En el panel izquierdo, seleccione Información general.
Anote el punto de conexión, que debería tener un aspecto similar a .
Configuración del entorno
Use Git para clonar el repositorio de ejemplo.
git clone https://github.com/Azure-Samples/azure-search-rest-samplesDirígete a la carpeta quickstart y ábrela en Visual Studio Code.
cd azure-search-rest-samples/Quickstart-keyword-search code .En , reemplace el valor de marcador de posición por la dirección URL que obtuvo en Obtener punto de conexión.
Para la autenticación sin claves con Microsoft Entra ID, inicie sesión en la cuenta de Azure. Si tiene varias suscripciones, seleccione la que contiene el servicio Búsqueda de Azure AI.
az loginPara la autenticación sin claves con Microsoft Entra ID, genere un token de acceso.
az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsvReemplace el valor del marcador de posición de por el token del paso anterior.
Ejecución del código
En , seleccione Enviar solicitud para comprobar la conexión.
Debe aparecer una respuesta en un panel adyacente. Si tiene índices existentes, se muestran. En caso contrario, la lista está vacía. Si el código HTTP es , está listo para continuar.
Envíe las solicitudes restantes secuencialmente para crear un índice, cargar documentos y consultar el índice.
Salida
Cada solicitud devuelve un JSON diferente en función de la operación. La salida clave es de , que debe tener un aspecto similar al siguiente:
{
"value": [
{
"@search.score": 0.5575875,
"HotelId": "3",
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services.",
"Tags": [
"restaurant",
"bar",
"continental breakfast"
]
}
]
}
Descripción del código
Nota:
Es posible que los fragmentos de código de esta sección se hayan modificado para mejorar la legibilidad. Para obtener un ejemplo de trabajo completo, consulte el código fuente.
Ahora que ha ejecutado el código, vamos a desglosar los pasos clave:
- Creación de un índice de búsqueda
- Carga de documentos en el índice
- Consulta del índice
Creación de un índice de búsqueda
Antes de agregar contenido a Búsqueda de Azure AI, debe crear un índice para definir cómo se almacena y estructura el contenido. Un índice es conceptualmente similar a una tabla de una base de datos relacional, pero está diseñada específicamente para operaciones de búsqueda, como la búsqueda de texto completo.
En este inicio rápido se llama a Indexes- Create (REST API) para crear un índice de búsqueda denominado y sus estructuras de datos físicas en el servicio de búsqueda.
Dentro del esquema de índice, la colección define la estructura de los documentos de hotel. Cada campo tiene atributos , data y que determinan su comportamiento durante la indexación y las consultas. El campo HotelId se marca como clave, que Búsqueda de Azure AI requiere identificar de forma única cada documento de un índice.
### Create a new index
POST {{baseUrl}}/indexes?api-version={{api-version}} HTTP/1.1
Content-Type: application/json
Authorization: Bearer {{token}}
{
"name": "hotels-quickstart",
"fields": [
{"name": "HotelId", "type": "Edm.String", "key": true, "filterable": true},
{"name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": false},
{"name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "en.lucene"},
{"name": "Category", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
{"name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "sortable": false, "facetable": true},
{"name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": true, "sortable": true, "facetable": true},
{"name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true, "facetable": true},
{"name": "Rating", "type": "Edm.Double", "filterable": true, "sortable": true, "facetable": true},
{"name": "Address", "type": "Edm.ComplexType",
"fields": [
{"name": "StreetAddress", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "searchable": true},
{"name": "City", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
{"name": "StateProvince", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
{"name": "PostalCode", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
{"name": "Country", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true}
]
}
]
}
Puntos clave sobre el esquema de índice:
Use campos de cadena () para hacer que los datos numéricos sean buscables de texto completo. Otros tipos de datos admitidos, como , son filtrables, ordenables, clasificables y recuperables, pero no son buscables.
La mayoría de los campos son tipos de datos simples, pero puede definir tipos complejos para representar datos anidados, como el campo.
Los atributos de campo determinan las acciones permitidas. Las API de REST permiten muchas acciones de forma predeterminada. Por ejemplo, todas las cadenas se pueden buscar y recuperar. Con las API REST, solo puede usar atributos si necesita deshabilitar un comportamiento.
Cargar documentos en el índice
Los índices recién creados están vacíos. Para rellenar un índice y hacer que se pueda realizar búsquedas, debe cargar documentos JSON que se ajusten al esquema de índice.
En Búsqueda de Azure AI, los documentos actúan como entradas para la indexación y las salidas de las consultas. Para simplificar, esta guía de inicio rápido proporciona documentos de hotel de ejemplo como JSON insertados. Sin embargo, en escenarios de producción, el contenido se extrae a menudo de orígenes de datos conectados y se transforma en JSON mediante indexadores.
En esta guía de inicio rápido, se utiliza Documents - Index (API REST) para agregar cuatro documentos de hotel de ejemplo al índice. En comparación con la solicitud anterior, el URI se extiende para incluir la colección y la operación .
Cada documento de la matriz representa un hotel y contiene campos que coinciden con el esquema de índice. El parámetro especifica la operación que se va a realizar para cada documento. En este ejemplo se usa , que agrega el documento si no existe o actualiza el documento si existe.
### Upload documents
POST {{baseUrl}}/indexes/hotels-quickstart/docs/index?api-version={{api-version}} HTTP/1.1
Content-Type: application/json
Authorization: Bearer {{token}}
{
"value": [
{
"@search.action": "upload",
"HotelId": "1",
"HotelName": "Stay-Kay City Hotel",
"Description": "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times 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.",
"Category": "Boutique",
"Tags": [ "view", "air conditioning", "concierge" ],
"ParkingIncluded": false,
"LastRenovationDate": "2022-01-18T00:00:00Z",
"Rating": 3.60,
"Address":
{
"StreetAddress": "677 5th Ave",
"City": "New York",
"StateProvince": "NY",
"PostalCode": "10022",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "2",
"HotelName": "Old Century Hotel",
"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. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
"Category": "Boutique",
"Tags": [ "pool", "free wifi", "concierge" ],
"ParkingIncluded": false,
"LastRenovationDate": "2019-02-18T00:00:00Z",
"Rating": 3.60,
"Address":
{
"StreetAddress": "140 University Town Center Dr",
"City": "Sarasota",
"StateProvince": "FL",
"PostalCode": "34243",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "3",
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
"Category": "Suite",
"Tags": [ "restaurant", "bar", "continental breakfast" ],
"ParkingIncluded": true,
"LastRenovationDate": "2015-09-20T00:00:00Z",
"Rating": 4.80,
"Address":
{
"StreetAddress": "3393 Peachtree Rd",
"City": "Atlanta",
"StateProvince": "GA",
"PostalCode": "30326",
"Country": "USA"
}
},
{
"@search.action": "upload",
"HotelId": "4",
"HotelName": "Sublime Palace Hotel",
"Description": "Sublime Palace 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 19th century resort, updated for every modern convenience.",
"Tags": [ "concierge", "view", "air conditioning" ],
"ParkingIncluded": true,
"LastRenovationDate": "2020-02-06T00:00:00Z",
"Rating": 4.60,
"Address":
{
"StreetAddress": "7400 San Pedro Ave",
"City": "San Antonio",
"StateProvince": "TX",
"PostalCode": "78216",
"Country": "USA"
}
}
]
}
Consultas al índice
Ahora que los documentos se cargan en el índice, puede usar la búsqueda de texto completo para buscar términos o frases específicos dentro de sus campos.
En este inicio rápido se llama a Documentos - Buscar publicación (API de REST) para buscar documentos de hotel que coincidan con los criterios de búsqueda. El URI ahora tiene como destino la operación.
Las solicitudes de búsqueda de texto completo siempre incluyen un parámetro que contiene el texto de la consulta. El texto de la consulta puede incluir uno o varios términos, frases o operadores. Además de , puede especificar otros parámetros para refinar el comportamiento y los resultados de la búsqueda.
La consulta busca los términos "restaurante adjunto" en los campos y de cada documento de hotel. El parámetro limita los campos devueltos en la respuesta a , , y . El parámetro solicita el número total de documentos coincidentes.
### Run a query
POST {{baseUrl}}/indexes/hotels-quickstart/docs/search?api-version={{api-version}} HTTP/1.1
Content-Type: application/json
Authorization: Bearer {{token}}
{
"search": "attached restaurant",
"select": "HotelId, HotelName, Tags, Description",
"searchFields": "Description, Tags",
"count": true
}
En este inicio rápido, usará PowerShell y las API REST Búsqueda de Azure AI para crear, cargar y consultar un índice de búsqueda para full-text search, también conocido como búsqueda de palabras clave.
La búsqueda de texto completo usa Apache Lucene para indexar y consultar y el algoritmo de clasificación BM25 para obtener resultados de puntuación. En este inicio rápido se usan datos ficticios del hotel del repositorio azure-search-sample-data GitHub para rellenar el índice.
Sugerencia
¿Quieres empezar de inmediato? Descargue el código source en GitHub.
Requisitos previos
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Un servicio Búsqueda de Azure AI. Puede usar un servicio gratuito para este inicio rápido.
PowerShell 7 o posterior.
Git para clonar el repositorio de ejemplo.
El CLI de Azure para la autenticación sin claves con Microsoft Entra ID.
Configurar el acceso
Antes de empezar, asegúrese de que tiene permisos para acceder al contenido y las operaciones en Búsqueda de Azure AI. En este inicio rápido se usa Microsoft Entra ID para la autenticación y el acceso basado en roles para la autorización. Debe ser Propietario o Administrador de acceso de usuario para asignar roles. Si los roles no son factibles, use la autenticación basada en claves en su lugar.
Para configurar el acceso basado en rol recomendado:
Habilite el acceso basado en roles para el servicio de búsqueda.
Asigne los siguientes roles a la cuenta de usuario.
Colaborador del servicio Search
Colaborador de datos de índice de búsqueda
Lector de datos de índice de búsqueda
Obtención del punto de conexión
Cada servicio Búsqueda de Azure AI tiene un endpoint, que es una dirección URL única que identifica y proporciona acceso de red al servicio. En una sección posterior, especifique este punto de conexión para conectarse al servicio de búsqueda mediante programación.
Para obtener el punto de conexión:
Inicie sesión en el portal Azure y seleccione el servicio de búsqueda.
En el panel izquierdo, seleccione Información general.
Anote el punto de conexión, que debería tener un aspecto similar a .
Configuración del entorno
Use Git para clonar el repositorio de ejemplo.
git clone https://github.com/Azure-Samples/azure-search-powershell-samplesVaya a la carpeta de inicio rápido.
cd azure-search-powershell-samples/QuickstartPara la autenticación sin claves con Microsoft Entra ID, inicie sesión en la cuenta de Azure. Si tiene varias suscripciones, seleccione la que contiene el servicio Búsqueda de Azure AI.
az loginEn , reemplace el valor de marcador de posición por la dirección URL que obtuvo en Obtener punto de conexión.
Ejecución del código
En el mismo terminal, ejecute el siguiente script de PowerShell para ejecutar este inicio rápido.
.\azure-search-quickstart.ps1
Salida
El script elimina cualquier índice existente, crea un nuevo índice, carga documentos y ejecuta varias consultas de búsqueda de texto completo. La salida muestra las solicitudes y respuestas HTTP completas para cada operación. En el ejemplo siguiente se muestra la respuesta al buscar "wifi de restaurante".
{
"value": [
{
"@search.score": 0.6931472,
"HotelName": "Old Century Hotel",
"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. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.",
"Tags": ["pool", "free wifi", "concierge"]
},
{
"@search.score": 0.5575875,
"HotelName": "Gastronomic Landscape Hotel",
"Description": "The Gastronomic Hotel stands out for its culinary excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services.",
"Tags": ["restaurant", "bar", "continental breakfast"]
}
]
}
Descripción del código
Nota:
Es posible que los fragmentos de código de esta sección se hayan modificado para mejorar la legibilidad. Para obtener un ejemplo de trabajo completo, consulte el código fuente.
Ahora que ha ejecutado el código, vamos a desglosar los pasos clave:
- Creación de un índice de búsqueda
- Carga de documentos en el índice
- Consulta del índice
Creación de un índice de búsqueda
Antes de agregar contenido a Búsqueda de Azure AI, debe crear un índice para definir cómo se almacena y estructura el contenido. Un índice es conceptualmente similar a una tabla de una base de datos relacional, pero está diseñada específicamente para operaciones de búsqueda, como la búsqueda de texto completo.
En este inicio rápido se elimina primero cualquier índice existente con el mismo nombre, que es una práctica común para el código de prueba o demostración que se ejecuta repetidamente.
Send-Request DELETE "$baseUrl/indexes/hotels-quickstart?api-version=2025-09-01" $headers
A continuación, esta guía de inicio rápido llama a Indexes - Create (REST API) para crear un índice de búsqueda denominado y sus estructuras de datos físicas en el servicio de búsqueda.
$body = @"
{
"name": "hotels-quickstart",
"fields": [
{"name": "HotelId", "type": "Edm.String", "key": true, "filterable": true},
{"name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": false},
{"name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "en.lucene"},
...
]
}
"@
Send-RequestWithBody POST "$baseUrl/indexes?api-version=2025-09-01" $headers $body
Dentro del esquema de índice, la colección define la estructura de los documentos de hotel. Cada campo tiene atributos , data y que determinan su comportamiento durante la indexación y las consultas. El campo HotelId se marca como clave, que Búsqueda de Azure AI requiere identificar de forma única cada documento de un índice.
Puntos clave sobre el esquema de índice:
Use campos de cadena () para hacer que los datos numéricos sean buscables de texto completo. Otros tipos de datos admitidos, como , son filtrables, ordenables, clasificables y recuperables, pero no son buscables.
La mayoría de los campos son tipos de datos simples, pero puede definir tipos complejos para representar datos anidados, como el campo.
Los atributos de campo determinan las acciones permitidas. Las API de REST permiten muchas acciones de forma predeterminada. Por ejemplo, todas las cadenas se pueden buscar y recuperar. Con las API REST, solo puede usar atributos si necesita deshabilitar un comportamiento.
Cargar documentos en el índice
Los índices recién creados están vacíos. Para rellenar un índice y hacer que se pueda realizar búsquedas, debe cargar documentos JSON que se ajusten al esquema de índice.
En Búsqueda de Azure AI, los documentos actúan como entradas para la indexación y las salidas de las consultas. Para simplificar, esta guía de inicio rápido proporciona documentos de hotel de ejemplo como JSON insertados. Sin embargo, en escenarios de producción, el contenido se extrae a menudo de orígenes de datos conectados y se transforma en JSON mediante indexadores.
En esta guía de inicio rápido, se utiliza Documents - Index (API REST) para agregar cuatro documentos de hotel de ejemplo al índice. En comparación con la solicitud anterior, el URI se extiende para incluir la colección y la operación .
$body = @"
{
"value": [
{
"@search.action": "upload",
"HotelId": "1",
"HotelName": "Stay-Kay City Hotel",
"Description": "This classic hotel is...",
...
},
...
]
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/index?api-version=2025-09-01" $headers $body
Cada documento de la matriz representa un hotel y contiene campos que coinciden con el esquema de índice. El parámetro especifica la operación que se va a realizar para cada documento. En este ejemplo se usa , que agrega el documento si no existe o actualiza el documento si existe.
Consultas al índice
Ahora que los documentos se cargan en el índice, puede usar la búsqueda de texto completo para buscar términos o frases específicos dentro de sus campos.
En este inicio rápido se llama a Documentos - Buscar publicación (API de REST) para buscar documentos de hotel que coincidan con los criterios de búsqueda. El URI tiene como destino la operación.
Las solicitudes de búsqueda de texto completo incluyen un parámetro con el texto de la consulta, que puede contener términos, frases o operadores. La consulta busca en todos los campos que se pueden buscar en cada documento. En los ejemplos siguientes se muestran patrones de consulta comunes.
Ejemplo de consulta 1
La consulta siguiente busca los términos "restaurant wifi" en todos los campos que se pueden buscar. De forma predeterminada, Búsqueda de Azure AI devuelve documentos que coinciden con cualquiera de los términos de búsqueda.
$body = @"
{
"search": "restaurant wifi",
"select": "HotelName, Description, Tags"
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2025-09-01" $headers $body
El parámetro limita los campos devueltos en la respuesta a , y .
Ejemplo de consulta 2
La consulta siguiente usa una expresión para devolver solo hoteles con una clasificación superior a 4.
$body = @"
{
"search": "*",
"filter": "Rating gt 4",
"select": "HotelName,Rating"
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2025-09-01" $headers $body
El parámetro se establece en , que coincide con todos los documentos. El parámetro aplica una condición booleana para restringir los resultados.
Ejemplo de consulta 3
La consulta siguiente busca "boutique" y usa para devolver solo los dos primeros resultados.
$body = @"
{
"search": "boutique",
"select": "HotelName,Category",
"top": 2
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2025-09-01" $headers $body
Ejemplo de consulta 4
La consulta siguiente busca "grupo" y usa para ordenar los resultados por orden descendente.
$body = @"
{
"search": "pool",
"select": "HotelName,Description,Tags,Rating",
"orderby": "Rating desc"
}
"@
Send-RequestWithBody POST "$baseUrl/indexes/hotels-quickstart/docs/search?api-version=2025-09-01" $headers $body
Limpieza de recursos
Cuando trabaja en su propia suscripción, es una buena idea finalizar un proyecto quitando los recursos que ya no necesita. Los recursos que quedan en ejecución pueden costar dinero.
En el portal de Azure, seleccione Todos los recursos o Grupos de recursos en el panel izquierdo para buscar y administrar recursos. Puede eliminar recursos individualmente o eliminar el grupo de recursos para quitar todos los recursos a la vez.
Si usa un servicio de búsqueda 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.
Contenido relacionado
- Búsqueda de texto completo en Búsqueda de Azure AI
- Ejemplos de consultas de búsqueda sencillas
- Ejemplos de sintaxis de búsqueda completa de Lucene