.NET AspireAzure AI 搜索集成

包含:托管集成已包含 - Client 集成已包含Client 集成

.NET AspireAzure AI 搜索文档集成使您能够从您的 Azure 应用程序连接到 Azure(以前称为 .NET 认知搜索)服务。 Azure AI 搜索是一个企业级的信息检索系统,适用于将异构内容引入搜索索引,并通过查询和应用呈现给用户。 它配备了一整套先进的搜索技术,专为各种规模的高性能应用程序而打造。

托管集成

.NET AspireAzure AI 搜索托管集成将 Azure AI 搜索资源建模为 AzureSearchResource 类型。 若要在应用主机项目中访问和使用此类型及 API,请安装 📦AspireHosting.Azure.Search NuGet 包。

dotnet add package Aspire.Hosting.Azure.Search

有关详细信息,请参阅 dotnet add package 或 .NET。

添加 Azure 人工智能搜索资源

若要将 AzureSearchResource 添加到应用主机项目,请调用提供名称的 AddAzureSearch 方法:

var builder = DistributedApplication.CreateBuilder(args);

var search = builder.AddAzureSearch("search");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(search);

// After adding all resources, run the app...

前面的代码将名为 Azure 的 search AI 搜索资源添加到应用主机项目中。 WithReference 方法将连接信息传递给 ExampleProject 项目。

重要

调用 AddAzureSearch时,它会隐式调用 AddAzureProvisioning(IDistributedApplicationBuilder),这增加了在应用启动期间动态生成 Azure 资源的支持。 应用程序必须配置相应的订阅和位置。 有关详细信息,请参阅本地预配:配置

由预配生成的 Bicep

如果你不熟悉 Bicep,则它是用于定义 Azure 资源的特定于域的语言。 使用 .NET.NET Aspire时,无需手动编写 Bicep;相反,预配 API 会为你生成 Bicep。 发布应用时,生成的 Bicep 文件将会与清单文件一同输出。 添加 Azure AI 搜索资源时,会生成 Bicep,以便使用适当的默认值预配搜索服务。

@description('The ___location for the resource(s) to be deployed.')
param ___location string = resourceGroup().___location

resource search 'Microsoft.Search/searchServices@2023-11-01' = {
  name: take('search-${uniqueString(resourceGroup().id)}', 60)
  ___location: ___location
  properties: {
    hostingMode: 'default'
    disableLocalAuth: true
    partitionCount: 1
    replicaCount: 1
  }
  sku: {
    name: 'basic'
  }
  tags: {
    'aspire-resource-name': 'search'
  }
}

output connectionString string = 'Endpoint=https://${search.name}.search.windows.net'

output name string = search.name

前面的 Bicep 模块是用于配置 Azure AI 搜索服务资源的。 此外,在单独的模块中为 Azure 资源创建角色分配:

@description('The ___location for the resource(s) to be deployed.')
param ___location string = resourceGroup().___location

param search_outputs_name string

param principalType string

param principalId string

resource search 'Microsoft.Search/searchServices@2023-11-01' existing = {
  name: search_outputs_name
}

resource search_SearchIndexDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(search.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8ebe5a00-799e-43f5-93ac-243d3dce84a7'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8ebe5a00-799e-43f5-93ac-243d3dce84a7')
    principalType: principalType
  }
  scope: search
}

resource search_SearchServiceContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(search.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '7ca78c08-252a-4471-8644-bb5ff32d4ba0'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '7ca78c08-252a-4471-8644-bb5ff32d4ba0')
    principalType: principalType
  }
  scope: search
}

生成的 Bicep 作为起点,受 C# 中资源配置基础设施更改的影响。 直接对 Bicep 文件的自定义项所做的更改将被覆盖,因此请通过 C# 预配 API 进行更改,以确保它们反映在生成的文件中。

自定义预配基础结构

所有 .NET AspireAzure 资源都是 AzureProvisioningResource 类型的子类。 此类型提供了一种流畅的 API,可以通过 Azure API 来配置 ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) 资源,从而实现对生成的 Bicep 的自定义。 例如,可以配置搜索服务分区、副本等:

builder.AddAzureSearch("search")
    .ConfigureInfrastructure(infra =>
    {
        var searchService = infra.GetProvisionableResources()
                                 .OfType<SearchService>()
                                 .Single();

        searchService.PartitionCount = 6;
        searchService.ReplicaCount = 3;
        searchService.SearchSkuName = SearchServiceSkuName.Standard3;
        searchService.Tags.Add("ExampleKey", "Example value");
    });

前面的代码:

还有更多配置选项可用于自定义 Azure AI 搜索资源。 有关详细信息,请参阅 Azure.Provisioning 自定义

连接到现有的 Azure AI 搜索服务

你可能有一个现有的 Azure AI 搜索服务,想要连接到它。 可以链式调用以标注 AzureSearchResource 是现有资源。

var builder = DistributedApplication.CreateBuilder(args);

var existingSearchName = builder.AddParameter("existingSearchName");
var existingSearchResourceGroup = builder.AddParameter("existingSearchResourceGroup");

var search = builder.AddAzureSearch("search")
                    .AsExisting(existingSearchName, existingSearchResourceGroup);

builder.AddProject<Projects.ExampleProject>()
       .WithReference(search);

// After adding all resources, run the app...

有关将 Azure AI 搜索资源视为现有资源的详细信息,请参阅 “使用现有 Azure 资源”。

注释

作为另一种选择,你可以向应用主机添加连接字符串,而非表示Azure AI 搜索服务。 此方法属于弱类型,不适用于角色分配或基础结构自定义。 有关详细信息,请参阅 添加包含连接字符串的现有 Azure 资源

托管环境集成运行状况检查

Azure AI 搜索托管集成目前未实现任何健康检查。 将来的版本可能会更改此限制。 与往常一样,如果有任何建议或反馈,请随时 提出问题

Client 集成

若要开始使用 .NET AspireAzure AI 搜索文档客户端集成,请在客户端使用的项目中安装 📦Aspire。Azure。Search.Documents NuGet 包,也就是该应用程序使用 Azure AI 搜索文档客户端的项目。

dotnet add package Aspire.Azure.Search.Documents

添加 Azure AI 搜索索引客户端

在您的客户端消费项目中的 Program.cs 文件中,对任何 AddAzureSearchClient 调用 IHostApplicationBuilder 扩展方法,以注册 SearchIndexClient,以便通过依赖注入容器进行使用。 该方法采用连接名称参数。

builder.AddAzureSearchClient(connectionName: "search");

小提示

connectionName 参数必须与在应用主机项目中添加 Azure AI 搜索资源时使用的名称匹配。 有关详细信息,请参阅 添加 Azure AI 搜索资源

添加 SearchIndexClient后,可以使用依赖项注入检索客户端实例。 例如,若要从示例服务检索客户端实例:

public class ExampleService(SearchIndexClient indexClient)
{
    // Use indexClient
}

您还可以通过调用 SearchClient 方法来检索一个可用于查询的 GetSearchClient(String)

public class ExampleService(SearchIndexClient indexClient)
{
    public async Task<long> GetDocumentCountAsync(
        string indexName,
        CancellationToken cancellationToken)
    {
        var searchClient = indexClient.GetSearchClient(indexName);

        var documentCountResponse = await searchClient.GetDocumentCountAsync(
            cancellationToken);

        return documentCountResponse.Value;
    }
}

有关详细信息,请参阅:

添加键控 Azure AI 搜索索引客户端

在某些情况下,可能需要使用不同的连接名称注册多个 SearchIndexClient 实例。 若要注册密钥 Azure AI 搜索客户端,请调用 AddKeyedAzureSearchClient 方法:

builder.AddKeyedAzureSearchClient(name: "images");
builder.AddKeyedAzureSearchClient(name: "documents");

重要

使用键控服务时,您应确保您的 Azure AI 搜索资源已配置两个命名连接,一个用于 images,一个用于 documents

然后,可以使用依赖项注入检索客户端实例。 例如,若要从服务检索客户:

public class ExampleService(
    [KeyedService("images")] SearchIndexClient imagesClient,
    [KeyedService("documents")] SearchIndexClient documentsClient)
{
    // Use clients...
}

有关详细信息,请参阅.NET中的键服务

配置

.NET AspireAzure AI 搜索文档库提供了多个选项,用于根据项目的要求和约定配置 Azure AI 搜索连接。 必须提供 EndpointConnectionString

使用连接字符串

可以使用格式Endpoint={endpoint};Key={key};”选项卡构造连接。 调用 builder.AddAzureSearchClient()时,可以提供连接字符串的名称:

builder.AddAzureSearchClient("searchConnectionName");

ConnectionStrings 配置部分检索连接字符串。 支持两种连接格式:

帐户终结点

建议的方法是使用 Endpoint,它与 AzureSearchSettings.Credential 属性配合使用以建立连接。 如果未配置凭据,则使用 DefaultAzureCredential

{
  "ConnectionStrings": {
    "search": "https://{search_service}.search.windows.net/"
  }
}
连接字符串

或者,可以使用具有密钥的连接字符串;不建议采用以下方法:

{
  "ConnectionStrings": {
    "search": "Endpoint=https://{search_service}.search.windows.net/;Key={account_key};"
  }
}

使用配置提供程序

.NET AspireAzure AI 搜索库支持 Microsoft.Extensions.Configuration。 它通过 AzureSearchSettings 键从配置中加载 SearchClientOptionsAspire:Azure:Search:Documents。 配置某些选项的示例 appsettings.json

{
  "Aspire": {
    "Azure": {
      "Search": {
        "Documents": {
          "DisableTracing": false
        }
      }
    }
  }
}

有关完整的 Azure AI 搜索文档客户端集成架构JSON,请参阅 Aspire.Azure.Search.Documents/ConfigurationSchema.json

使用内联委托

还可以传递 Action<AzureSearchSettings> configureSettings 委托来设置一些或所有内联选项,例如禁用代码中的跟踪:

builder.AddAzureSearchClient(
    "searchConnectionName",
    static settings => settings.DisableTracing = true);

还可以使用 SearchClientOptions 方法的可选 Action<IAzureClientBuilder<SearchIndexClient, SearchClientOptions>> configureClientBuilder 参数来设置 AddAzureSearchClient。 例如,若要设置此客户端的客户端 ID:

builder.AddAzureSearchClient(
    "searchConnectionName",
    configureClientBuilder: builder => builder.ConfigureOptions(
        static options => options.Diagnostics.ApplicationId = "CLIENT_ID"));

Client 整合健康检查

默认情况下, .NET.NET Aspire客户端集成 为所有服务启用了 运行状况检查 。 同样,许多托管集成 .NET.NET Aspire 也启用健康检查端点。 有关详细信息,请参阅:

.NET AspireAzure AI 搜索文档整合实现了一项独立的健康检查,该检查通过调用 GetServiceStatisticsAsync 上的 SearchIndexClient 方法来验证服务的可用性。

可观测性和遥测

.NET.NET Aspire 集成会自动设置日志记录、跟踪和指标配置,这些配置有时称为 可观测性支柱。 有关集成可观测性和遥测的详细信息,请参阅 .NET.NET Aspire 集成概述。 根据支持服务,某些集成可能仅支持其中一些功能。 例如,某些集成支持日志记录和跟踪,但不支持指标。 还可以使用 “配置” 部分中介绍的技术禁用遥测功能。

伐木

.NET AspireAzure AI 搜索文档集成使用以下日志类别:

  • Azure
  • Azure.Core
  • Azure.Identity

追踪

.NET AspireAzure AI 搜索文档集成在与搜索服务交互时,通过 OpenTelemetry 发出跟踪活动。

另请参阅