Início Rápido: Criar um índice de pesquisa no PowerShell usando APIs REST
Neste início rápido da Pesquisa de IA do Azure, saiba como criar, carregar e consultar um índice de pesquisa usando o PowerShell e as APIs REST da Pesquisa de IA do Azure. Este artigo explica como executar os comandos do PowerShell interativamente. Como alternativa, você pode baixar e executar um script do PowerShell que executa as mesmas operações.
Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
Pré-requisitos
Os serviços e as ferramentas a seguir são necessários para esse início rápido:
- PowerShell 7.3 ou posterior, com Invoke-RestMethod para etapas sequenciais e interativas.
- Crie um serviço Azure AI Search ou localize um serviço existente na assinatura atual. É possível usar um serviço gratuito para este início rápido.
Copiar uma chave de serviço de pesquisa e uma URL
Neste início rápido, as chamadas REST incluem a URL de serviço e uma chave de acesso em cada solicitação. Um serviço de pesquisa é criado com ambos, portanto, se você adicionou a Pesquisa de IA do Azure à sua assinatura, siga essas etapas para obter as informações necessárias.
Entre no portal do Azure. Na página Visão geral do serviço de pesquisa, obtenha a URL. Um ponto de extremidade de exemplo pode parecer com
https://mydemo.search.windows.net
.Selecione Configurações>Chaves e obtenha uma chave de administrador para obter direitos completos no serviço. Há duas chaves de administração intercambiáveis, fornecidas para a continuidade dos negócios, caso seja necessário implementar uma. É possível usar a chave primária ou secundária em solicitações para adicionar, modificar e excluir objetos.
Todas as solicitações requerem uma chave de API em cada pedido enviado ao serviço. Ter uma chave válida estabelece a relação de confiança, para cada solicitação, entre o aplicativo que envia a solicitação e o serviço que lida com ela.
Conectar-se ao Azure AI Search
No PowerShell, crie um objeto
$headers
para armazenar o content-type e a chave de API. Substitua a chave de API de administrador (YOUR-ADMIN-API-KEY
) por uma chave válida para seu serviço de pesquisa. Você só precisa definir esse cabeçalho uma vez durante a sessão, mas o adicionará a cada solicitação.$headers = @{ 'api-key' = '<YOUR-ADMIN-API-KEY>' 'Content-Type' = 'application/json' 'Accept' = 'application/json' }
Crie um objeto
$url
que especifica a coleção de índices do serviço. Substitua o nome do serviço (YOUR-SEARCH-SERVICE-NAME
) por um serviço de pesquisa válido.$url = "https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net/indexes?api-version=2024-07-01&`$select=name"
Execute
Invoke-RestMethod
para enviar uma solicitação GET para o serviço e verificar a conexão. AdicioneConvertTo-Json
para que você possa exibir as respostas enviadas de volta do serviço.Invoke-RestMethod -Uri $url -Headers $headers | ConvertTo-Json
Se o serviço estiver vazio e não tiver índices, os resultados serão semelhantes ao seguinte exemplo. Caso contrário, você verá uma representação JSON das definições de índice.
{ "@odata.context": "https://mydemo.search.windows.net/$metadata#indexes", "value": [ ] }
Crie um índice
A menos que você esteja usando o portal, é necessário que haja um índice no serviço para que você possa carregar os dados. Esta etapa define o índice e o envia por push para o serviço. A API REST Criar Índice é usada para essa etapa.
Os elementos necessários de um índice incluem um nome e uma coleção de campos. A coleção de campos define a estrutura de um documento. Cada campo tem um nome, tipo e atributos que determinam como ele é usado (por exemplo, se ele é passível de pesquisa de texto completo, filtrável ou recuperável nos resultados da pesquisa). Dentro de um índice, um dos campos do tipo Edm.String
deve ser designado como a chave para a identidade do documento.
Esse índice é nomeado como hotels-quickstart
e tem as definições de campo que você vê no código a seguir. É um subconjunto de um Índice de Hotéis maior usado em outros artigos de passo a passo. Para resumir, as definições de campo foram excluídas desse guia de início rápido.
Cole esse exemplo no PowerShell para criar um objeto
$body
que contém o esquema de índice.$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"}, {"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} ] } ] } "@
Defina o URI como a coleção de índices em seu serviço e no índice
hotels-quickstart
.$url = "https://<YOUR-SEARCH-SERVICE>.search.windows.net/indexes/hotels-quickstart?api-version=2024-07-01"
Execute o comando com
$url
,$headers
e$body
para criar o índice no serviço.Invoke-RestMethod -Uri $url -Headers $headers -Method Put -Body $body | ConvertTo-Json
Os resultados devem ser semelhantes a esse exemplo, que mostra apenas os dois primeiros campos para brevidade:
{ "@odata.context": "https://mydemo.search.windows.net/$metadata#indexes/$entity", "@odata.etag": "\"0x8D6EDE28CFEABDA\"", "name": "hotels-quickstart", "defaultScoringProfile": null, "fields": [ { "name": "HotelId", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true, "key": true, "indexAnalyzer": null, "searchAnalyzer": null, "analyzer": null, "synonymMaps": "" }, { "name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "sortable": true, "facetable": false, "key": false, "indexAnalyzer": null, "searchAnalyzer": null, "analyzer": null, "synonymMaps": "" }, . . . ] }
Dica
Para verificação, você também pode verificar a lista de índices no portal.
Carregue os documentos
Para efetuar push de documentos, use uma solicitação HTTP POST para o ponto de extremidade de URL do seu índice. A API REST para essa tarefa é Index Documents.
Cole esse exemplo no PowerShell para criar um objeto
$body
que contenha os documentos que você deseja carregar.Essa solicitação inclui dois registros completos e um parcial. O registro parcial demonstra que você pode carregar documentos incompletos. O parâmetro
@search.action
especifica como a indexação é feita. Os valores válidos incluemupload
,merge
,mergeOrUpload
edelete
. O comportamentomergeOrUpload
cria um novo documento parahotelId = 3
ou atualiza o conteúdo se ele já existir.$body = @" { "value": [ { "@search.action": "upload", "HotelId": "1", "HotelName": "Stay-Kay City Hotel", "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.", "Category": "Boutique", "Tags": [ "pool", "air conditioning", "concierge" ], "ParkingIncluded": false, "LastRenovationDate": "1970-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.", "Category": "Boutique", "Tags": [ "pool", "free wifi", "concierge" ], "ParkingIncluded": false, "LastRenovationDate": "1979-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 Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.", "Category": "Resort and Spa", "Tags": [ "air conditioning", "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 Palace is part of a lovingly restored 1800 palace.", "Category": "Boutique", "Tags": [ "concierge", "view", "24-hour front desk service" ], "ParkingIncluded": true, "LastRenovationDate": "1960-02-06T00:00:00Z", "Rating": 4.60, "Address": { "StreetAddress": "7400 San Pedro Ave", "City": "San Antonio", "StateProvince": "TX", "PostalCode": "78216", "Country": "USA" } } ] } "@
Defina o ponto de extremidade para a coleção de documentos
hotels-quickstart
e inclua a operação de índice (indexes/hotels-quickstart/docs/index
).$url = "https://<YOUR-SEARCH-SERVICE>.search.windows.net/indexes/hotels-quickstart/docs/index?api-version=2024-07-01"
Execute o comando com
$url
,$headers
e$body
para carregar documentos no índicehotels-quickstart
.Invoke-RestMethod -Uri $url -Headers $headers -Method Post -Body $body | ConvertTo-Json
Os resultados devem ser semelhantes ao exemplo a seguir. Você deverá ver um código de status de 201.
{ "@odata.context": "https://mydemo.search.windows.net/indexes(\u0027hotels-quickstart\u0027)/$metadata#Collection(Microsoft.Azure.Search.V2019_05_06.IndexResult)", "value": [ { "key": "1", "status": true, "errorMessage": null, "statusCode": 201 }, { "key": "2", "status": true, "errorMessage": null, "statusCode": 201 }, { "key": "3", "status": true, "errorMessage": null, "statusCode": 201 }, { "key": "4", "status": true, "errorMessage": null, "statusCode": 201 } ] }
Pesquisar um índice
Essa etapa mostra como consultar um índice usando a API Pesquisar Documentos.
Certifique-se de usar aspas simples na pesquisa $urls
. As cadeias de consulta incluem os caracteres $
, e você poderá omitir a necessidade de usar o caractere de escape com elas se toda a cadeia de caracteres estiver entre aspas simples.
Defina o ponto de extremidade para a coleção de documentos
hotels-quickstart
e adicione um parâmetrosearch
para passar uma cadeia de caracteres de consulta.Essa cadeia de caracteres executa uma pesquisa vazia (
search=*
), retornando uma lista não classificada (pontuação de pesquisa = 1,0) de documentos arbitrários. Por padrão, a IA do Azure Search retorna 50 correspondências por vez. Como estruturada, essa consulta retorna uma estrutura e valores do documento inteiro. Adicione$count=true
para obter uma contagem de todos os documentos nos resultados.$url = 'https://<YOUR-SEARCH-SERVICE>.search.windows.net/indexes/hotels-quickstart/docs?api-version=2024-07-01&search=*&$count=true'
Execute o comando para enviar o
$url
para o serviço.Invoke-RestMethod -Uri $url -Headers $headers | ConvertTo-Json
Os resultados serão parecidos com a seguinte saída:
{ "@odata.context": "https://mydemo.search.windows.net/indexes(\u0027hotels-quickstart\u0027)/$metadata#docs(*)", "@odata.count": 4, "value": [ { "@search.score": 0.1547872, "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.", "Category": "Boutique", "Tags": "pool free wifi concierge", "ParkingIncluded": false, "LastRenovationDate": "1979-02-18T00:00:00Z", "Rating": 3.6, "Address": "@{StreetAddress=140 University Town Center Dr; City=Sarasota; StateProvince=FL; PostalCode=34243; Country=USA}" }, { "@search.score": 0.009068266, "HotelId": "3", "HotelName": "Gastronomic Landscape Hotel", "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel\u0027s restaurant services.", "Category": "Resort and Spa", "Tags": "air conditioning bar continental breakfast", "ParkingIncluded": true, "LastRenovationDate": "2015-09-20T00:00:00Z", "Rating": 4.8, "Address": "@{StreetAddress=3393 Peachtree Rd; City=Atlanta; StateProvince=GA; PostalCode=30326; Country=USA}" }, . . . ] }
Experimente alguns outros exemplos de consulta para ter uma ideia da sintaxe. Você pode fazer uma pesquisa de cadeia de caracteres, consultas $filter
verbatim, limitar o conjunto de resultados, definir o escopo da pesquisa para campos específicos, entre outros.
# Query example 1
# Search the entire index for the terms 'restaurant' and 'wifi'
# Return only the HotelName, Description, and Tags fields
$url = 'https://<YOUR-SEARCH-SERVICE>.search.windows.net/indexes/hotels-quickstart/docs?api-version=2024-07-01&search=restaurant wifi&$count=true&$select=HotelName,Description,Tags'
# Query example 2
# Apply a filter to the index to find hotels rated 4 or higher
# Returns the HotelName and Rating. Two documents match.
$url = 'https://<YOUR-SEARCH-SERVICE>.search.windows.net/indexes/hotels-quickstart/docs?api-version=2024-07-01&search=*&$filter=Rating gt 4&$select=HotelName,Rating'
# Query example 3
# Take the top two results, and show only HotelName and Category in the results
$url = 'https://<YOUR-SEARCH-SERVICE>.search.windows.net/indexes/hotels-quickstart/docs?api-version=2024-07-01&search=boutique&$top=2&$select=HotelName,Category'
# Query example 4
# Sort by a specific field (Address/City) in ascending order
$url = 'https://<YOUR-SEARCH-SERVICE>.search.windows.net/indexes/hotels-quickstart/docs?api-version=2024-07-01&search=pool&$orderby=Address/City asc&$select=HotelName, Address/City, Tags, Rating'
Limpar os recursos
Quando você está trabalhando em sua própria assinatura, é uma boa ideia identificar, no final de um projeto, se você ainda precisa dos recursos criados. Recursos deixados em execução podem custar dinheiro. Você pode excluir os recursos individualmente ou excluir o grupo de recursos para excluir todo o conjunto de recursos.
Você pode encontrar e gerenciar recursos no portal usando o link Todos os recursos ou Grupos de recursos no painel de navegação à esquerda.
Se você estiver usando um serviço gratuito, estará limitado a três índices, indexadores e fontes de dados. Você pode excluir itens individuais no portal para permanecer abaixo do limite.
Próximas etapas
Neste início rápido, você usou o PowerShell para concluir as etapas do fluxo de trabalho básico para criação e acesso de conteúdo na IA do Azure Search. Com os conceitos em mente, recomendamos passar para cenários mais avançados, como indexação de fontes de dados do Azure: