Azure Cognitive Search biblioteca de clientes para .NET – versão 11.4.0
O Azure Cognitive Search é uma solução de pesquisa como serviço na nuvem que oferece aos desenvolvedores APIs e ferramentas para adicionar uma experiência de pesquisa sofisticada a um conteúdo particular e heterogêneo em aplicativos Web, móveis e empresariais.
O serviço Azure Cognitive Search é adequado para os seguintes cenários de aplicativo:
- Consolide tipos de conteúdo variados em um único índice pesquisável. Para preencher um índice, você pode enviar por push documentos JSON que contêm seu conteúdo ou, se os dados já estiverem no Azure, crie um indexador para efetuar pull dos dados automaticamente.
- Anexe conjuntos de habilidades a um indexador para criar conteúdo pesquisável a partir de imagens e documentos de texto grandes. Um conjunto de habilidades aproveita a IA dos Serviços Cognitivos para OCR interno, reconhecimento de entidade, extração de frases-chave, detecção de idioma, tradução de texto e análise de sentimento. Você também pode adicionar habilidades personalizadas para integrar o processamento externo do seu conteúdo durante a ingestão de dados.
- Em um aplicativo cliente de pesquisa, implemente a lógica de consulta e as experiências do usuário semelhantes aos mecanismos de pesquisa da Web comerciais.
Use a biblioteca de clientes do Azure.Search.Documents para:
- Envie consultas para formulários de consulta simples e avançados que incluem pesquisa difusa, pesquisa curinga, expressões regulares.
- Implemente consultas filtradas para navegação facetada, pesquisa geoespacial ou para restringir os resultados com base em critérios de filtro.
- Criar e gerenciar índices de pesquisa.
- Carregar e atualizar documentos no índice de pesquisa.
- Crie e gerencie indexadores que efetuam pull de dados do Azure para um índice.
- Crie e gerencie conjuntos de habilidades que adicionam enriquecimento de IA à ingestão de dados.
- Crie e gerencie analisadores para análise de texto avançada ou conteúdo multilíngue.
- Otimize os resultados por meio de perfis de pontuação para considerar a lógica de negócios ou a atualização.
Código-fonte | Pacote (NuGet) | Documentação | de referência da API Documentação | da API RESTDocumentação do produto | Amostras
Introdução
Instalar o pacote
Instale a biblioteca de clientes do Azure Cognitive Search para .NET com o NuGet:
dotnet add package Azure.Search.Documents
Pré-requisitos
Você precisa de uma assinatura do Azure e um serviço de pesquisa para usar esse pacote.
Para criar um novo serviço de pesquisa, você pode usar o portal do Azure, Azure PowerShell ou a CLI do Azure. Aqui está um exemplo usando a CLI do Azure para criar uma instância gratuita para começar:
az search service create --name <mysearch> --resource-group <mysearch-rg> --sku free --location westus
Consulte escolher um tipo de preço para obter mais informações sobre as opções disponíveis.
Autenticar o cliente
Todas as solicitações para um serviço de pesquisa precisam de uma chave de api gerada especificamente para o seu serviço. A chave de api é o único mecanismo para autenticar o acesso ao ponto de extremidade de serviço de pesquisa. Você pode obter sua chave de api do portal do Azure ou por meio da CLI do Azure:
az search admin-key show --service-name <mysearch> --resource-group <mysearch-rg>
Há dois tipos de chaves usadas para acessar o serviço de pesquisa: admin(leitura-gravação) e chaves de consulta(somente leitura). Restringir o acesso e as operações em aplicativos cliente é essencial para proteger os ativos de pesquisa em seu serviço. Sempre use uma chave de consulta em vez de uma chave de administração para qualquer consulta proveniente de um aplicativo cliente.
Observação: o snippet de exemplo da CLI do Azure acima recupera uma chave de administrador para que seja mais fácil começar a explorar APIs, mas deve ser gerenciado com cuidado.
Podemos usar a chave de api para criar um novo SearchClient
.
string indexName = "nycjobs";
// Get the service endpoint and API key from the environment
Uri endpoint = new Uri(Environment.GetEnvironmentVariable("SEARCH_ENDPOINT"));
string key = Environment.GetEnvironmentVariable("SEARCH_API_KEY");
// Create a client
AzureKeyCredential credential = new AzureKeyCredential(key);
SearchClient client = new SearchClient(endpoint, indexName, credential);
ASP.NET Core
Para injetar SearchClient
como uma dependência em um aplicativo ASP.NET Core, primeiro instale o pacote Microsoft.Extensions.Azure
. Em seguida, registre o cliente no Startup.ConfigureServices
método :
public void ConfigureServices(IServiceCollection services)
{
services.AddAzureClients(builder =>
{
builder.AddSearchClient(Configuration.GetSection("SearchClient"));
});
services.AddControllers();
}
Para usar o código anterior, adicione isso à sua configuração:
{
"SearchClient": {
"endpoint": "https://<resource-name>.search.windows.net",
"indexname": "nycjobs"
}
}
Você também precisará fornecer sua chave de recurso para autenticar o cliente, mas não deve colocar essas informações na configuração. Em vez disso, quando estiver em desenvolvimento, use User-Secrets. Adicione o seguinte a secrets.json
:
{
"SearchClient": {
"credential": { "key": "<you resource key>" }
}
}
Ao executar em produção, é preferível usar variáveis de ambiente:
SEARCH__CREDENTIAL__KEY="..."
Ou use outras maneiras seguras de armazenar segredos, como o Azure Key Vault.
Para obter mais detalhes sobre a Injeção de Dependência em aplicativos ASP.NET Core, consulte Injeção de dependência com o SDK do Azure para .NET.
Principais conceitos
Um serviço Azure Cognitive Search contém um ou mais índices que fornecem armazenamento persistente de dados pesquisáveis na forma de documentos JSON. (Se você for totalmente novo para pesquisar, poderá fazer uma analogia muito aproximada entre índices e tabelas de banco de dados.) A biblioteca de clientes do Azure.Search.Documents expõe operações nesses recursos por meio de três tipos de cliente main.
SearchClient
ajuda com:- Pesquisando seus documentos indexados usando consultas avançadas e modelagem de dados avançada
- Preenchimento automático de termos de pesquisa parcialmente tipados com base em documentos no índice
- Sugerindo o texto correspondente mais provável em documentos como um tipo de usuário
- Adicionar, atualizar ou excluir documentos de documentos de um índice
SearchIndexClient
permite que você:SearchIndexerClient
permite que você:
A Azure.Search.Documents
biblioteca de clientes (v11) é uma nova oferta para desenvolvedores do .NET que desejam usar a tecnologia de pesquisa em seus aplicativos. Há uma biblioteca de clientes mais antiga e totalmente em Microsoft.Azure.Search
destaque (v10) com muitas APIs semelhantes, portanto, tenha cuidado para evitar confusão ao explorar recursos online. Uma boa regra geral é marcar para o namespace using Azure.Search.Documents;
quando você está procurando por nós.
Acesso thread-safe
Garantimos que todos os métodos de instância do cliente sejam thread-safe e independentes uns dos outros (diretriz). Isso garante que a recomendação de reutilize instâncias de cliente seja sempre segura, mesmo entre threads.
Conceitos adicionais
Opções do | cliente Acessando a resposta | Operações de execução longa | Tratamento de falhas | Diagnostics | Zombando | Tempo de vida do cliente
Exemplos
Todos os exemplos a seguir usam um conjunto de dados hoteleiro simples que você pode importar para seu próprio índice do portal do Azure. Estes são apenas alguns dos conceitos básicos - por favor, marcar nossos Exemplos para muito mais.
- Consultas
- Criando um índice
- Adicionando documentos ao índice
- Recuperando um documento específico do índice
- APIs assíncronas
Autenticação avançada
Consultas
Vamos começar importando nossos namespaces.
using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes;
Em seguida, criaremos um SearchClient
para acessar nosso índice de pesquisa de hotéis.
// Get the service endpoint and API key from the environment
Uri endpoint = new Uri(Environment.GetEnvironmentVariable("SEARCH_ENDPOINT"));
string key = Environment.GetEnvironmentVariable("SEARCH_API_KEY");
string indexName = "hotels";
// Create a client
AzureKeyCredential credential = new AzureKeyCredential(key);
SearchClient client = new SearchClient(endpoint, indexName, credential);
Há duas maneiras de interagir com os dados retornados de uma consulta de pesquisa. Vamos explorá-los com uma busca por um hotel de "luxo".
Usar tipos C# para resultados da pesquisa
Podemos decorar nossos próprios tipos C# com atributos de System.Text.Json
:
public class Hotel
{
[JsonPropertyName("HotelId")]
[SimpleField(IsKey = true, IsFilterable = true, IsSortable = true)]
public string Id { get; set; }
[JsonPropertyName("HotelName")]
[SearchableField(IsFilterable = true, IsSortable = true)]
public string Name { get; set; }
}
Em seguida, os usamos como o parâmetro de tipo ao consultar para retornar resultados de pesquisa fortemente tipado:
SearchResults<Hotel> response = client.Search<Hotel>("luxury");
foreach (SearchResult<Hotel> result in response.GetResults())
{
Hotel doc = result.Document;
Console.WriteLine($"{doc.Id}: {doc.Name}");
}
Se você estiver trabalhando com um índice de pesquisa e souber o esquema, é recomendável criar tipos C#.
Usar SearchDocument
como um dicionário para resultados da pesquisa
Se você não tiver seu próprio tipo para resultados da pesquisa, SearchDocument
poderá ser usado. Aqui, executamos a pesquisa, enumeramos sobre os resultados e extraímos dados usando SearchDocument
o indexador de dicionário do .
SearchResults<SearchDocument> response = client.Search<SearchDocument>("luxury");
foreach (SearchResult<SearchDocument> result in response.GetResults())
{
SearchDocument doc = result.Document;
string id = (string)doc["HotelId"];
string name = (string)doc["HotelName"];
Console.WriteLine("{id}: {name}");
}
SearchOptions
O SearchOptions
fornece um controle poderoso sobre o comportamento de nossas consultas.
Vamos procurar os 5 melhores hotéis de luxo com uma boa classificação.
int stars = 4;
SearchOptions options = new SearchOptions
{
// Filter to only Rating greater than or equal our preference
Filter = SearchFilter.Create($"Rating ge {stars}"),
Size = 5, // Take only 5 results
OrderBy = { "Rating desc" } // Sort by Rating from high to low
};
SearchResults<Hotel> response = client.Search<Hotel>("luxury", options);
// ...
Criando um índice
Você pode usar o SearchIndexClient
para criar um índice de pesquisa. Os campos podem ser definidos de uma classe de modelo usando FieldBuilder
. Os índices também podem definir sugestores, analisadores léxicos e muito mais:
Uri endpoint = new Uri(Environment.GetEnvironmentVariable("SEARCH_ENDPOINT"));
string key = Environment.GetEnvironmentVariable("SEARCH_API_KEY");
// Create a service client
AzureKeyCredential credential = new AzureKeyCredential(key);
SearchIndexClient client = new SearchIndexClient(endpoint, credential);
// Create the index using FieldBuilder.
SearchIndex index = new SearchIndex("hotels")
{
Fields = new FieldBuilder().Build(typeof(Hotel)),
Suggesters =
{
// Suggest query terms from the hotelName field.
new SearchSuggester("sg", "hotelName")
}
};
client.CreateIndex(index);
Em cenários em que o modelo não é conhecido ou não pode ser modificado, você também pode criar campos explicitamente usando classes convenientes SimpleField
, SearchableField
ou ComplexField
:
// Create the index using field definitions.
SearchIndex index = new SearchIndex("hotels")
{
Fields =
{
new SimpleField("hotelId", SearchFieldDataType.String) { IsKey = true, IsFilterable = true, IsSortable = true },
new SearchableField("hotelName") { IsFilterable = true, IsSortable = true },
new SearchableField("description") { AnalyzerName = LexicalAnalyzerName.EnLucene },
new SearchableField("tags", collection: true) { IsFilterable = true, IsFacetable = true },
new ComplexField("address")
{
Fields =
{
new SearchableField("streetAddress"),
new SearchableField("city") { IsFilterable = true, IsSortable = true, IsFacetable = true },
new SearchableField("stateProvince") { IsFilterable = true, IsSortable = true, IsFacetable = true },
new SearchableField("country") { IsFilterable = true, IsSortable = true, IsFacetable = true },
new SearchableField("postalCode") { IsFilterable = true, IsSortable = true, IsFacetable = true }
}
}
},
Suggesters =
{
// Suggest query terms from the hotelName field.
new SearchSuggester("sg", "hotelName")
}
};
client.CreateIndex(index);
Adicionando documentos ao índice
Você pode Upload
, Merge
, MergeOrUpload
e Delete
vários documentos de um índice em uma única solicitação em lote. Há algumas regras especiais para mesclar para estar ciente.
IndexDocumentsBatch<Hotel> batch = IndexDocumentsBatch.Create(
IndexDocumentsAction.Upload(new Hotel { Id = "783", Name = "Upload Inn" }),
IndexDocumentsAction.Merge(new Hotel { Id = "12", Name = "Renovated Ranch" }));
IndexDocumentsOptions options = new IndexDocumentsOptions { ThrowOnAnyError = true };
client.IndexDocuments(batch, options);
A solicitação terá êxito mesmo se qualquer uma das ações individuais falhar e retornar um IndexDocumentsResult
para inspeção. Também há uma ThrowOnAnyError
opção se você se preocupa apenas com o sucesso ou a falha de todo o lote.
Recuperando um documento específico do índice
Além de consultar documentos usando palavras-chave e filtros opcionais, você pode recuperar um documento específico do índice se já souber a chave. Você pode obter a chave de uma consulta, por exemplo, e deseja mostrar mais informações sobre ela ou navegar pelo cliente para esse documento.
Hotel doc = client.GetDocument<Hotel>("1");
Console.WriteLine($"{doc.Id}: {doc.Name}");
APIs assíncronas
Todos os exemplos até agora têm usado APIs síncronas, mas também fornecemos suporte completo para APIs assíncronas. Geralmente, você apenas adicionará um Async
sufixo ao nome do método e await
a ele.
SearchResults<Hotel> response = await client.SearchAsync<Hotel>("luxury");
await foreach (SearchResult<Hotel> result in response.GetResultsAsync())
{
Hotel doc = result.Document;
Console.WriteLine($"{doc.Id}: {doc.Name}");
}
Autenticar em uma nuvem nacional
Para se autenticar em uma Nuvem Nacional, você precisará fazer as seguintes adições à configuração do cliente:
- Defina o
AuthorityHost
nas opções de credencial ou por meio daAZURE_AUTHORITY_HOST
variável de ambiente - Definir o
Audience
emSearchClientOptions
// Create a SearchClient that will authenticate through AAD in the China national cloud
string indexName = "nycjobs";
Uri endpoint = new Uri(Environment.GetEnvironmentVariable("SEARCH_ENDPOINT"));
SearchClient client = new SearchClient(endpoint, indexName,
new DefaultAzureCredential(
new DefaultAzureCredentialOptions()
{
AuthorityHost = AzureAuthorityHosts.AzureChina
}),
new SearchClientOptions()
{
Audience = SearchAudience.AzureChina
});
Solução de problemas
Qualquer operação do Azure.Search.Documents que falhar lançará um RequestFailedException
com códigos úteisStatus
. Muitos desses erros são recuperáveis.
try
{
return client.GetDocument<Hotel>("12345");
}
catch (RequestFailedException ex) when (ex.Status == 404)
{
Console.WriteLine("We couldn't find the hotel you are looking for!");
Console.WriteLine("Please try selecting another.");
return null;
}
Também é possível habilitar registro em log do console facilmente se quiser se aprofundar nas solicitações que está fazendo ao serviço.
Consulte nosso guia de solução de problemas para obter detalhes sobre como diagnosticar vários cenários de falha.
Próximas etapas
- Vá mais longe com Azure.Search.Documents e nossos exemplos
- Assista a uma demonstração ou vídeo de mergulho profundo
- Leia mais sobre o serviço Azure Cognitive Search
Participante
Consulte nosso CONTRIBUTING.md de Pesquisa para obter detalhes sobre como criar, testar e contribuir para essa biblioteca.
Este projeto aceita contribuições e sugestões. A maioria das contribuições exige que você concorde com um CLA (Contrato de Licença do Colaborador) declarando que você tem o direito de nos conceder, e de fato concede, os direitos de usar sua contribuição. Para obter detalhes, visite cla.microsoft.com.
Este projeto adotou o Código de Conduta de Software Livre da Microsoft. Para obter mais informações, confira as Perguntas frequentes sobre o Código de Conduta ou contate opencode@microsoft.com para enviar outras perguntas ou comentários.