创建搜索数据存储区

如需创建数据存储区并注入数据以供搜索,请前往您计划使用的数据源对应的部分:

如需改用第三方数据源同步数据,请参阅连接第三方数据源

如需了解问题排查信息,请参阅排查数据注入问题

使用网站内容创建数据存储区

按照以下步骤创建数据存储区并为网站编制索引。

创建网站数据存储区后,您必须将其附加到已启用企业功能的应用,才能使用该数据存储区。您可以在创建应用时为其启用企业版。这会产生额外费用。请参阅创建搜索应用高级功能简介

控制台

如需使用 Google Cloud 控制台创建数据存储区并为网站编制索引,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 在导航菜单中,点击数据存储区

  3. 点击创建数据存储区

  4. 来源页面上,选择网站内容

  5. 选择是否为此数据存储区启用高级网站索引编制功能。 此选项以后无法开启或关闭。

    高级网站索引编制功能提供其他功能,例如搜索摘要、后续搜索和提取式回答。使用高级网站索引编制功能会产生额外费用,并且要求您验证要编入索引的任何网站的域名所有权。如需了解详情,请参阅高级网站编入索引价格

  6. 要包括的网站字段中,输入与您要包含在数据存储区中的网站相匹配的网址模式。每行输入一个网址格式,不加英文逗号分隔符。例如 example.com/docs/*

  7. 可选:在要排除的网站字段中,输入要从数据存储区中排除的网址模式。

    排除的网站的优先级高于包含的网站。因此,如果您包含 example.com/docs/* 但排除 example.com,则不会对任何网站编制索引。如需了解详情,请参阅网站数据

  8. 点击继续

  9. 为数据存储区选择位置。

    • 创建基本网站搜索数据存储区时,此设置始终为全球
    • 创建启用了高级网站编入索引功能的数据存储区时,您可以选择位置。由于编入索引的网站必须是公开的,因此 Google 强烈建议您选择全球作为位置。这可确保所有搜索和回答服务的最高可用性,并消除区域数据存储区的限制。
  10. 为数据存储区输入名称。

  11. 点击创建。Vertex AI Search 会创建数据存储区,并在数据存储区页面上显示您的数据存储区。

  12. 如需查看数据存储区的信息,请点击名称列中的数据存储区名称。系统会显示您的数据存储区页面。

    • 如果您已开启高级网站索引编制,系统会显示一条警告,提示您验证数据存储区中的网域。
    • 如果您的配额不足(您指定的网站中的网页数量超过了项目的“每个项目的文档数量”配额),系统会显示一条额外的警告,提示您升级配额。
  13. 如需验证数据存储区中网址模式的网域,请按照验证网站网域页面上的说明操作。

  14. 如需升级配额,请按以下步骤操作:

    1. 点击升级配额。 Google Cloud 控制台的 IAM 和管理页面随即显示。
    2. 请按照 Google Cloud 文档中的申请更高配额限制中的说明操作。要增加的配额是 Discovery Engine API 服务中的文档数量
    3. 提交提高配额限制的申请后,返回 AI Applications 页面,然后在导航菜单中点击数据存储区
    4. 点击名称列中的数据存储区名称。状态列表示,对于已超出配额的网站,系统正在进行索引编制。如果网址的状态列显示已编入索引,则表示该网址或网址格式可以使用高级网站索引编制功能。

    如需了解详情,请参阅“配额和限制”页面中的网页编入索引的配额

Python

如需了解详情,请参阅 AI Applications Python API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入网站

#     from google.api_core.client_options import ClientOptions
#
#     from google.cloud import discoveryengine_v1 as discoveryengine
#
#     # TODO(developer): Uncomment these variables before running the sample.
#     # project_id = "YOUR_PROJECT_ID"
#     # location = "YOUR_LOCATION" # Values: "global"
#     # data_store_id = "YOUR_DATA_STORE_ID"
#     # NOTE: Do not include http or https protocol in the URI pattern
#     # uri_pattern = "cloud.google.com/generative-ai-app-builder/docs/*"
#
#     #  For more information, refer to:
#     # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
#     client_options = (
#         ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
#         if location != "global"
#         else None
#     )
#
#     # Create a client
#     client = discoveryengine.SiteSearchEngineServiceClient(
#         client_options=client_options
#     )
#
#     # The full resource name of the data store
#     # e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}
#     site_search_engine = client.site_search_engine_path(
#         project=project_id, location=location, data_store=data_store_id
#     )
#
#     # Target Site to index
#     target_site = discoveryengine.TargetSite(
#         provided_uri_pattern=uri_pattern,
#         # Options: INCLUDE, EXCLUDE
#         type_=discoveryengine.TargetSite.Type.INCLUDE,
#         exact_match=False,
#     )
#
#     # Make the request
#     operation = client.create_target_site(
#         parent=site_search_engine,
#         target_site=target_site,
#     )
#
#     print(f"Waiting for operation to complete: {operation.operation.name}")
#     response = operation.result()
#
#     # After the operation is complete,
#     # get information from operation metadata
#     metadata = discoveryengine.CreateTargetSiteMetadata(operation.metadata)
#
#     # Handle the response
#     print(response)
#     print(metadata)

后续步骤

从 BigQuery 导入

Vertex AI Search 支持搜索 BigQuery 数据。

您可以通过以下两种方式从 BigQuery 表创建数据存储区:

  • 一次性提取:将数据从 BigQuery 表导入数据存储区。除非您手动刷新数据,否则数据存储区中的数据不会发生变化。

  • 定期注入:您可以从一个或多个 BigQuery 表中导入数据,并设置同步频率,以确定数据存储区更新 BigQuery 数据集中的最新数据的频率。

下表比较了将 BigQuery 数据导入 Vertex AI Search 数据存储区的两种方式。

一次性注入 定期提取
已正式发布 (GA)。 公开预览版。
必须手动刷新数据。 数据每 1 天、3 天或 5 天会自动更新一次。数据无法手动刷新。
Vertex AI Search 会从 BigQuery 中的一个创建单个数据存储区。 Vertex AI Search 会为 BigQuery 数据集创建一个数据连接器,并为指定的每个表创建一个数据存储区(称为实体数据存储区)。对于每个数据连接器,表必须具有相同的数据类型(例如结构化),并且位于同一 BigQuery 数据集中。
您可以先从一个表提取数据,然后再从另一个来源或 BigQuery 表提取更多数据,从而将多个表中的数据合并到一个数据存储区中。 由于不支持手动导入数据,因此实体数据存储区中的数据只能来自一个 BigQuery 表。
支持数据源访问权限控制。 不支持数据源访问权限控制。导入的数据可以包含访问控制,但这些控制不会受到尊重。
您可以使用Google Cloud 控制台或 API 创建数据存储区。 您必须使用控制台创建数据连接器及其实体数据存储区。
兼容 CMEK。 兼容 CMEK。

从 BigQuery 导入一次

如需从 BigQuery 表中注入数据,请按照以下步骤操作,使用 Google Cloud 控制台或 API 创建数据存储区并注入数据。

在导入数据之前,请查看准备数据以便提取

控制台

如需使用 Google Cloud 控制台从 BigQuery 中注入数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 前往数据存储区页面。

  3. 点击 创建数据存储区

  4. 来源页面上,选择 BigQuery

  5. 您要导入哪种数据部分,选择要导入的数据类型。

  6. 同步频率部分中,选择一次

  7. BigQuery 路径字段中,点击浏览,选择您已准备好要提取的表,然后点击选择。 或者,您也可以直接在 BigQuery 路径字段中输入表位置。

  8. 点击继续

  9. 如果您要一次性导入结构化数据,请执行以下操作:

    1. 将字段映射到关键属性。

    2. 如果架构中缺少重要字段,请使用添加新字段来添加这些字段。

      如需了解详情,请参阅自动检测和修改简介

    3. 点击继续

  10. 为数据存储区选择一个区域。

  11. 为数据存储区输入名称。

  12. 点击创建

  13. 如需查看数据注入状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详情。 当活动标签页上的“状态”列从正在进行更改为导入已完成时,表示提取已完成。

    注入过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

REST

如需使用命令行创建数据存储区并从 BigQuery 导入数据,请按以下步骤操作。

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DATA_STORE_DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"]
    }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:要创建的 Vertex AI Search 数据存储区的 ID。此 ID 只能包含小写字母、数字、下划线和连字符。
    • DATA_STORE_DISPLAY_NAME:您要创建的 Vertex AI Search 数据存储区的显示名称。

    可选:如果您要上传非结构化数据,并希望配置文档解析或为 RAG 启用文档分块,请指定 documentProcessingConfig 对象并将其包含在数据存储区创建请求中。如果您要提取扫描的 PDF,建议配置 PDF 的 OCR 解析器。如需了解如何配置解析或分块选项,请参阅解析和分块文档

  2. 从 BigQuery 导入数据。

    如果您定义了架构,请确保数据符合该架构。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
    -d '{
      "bigquerySource": {
        "projectId": "PROJECT_ID",
        "datasetId":"DATASET_ID",
        "tableId": "TABLE_ID",
        "dataSchema": "DATA_SCHEMA",
        "aclEnabled": "BOOLEAN"
      },
      "reconciliationMode": "RECONCILIATION_MODE",
      "autoGenerateIds": "AUTO_GENERATE_IDS",
      "idField": "ID_FIELD",
      "errorConfig": {
        "gcsPrefix": "ERROR_DIRECTORY"
      }
    }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:Vertex AI Search 数据存储区的 ID。
    • DATASET_ID:BigQuery 数据集的 ID。
    • TABLE_ID:BigQuery 表的 ID。
      • 如果 BigQuery 表不在 PROJECT_ID 下,您需要为服务账号 service-<project number>@gcp-sa-discoveryengine.iam.gserviceaccount.com 授予 BigQuery 表的“BigQuery Data Viewer”权限。例如,如果您要将 BigQuery 表从源项目“123”导入到目标项目“456”,请为项目“123”下的 BigQuery 表授予 service-456@gcp-sa-discoveryengine.iam.gserviceaccount.com 权限。
    • DATA_SCHEMA:可选。值为 documentcustom。默认值为 document
      • document:您使用的 BigQuery 表必须符合准备要提取的数据中提供的默认 BigQuery 架构。您可以自行定义每个文档的 ID,同时将所有数据封装在 jsonData 字符串中。
      • custom:接受任何 BigQuery 表架构,并且 Vertex AI Search 会自动为导入的每个文档生成 ID。
    • ERROR_DIRECTORY:可选。存放与导入有关的错误信息的 Cloud Storage 目录,例如 gs://<your-gcs-bucket>/directory/import_errors。Google 建议将此字段留空,以便 Vertex AI Search 自动创建临时目录。
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 BigQuery 到数据存储区的增量数据刷新。此方法会执行 upsert 操作,即添加新文档,并将现有文档替换为具有相同 ID 的更新文档。指定 FULL 会导致数据存储区中的文档进行完全重新基准化。换句话说,系统会将新的文档和更新后的文档添加到数据存储区,并从数据存储区中移除不在 BigQuery 中的文档。如果您想自动删除不再需要的文档,FULL 模式会很有帮助。
    • AUTO_GENERATE_IDS:可选。指定是否自动生成文档 ID。如果设置为 true,则文档 ID 将根据载荷的哈希值生成。请注意,生成的文档 ID 在多次导入时可能不会保持一致。如果您在多次导入时自动生成 ID,Google 强烈建议您将 reconciliationMode 设置为 FULL,以保持文档 ID 的一致性。

      仅当 bigquerySource.dataSchema 设置为 custom 时,才指定 autoGenerateIds。否则,系统将返回 INVALID_ARGUMENT 错误。如果您未指定 autoGenerateIds 或将其设置为 false,则必须指定 idField。否则,文档将无法导入。

    • ID_FIELD:可选。指定哪些字段是文档 ID。对于 BigQuery 源文件,idField 表示 BigQuery 表中包含文档 ID 的列的名称。

      仅在以下情况下指定 idField:(1) bigquerySource.dataSchema 设置为 custom,且 (2) auto_generate_ids 设置为 false 或未指定。否则,系统将返回 INVALID_ARGUMENT 错误。

      BigQuery 列名称的值必须为字符串类型,长度必须介于 1 到 63 个字符之间,并且必须符合 RFC-1034 的要求。否则,文档将无法导入。

C#

如需了解详情,请参阅 AI Applications C# API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

using Google.Cloud.DiscoveryEngine.V1;
using Google.LongRunning;

public sealed partial class GeneratedDataStoreServiceClientSnippets
{
    /// <summary>Snippet for CreateDataStore</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public void CreateDataStoreRequestObject()
    {
        // Create client
        DataStoreServiceClient dataStoreServiceClient = DataStoreServiceClient.Create();
        // Initialize request argument(s)
        CreateDataStoreRequest request = new CreateDataStoreRequest
        {
            ParentAsCollectionName = CollectionName.FromProjectLocationCollection("[PROJECT]", "[LOCATION]", "[COLLECTION]"),
            DataStore = new DataStore(),
            DataStoreId = "",
            CreateAdvancedSiteSearch = false,
            CmekConfigNameAsCmekConfigName = CmekConfigName.FromProjectLocation("[PROJECT]", "[LOCATION]"),
            SkipDefaultSchemaCreation = false,
        };
        // Make the request
        Operation<DataStore, CreateDataStoreMetadata> response = dataStoreServiceClient.CreateDataStore(request);

        // Poll until the returned long-running operation is complete
        Operation<DataStore, CreateDataStoreMetadata> completedResponse = response.PollUntilCompleted();
        // Retrieve the operation result
        DataStore result = completedResponse.Result;

        // Or get the name of the operation
        string operationName = response.Name;
        // This name can be stored, then the long-running operation retrieved later by name
        Operation<DataStore, CreateDataStoreMetadata> retrievedResponse = dataStoreServiceClient.PollOnceCreateDataStore(operationName);
        // Check if the retrieved long-running operation has completed
        if (retrievedResponse.IsCompleted)
        {
            // If it has completed, then access the result
            DataStore retrievedResult = retrievedResponse.Result;
        }
    }
}

导入文档

using Google.Cloud.DiscoveryEngine.V1;
using Google.LongRunning;
using Google.Protobuf.WellKnownTypes;

public sealed partial class GeneratedDocumentServiceClientSnippets
{
    /// <summary>Snippet for ImportDocuments</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public void ImportDocumentsRequestObject()
    {
        // Create client
        DocumentServiceClient documentServiceClient = DocumentServiceClient.Create();
        // Initialize request argument(s)
        ImportDocumentsRequest request = new ImportDocumentsRequest
        {
            ParentAsBranchName = BranchName.FromProjectLocationDataStoreBranch("[PROJECT]", "[LOCATION]", "[DATA_STORE]", "[BRANCH]"),
            InlineSource = new ImportDocumentsRequest.Types.InlineSource(),
            ErrorConfig = new ImportErrorConfig(),
            ReconciliationMode = ImportDocumentsRequest.Types.ReconciliationMode.Unspecified,
            UpdateMask = new FieldMask(),
            AutoGenerateIds = false,
            IdField = "",
            ForceRefreshContent = false,
        };
        // Make the request
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> response = documentServiceClient.ImportDocuments(request);

        // Poll until the returned long-running operation is complete
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> completedResponse = response.PollUntilCompleted();
        // Retrieve the operation result
        ImportDocumentsResponse result = completedResponse.Result;

        // Or get the name of the operation
        string operationName = response.Name;
        // This name can be stored, then the long-running operation retrieved later by name
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> retrievedResponse = documentServiceClient.PollOnceImportDocuments(operationName);
        // Check if the retrieved long-running operation has completed
        if (retrievedResponse.IsCompleted)
        {
            // If it has completed, then access the result
            ImportDocumentsResponse retrievedResult = retrievedResponse.Result;
        }
    }
}

Go

如需了解详情,请参阅 AI Applications Go API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


package main

import (
	"context"

	discoveryengine "cloud.google.com/go/discoveryengine/apiv1"
	discoveryenginepb "cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb"
)

func main() {
	ctx := context.Background()
	// This snippet has been automatically generated and should be regarded as a code template only.
	// It will require modifications to work:
	// - It may require correct/in-range values for request initialization.
	// - It may require specifying regional endpoints when creating the service client as shown in:
	//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options
	c, err := discoveryengine.NewDataStoreClient(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	defer c.Close()

	req := &discoveryenginepb.CreateDataStoreRequest{
		// TODO: Fill request struct fields.
		// See https://pkg.go.dev/cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb#CreateDataStoreRequest.
	}
	op, err := c.CreateDataStore(ctx, req)
	if err != nil {
		// TODO: Handle error.
	}

	resp, err := op.Wait(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	// TODO: Use resp.
	_ = resp
}

导入文档


package main

import (
	"context"

	discoveryengine "cloud.google.com/go/discoveryengine/apiv1"
	discoveryenginepb "cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb"
)

func main() {
	ctx := context.Background()
	// This snippet has been automatically generated and should be regarded as a code template only.
	// It will require modifications to work:
	// - It may require correct/in-range values for request initialization.
	// - It may require specifying regional endpoints when creating the service client as shown in:
	//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options
	c, err := discoveryengine.NewDocumentClient(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	defer c.Close()

	req := &discoveryenginepb.ImportDocumentsRequest{
		// TODO: Fill request struct fields.
		// See https://pkg.go.dev/cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb#ImportDocumentsRequest.
	}
	op, err := c.ImportDocuments(ctx, req)
	if err != nil {
		// TODO: Handle error.
	}

	resp, err := op.Wait(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	// TODO: Use resp.
	_ = resp
}

Java

如需了解详情,请参阅 AI Applications Java API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

import com.google.cloud.discoveryengine.v1.CollectionName;
import com.google.cloud.discoveryengine.v1.CreateDataStoreRequest;
import com.google.cloud.discoveryengine.v1.DataStore;
import com.google.cloud.discoveryengine.v1.DataStoreServiceClient;

public class SyncCreateDataStore {

  public static void main(String[] args) throws Exception {
    syncCreateDataStore();
  }

  public static void syncCreateDataStore() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (DataStoreServiceClient dataStoreServiceClient = DataStoreServiceClient.create()) {
      CreateDataStoreRequest request =
          CreateDataStoreRequest.newBuilder()
              .setParent(CollectionName.of("[PROJECT]", "[LOCATION]", "[COLLECTION]").toString())
              .setDataStore(DataStore.newBuilder().build())
              .setDataStoreId("dataStoreId929489618")
              .setCreateAdvancedSiteSearch(true)
              .setSkipDefaultSchemaCreation(true)
              .build();
      DataStore response = dataStoreServiceClient.createDataStoreAsync(request).get();
    }
  }
}

导入文档

import com.google.cloud.discoveryengine.v1.BranchName;
import com.google.cloud.discoveryengine.v1.DocumentServiceClient;
import com.google.cloud.discoveryengine.v1.ImportDocumentsRequest;
import com.google.cloud.discoveryengine.v1.ImportDocumentsResponse;
import com.google.cloud.discoveryengine.v1.ImportErrorConfig;
import com.google.protobuf.FieldMask;

public class SyncImportDocuments {

  public static void main(String[] args) throws Exception {
    syncImportDocuments();
  }

  public static void syncImportDocuments() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (DocumentServiceClient documentServiceClient = DocumentServiceClient.create()) {
      ImportDocumentsRequest request =
          ImportDocumentsRequest.newBuilder()
              .setParent(
                  BranchName.ofProjectLocationDataStoreBranchName(
                          "[PROJECT]", "[LOCATION]", "[DATA_STORE]", "[BRANCH]")
                      .toString())
              .setErrorConfig(ImportErrorConfig.newBuilder().build())
              .setUpdateMask(FieldMask.newBuilder().build())
              .setAutoGenerateIds(true)
              .setIdField("idField1629396127")
              .setForceRefreshContent(true)
              .build();
      ImportDocumentsResponse response = documentServiceClient.importDocumentsAsync(request).get();
    }
  }
}

Node.js

如需了解详情,请参阅 AI Applications Node.js API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  Resource name of the CmekConfig to use for protecting this DataStore.
 */
// const cmekConfigName = 'abc123'
/**
 *  DataStore without CMEK protections. If a default CmekConfig is set for
 *  the project, setting this field will override the default CmekConfig as
 *  well.
 */
// const disableCmek = true
/**
 *  Required. The parent resource name, such as
 *  `projects/{project}/locations/{location}/collections/{collection}`.
 */
// const parent = 'abc123'
/**
 *  Required. The DataStore google.cloud.discoveryengine.v1.DataStore  to
 *  create.
 */
// const dataStore = {}
/**
 *  Required. The ID to use for the
 *  DataStore google.cloud.discoveryengine.v1.DataStore, which will become
 *  the final component of the
 *  DataStore google.cloud.discoveryengine.v1.DataStore's resource name.
 *  This field must conform to RFC-1034 (https://tools.ietf.org/html/rfc1034)
 *  standard with a length limit of 63 characters. Otherwise, an
 *  INVALID_ARGUMENT error is returned.
 */
// const dataStoreId = 'abc123'
/**
 *  A boolean flag indicating whether user want to directly create an advanced
 *  data store for site search.
 *  If the data store is not configured as site
 *  search (GENERIC vertical and PUBLIC_WEBSITE content_config), this flag will
 *  be ignored.
 */
// const createAdvancedSiteSearch = true
/**
 *  A boolean flag indicating whether to skip the default schema creation for
 *  the data store. Only enable this flag if you are certain that the default
 *  schema is incompatible with your use case.
 *  If set to true, you must manually create a schema for the data store before
 *  any documents can be ingested.
 *  This flag cannot be specified if `data_store.starting_schema` is specified.
 */
// const skipDefaultSchemaCreation = true

// Imports the Discoveryengine library
const {DataStoreServiceClient} = require('@google-cloud/discoveryengine').v1;

// Instantiates a client
const discoveryengineClient = new DataStoreServiceClient();

async function callCreateDataStore() {
  // Construct request
  const request = {
    parent,
    dataStore,
    dataStoreId,
  };

  // Run request
  const [operation] = await discoveryengineClient.createDataStore(request);
  const [response] = await operation.promise();
  console.log(response);
}

callCreateDataStore();

导入文档

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  The Inline source for the input content for documents.
 */
// const inlineSource = {}
/**
 *  Cloud Storage location for the input content.
 */
// const gcsSource = {}
/**
 *  BigQuery input source.
 */
// const bigquerySource = {}
/**
 *  FhirStore input source.
 */
// const fhirStoreSource = {}
/**
 *  Spanner input source.
 */
// const spannerSource = {}
/**
 *  Cloud SQL input source.
 */
// const cloudSqlSource = {}
/**
 *  Firestore input source.
 */
// const firestoreSource = {}
/**
 *  AlloyDB input source.
 */
// const alloyDbSource = {}
/**
 *  Cloud Bigtable input source.
 */
// const bigtableSource = {}
/**
 *  Required. The parent branch resource name, such as
 *  `projects/{project}/locations/{location}/collections/{collection}/dataStores/{data_store}/branches/{branch}`.
 *  Requires create/update permission.
 */
// const parent = 'abc123'
/**
 *  The desired location of errors incurred during the Import.
 */
// const errorConfig = {}
/**
 *  The mode of reconciliation between existing documents and the documents to
 *  be imported. Defaults to
 *  ReconciliationMode.INCREMENTAL google.cloud.discoveryengine.v1.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL.
 */
// const reconciliationMode = {}
/**
 *  Indicates which fields in the provided imported documents to update. If
 *  not set, the default is to update all fields.
 */
// const updateMask = {}
/**
 *  Whether to automatically generate IDs for the documents if absent.
 *  If set to `true`,
 *  Document.id google.cloud.discoveryengine.v1.Document.id s are
 *  automatically generated based on the hash of the payload, where IDs may not
 *  be consistent during multiple imports. In which case
 *  ReconciliationMode.FULL google.cloud.discoveryengine.v1.ImportDocumentsRequest.ReconciliationMode.FULL 
 *  is highly recommended to avoid duplicate contents. If unset or set to
 *  `false`, Document.id google.cloud.discoveryengine.v1.Document.id s have
 *  to be specified using
 *  id_field google.cloud.discoveryengine.v1.ImportDocumentsRequest.id_field,
 *  otherwise, documents without IDs fail to be imported.
 *  Supported data sources:
 *  * GcsSource google.cloud.discoveryengine.v1.GcsSource.
 *  GcsSource.data_schema google.cloud.discoveryengine.v1.GcsSource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * BigQuerySource google.cloud.discoveryengine.v1.BigQuerySource.
 *  BigQuerySource.data_schema google.cloud.discoveryengine.v1.BigQuerySource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * SpannerSource google.cloud.discoveryengine.v1.SpannerSource.
 *  * CloudSqlSource google.cloud.discoveryengine.v1.CloudSqlSource.
 *  * FirestoreSource google.cloud.discoveryengine.v1.FirestoreSource.
 *  * BigtableSource google.cloud.discoveryengine.v1.BigtableSource.
 */
// const autoGenerateIds = true
/**
 *  The field indicates the ID field or column to be used as unique IDs of
 *  the documents.
 *  For GcsSource google.cloud.discoveryengine.v1.GcsSource  it is the key of
 *  the JSON field. For instance, `my_id` for JSON `{"my_id": "some_uuid"}`.
 *  For others, it may be the column name of the table where the unique ids are
 *  stored.
 *  The values of the JSON field or the table column are used as the
 *  Document.id google.cloud.discoveryengine.v1.Document.id s. The JSON field
 *  or the table column must be of string type, and the values must be set as
 *  valid strings conform to RFC-1034 (https://tools.ietf.org/html/rfc1034)
 *  with 1-63 characters. Otherwise, documents without valid IDs fail to be
 *  imported.
 *  Only set this field when
 *  auto_generate_ids google.cloud.discoveryengine.v1.ImportDocumentsRequest.auto_generate_ids 
 *  is unset or set as `false`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  If it is unset, a default value `_id` is used when importing from the
 *  allowed data sources.
 *  Supported data sources:
 *  * GcsSource google.cloud.discoveryengine.v1.GcsSource.
 *  GcsSource.data_schema google.cloud.discoveryengine.v1.GcsSource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * BigQuerySource google.cloud.discoveryengine.v1.BigQuerySource.
 *  BigQuerySource.data_schema google.cloud.discoveryengine.v1.BigQuerySource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * SpannerSource google.cloud.discoveryengine.v1.SpannerSource.
 *  * CloudSqlSource google.cloud.discoveryengine.v1.CloudSqlSource.
 *  * FirestoreSource google.cloud.discoveryengine.v1.FirestoreSource.
 *  * BigtableSource google.cloud.discoveryengine.v1.BigtableSource.
 */
// const idField = 'abc123'
/**
 *  Optional. Whether to force refresh the unstructured content of the
 *  documents.
 *  If set to `true`, the content part of the documents will be refreshed
 *  regardless of the update status of the referencing content.
 */
// const forceRefreshContent = true

// Imports the Discoveryengine library
const {DocumentServiceClient} = require('@google-cloud/discoveryengine').v1;

// Instantiates a client
const discoveryengineClient = new DocumentServiceClient();

async function callImportDocuments() {
  // Construct request
  const request = {
    parent,
  };

  // Run request
  const [operation] = await discoveryengineClient.importDocuments(request);
  const [response] = await operation.promise();
  console.log(response);
}

callImportDocuments();

Python

如需了解详情,请参阅 AI Applications Python API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# bigquery_dataset = "YOUR_BIGQUERY_DATASET"
# bigquery_table = "YOUR_BIGQUERY_TABLE"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    bigquery_source=discoveryengine.BigQuerySource(
        project_id=project_id,
        dataset_id=bigquery_dataset,
        table_id=bigquery_table,
        data_schema="custom",
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

Ruby

如需了解详情,请参阅 AI Applications Ruby API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

require "google/cloud/discovery_engine/v1"

##
# Snippet for the create_data_store call in the DataStoreService service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::DiscoveryEngine::V1::DataStoreService::Client#create_data_store.
#
def create_data_store
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::DiscoveryEngine::V1::DataStoreService::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::DiscoveryEngine::V1::CreateDataStoreRequest.new

  # Call the create_data_store method.
  result = client.create_data_store request

  # The returned object is of type Gapic::Operation. You can use it to
  # check the status of an operation, cancel it, or wait for results.
  # Here is how to wait for a response.
  result.wait_until_done! timeout: 60
  if result.response?
    p result.response
  else
    puts "No response received."
  end
end

导入文档

require "google/cloud/discovery_engine/v1"

##
# Snippet for the import_documents call in the DocumentService service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::DiscoveryEngine::V1::DocumentService::Client#import_documents.
#
def import_documents
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::DiscoveryEngine::V1::DocumentService::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::DiscoveryEngine::V1::ImportDocumentsRequest.new

  # Call the import_documents method.
  result = client.import_documents request

  # The returned object is of type Gapic::Operation. You can use it to
  # check the status of an operation, cancel it, or wait for results.
  # Here is how to wait for a response.
  result.wait_until_done! timeout: 60
  if result.response?
    p result.response
  else
    puts "No response received."
  end
end

通过定期同步连接到 BigQuery

在导入数据之前,请查看准备数据以便提取

以下过程介绍了如何创建将 BigQuery 数据集与 Vertex AI Search 数据连接器相关联的数据连接器,以及如何为要创建的每个数据存储区指定数据集中的表。数据连接器的子数据存储区称为实体数据存储区。

数据集中的数据会定期同步到实体数据存储区。您可以指定每天、每三天或每五天同步一次。

控制台

如需使用 Google Cloud 控制台创建定期将数据从 BigQuery 数据集同步到 Vertex AI Search 的连接器,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 在导航菜单中,点击数据存储区

  3. 点击创建数据存储区

  4. 来源页面上,选择 BigQuery

  5. 选择要导入的数据类型。

  6. 点击周期性

  7. 选择同步频率,即您希望 Vertex AI Search 连接器与 BigQuery 数据集同步的频率。您可以稍后更改频次。

  8. BigQuery 数据集路径字段中,点击浏览,然后选择包含您已准备好要提取的表的相应数据集。或者,您也可以直接在 BigQuery 路径字段中输入表位置。路径的格式为 projectname.datasetname

  9. 要同步的表字段中,点击浏览,然后选择包含您要用于数据存储区的数据的表。

  10. 如果数据集中还有其他要用于数据存储区的表,请点击添加表,然后指定这些表。

  11. 点击继续

  12. 为数据存储区选择一个区域,输入数据连接器的名称,然后点击创建

    您现在已创建数据连接器,该连接器会定期与 BigQuery 数据集同步数据。并且您已创建一个或多个实体数据存储区。数据存储区与 BigQuery 表具有相同的名称。

  13. 如需查看数据注入状态,请前往数据存储区页面,然后点击数据连接器名称,在其数据页面上查看相关详情 > 数据注入活动标签页。当活动标签页上的“状态”列从正在进行更改为成功时,表示首次提取已完成。

    注入过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

首次设置数据源并导入数据后,数据存储区会按照您在设置期间选择的频率同步相应来源的数据。创建数据连接器大约一小时后,系统会进行首次同步。下一次同步会在大约 24 小时、72 小时或 120 小时后进行。

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

从 Cloud Storage 导入

您可以通过以下两种方式从 Cloud Storage 表创建数据存储区:

  • 一次性提取:将数据从 Cloud Storage 文件夹或文件导入到数据存储区。除非您手动刷新数据,否则数据存储区中的数据不会发生变化。

  • 定期提取:您可以从 Cloud Storage 文件夹或文件中导入数据,并设置同步频率,以确定数据存储区更新来自相应 Cloud Storage 位置的最新数据的频率。

下表比较了将 Cloud Storage 数据导入 Vertex AI Search 数据存储区的两种方式。

一次性注入 定期提取
已正式发布 (GA)。 公开预览版。
必须手动刷新数据。 数据每 1 天、3 天或 5 天自动更新一次。数据无法手动刷新。
Vertex AI Search 会根据 Cloud Storage 中的一个文件夹或文件创建一个数据存储区。 Vertex AI Search 会创建一个数据连接器,并将指定的文件或文件夹关联到数据存储区(称为实体数据存储区)。每个 Cloud Storage 数据连接器只能有一个实体数据存储区。
您可以先从一个 Cloud Storage 位置提取数据,然后再从另一个位置提取更多数据,从而将多个文件、文件夹和存储分区中的数据合并到一个数据存储区中。 由于不支持手动导入数据,实体数据存储区中的数据只能来自一个 Cloud Storage 文件或文件夹。
支持数据源访问权限控制。如需了解详情,请参阅数据源访问权限控制 不支持数据源访问权限控制。导入的数据可以包含访问控制,但这些控制不会受到尊重。
您可以使用Google Cloud 控制台或 API 创建数据存储区。 您必须使用控制台创建数据连接器及其实体数据存储区。
兼容 CMEK。 兼容 CMEK。

从 Cloud Storage 导入一次

如需从 Cloud Storage 中注入数据,请按照以下步骤操作,使用 Google Cloud 控制台或 API 创建数据存储区并注入数据。

在导入数据之前,请查看准备数据以便提取

控制台

如需使用控制台从 Cloud Storage 存储桶中注入数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 前往数据存储区页面。

  3. 点击 创建数据存储区

  4. 来源页面上,选择 Cloud Storage

  5. 选择您要导入的文件夹或文件部分,选择文件夹文件

  6. 点击浏览,然后选择您已准备好要提取的数据,再点击选择。 或者,直接在 gs:// 字段中输入位置。

  7. 选择要导入的数据类型。

  8. 点击继续

  9. 如果您要一次性导入结构化数据,请执行以下操作:

    1. 将字段映射到关键属性。

    2. 如果架构中缺少重要字段,请使用添加新字段来添加这些字段。

      如需了解详情,请参阅自动检测和修改简介

    3. 点击继续

  10. 为数据存储区选择一个区域。

  11. 为数据存储区输入名称。

  12. 可选:如果您选择了非结构化文档,则可以选择文档的解析和分块选项。如需比较解析器,请参阅解析文档。如需了解有关分块的信息,请参阅为 RAG 分块文档

    OCR 解析器和布局解析器可能会产生额外费用。请参阅 Document AI 功能价格

    如需选择解析器,请展开文档处理选项,然后指定要使用的解析器选项。

  13. 点击创建

  14. 如需查看数据注入状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详情。 当活动标签页上的“状态”列从正在进行更改为导入已完成时,表示提取已完成。

    注入过程可能需要几分钟或几小时才能完成,具体取决于数据的大小。

REST

如需使用命令行创建数据存储区并从 Cloud Storage 中注入数据,请按以下步骤操作。

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DATA_STORE_DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"]
    }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:要创建的 Vertex AI Search 数据存储区的 ID。此 ID 只能包含小写字母、数字、下划线和连字符。
    • DATA_STORE_DISPLAY_NAME:您要创建的 Vertex AI Search 数据存储区的显示名称。

    可选:如果您要上传非结构化数据,并希望配置文档解析或为 RAG 启用文档分块,请指定 documentProcessingConfig 对象并将其包含在数据存储区创建请求中。如果您要提取扫描的 PDF,建议配置 PDF 的 OCR 解析器。如需了解如何配置解析或分块选项,请参阅解析和分块文档

  2. 从 Cloud Storage 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "gcsSource": {
          "inputUris": ["INPUT_FILE_PATTERN_1", "INPUT_FILE_PATTERN_2"],
          "dataSchema": "DATA_SCHEMA",
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
        "errorConfig": {
          "gcsPrefix": "ERROR_DIRECTORY"
        }
      }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:Vertex AI Search 数据存储区的 ID。
    • INPUT_FILE_PATTERN:Cloud Storage 中包含文档的文件格式。

      对于结构化数据或包含元数据的非结构化数据,输入文件模式的一个示例是 gs://<your-gcs-bucket>/directory/object.json,匹配一个或多个文件的模式的一个示例是 gs://<your-gcs-bucket>/directory/*.json

      对于非结构化文档,一个示例是 gs://<your-gcs-bucket>/directory/*.pdf。与该模式匹配的每个文件都会成为一个文档。

      如果 <your-gcs-bucket> 不在 PROJECT_ID 下,您需要为服务账号授予 Cloud Storage 存储桶的 service-<project number>@gcp-sa-discoveryengine.iam.gserviceaccount.com“Storage Object Viewer”权限。例如,如果您要将 Cloud Storage 存储桶从源项目“123”导入到目标项目“456”,请授予项目“123”下 Cloud Storage 存储桶的 service-456@gcp-sa-discoveryengine.iam.gserviceaccount.com 权限。

    • DATA_SCHEMA:可选。值包括 documentcustomcsvcontent。默认值为 document

      • document:上传包含非结构化文档元数据的非结构化数据。文件中的每一行都必须遵循以下格式之一。您可以定义每个文档的 ID:

        • { "id": "<your-id>", "jsonData": "<JSON string>", "content": { "mimeType": "<application/pdf or text/html>", "uri": "gs://<your-gcs-bucket>/directory/filename.pdf" } }
        • { "id": "<your-id>", "structData": <JSON object>, "content": { "mimeType": "<application/pdf or text/html>", "uri": "gs://<your-gcs-bucket>/directory/filename.pdf" } }
      • custom:上传结构化文档的 JSON。数据按照架构进行整理。您可以指定架构,否则系统会自动检测架构。您可以将文档的 JSON 字符串以一致的格式直接放在每一行中,Vertex AI Search 会自动为导入的每个文档生成 ID。

      • content:上传非结构化文档(PDF、HTML、DOC、TXT、PPTX)。每个文档的 ID 都会自动生成,即 SHA256(GCS_URI) 的前 128 位(以十六进制字符串形式编码)。您可以指定多个输入文件格式,但匹配的文件不得超过 10 万个。

      • csv:在 CSV 文件中添加标题行,并将每个标题映射到文档字段。使用 inputUris 字段指定 CSV 文件的路径。

    • ERROR_DIRECTORY:可选。存放与导入有关的错误信息的 Cloud Storage 目录,例如 gs://<your-gcs-bucket>/directory/import_errors。Google 建议将此字段留空,以便 Vertex AI Search 自动创建临时目录。

    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 Cloud Storage 到数据存储区的增量数据刷新。此方法会执行更新插入操作,即添加新文档,并将现有文档替换为具有相同 ID 的更新文档。指定 FULL 会导致数据存储区中的文档完全重新定位。换句话说,系统会将新文档和更新后的文档添加到您的数据存储区,并从您的数据存储区中移除 Cloud Storage 中不存在的文档。如果您想自动删除不再需要的文档,FULL 模式会很有帮助。

    • AUTO_GENERATE_IDS:可选。指定是否自动生成文档 ID。如果设置为 true,则根据载荷的哈希值生成文档 ID。请注意,生成的文档 ID 在多次导入时可能不会保持一致。如果您在多次导入时自动生成 ID,Google 强烈建议您将 reconciliationMode 设置为 FULL,以保持文档 ID 的一致性。

      仅当 gcsSource.dataSchema 设置为 customcsv 时,才指定 autoGenerateIds。否则,系统将返回 INVALID_ARGUMENT 错误。如果您未指定 autoGenerateIds 或将其设置为 false,则必须指定 idField。否则,文档将无法导入。

    • ID_FIELD:可选。指定哪些字段是文档 ID。对于 Cloud Storage 源文档,idField 用于指定 JSON 字段中作为文档 ID 的名称。例如,如果 {"my_id":"some_uuid"} 是某个文档中的文档 ID 字段,请指定 "idField":"my_id"。这会将所有名称为 "my_id" 的 JSON 字段标识为文档 ID。

      仅在以下情况下指定此字段:(1) gcsSource.dataSchema 设置为 customcsv;(2) auto_generate_ids 设置为 false 或未指定。否则,系统将返回 INVALID_ARGUMENT 错误。

      请注意,Cloud Storage JSON 字段的值必须为字符串类型,长度必须介于 1 到 63 个字符之间,并且必须符合 RFC-1034 的要求。否则,文档将无法导入。

      请注意,id_field 指定的 JSON 字段名称必须为字符串类型,长度必须介于 1 到 63 个字符之间,并且必须符合 RFC-1034。否则,文档将无法导入。

C#

如需了解详情,请参阅 AI Applications C# API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

using Google.Cloud.DiscoveryEngine.V1;
using Google.LongRunning;

public sealed partial class GeneratedDataStoreServiceClientSnippets
{
    /// <summary>Snippet for CreateDataStore</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public void CreateDataStoreRequestObject()
    {
        // Create client
        DataStoreServiceClient dataStoreServiceClient = DataStoreServiceClient.Create();
        // Initialize request argument(s)
        CreateDataStoreRequest request = new CreateDataStoreRequest
        {
            ParentAsCollectionName = CollectionName.FromProjectLocationCollection("[PROJECT]", "[LOCATION]", "[COLLECTION]"),
            DataStore = new DataStore(),
            DataStoreId = "",
            CreateAdvancedSiteSearch = false,
            CmekConfigNameAsCmekConfigName = CmekConfigName.FromProjectLocation("[PROJECT]", "[LOCATION]"),
            SkipDefaultSchemaCreation = false,
        };
        // Make the request
        Operation<DataStore, CreateDataStoreMetadata> response = dataStoreServiceClient.CreateDataStore(request);

        // Poll until the returned long-running operation is complete
        Operation<DataStore, CreateDataStoreMetadata> completedResponse = response.PollUntilCompleted();
        // Retrieve the operation result
        DataStore result = completedResponse.Result;

        // Or get the name of the operation
        string operationName = response.Name;
        // This name can be stored, then the long-running operation retrieved later by name
        Operation<DataStore, CreateDataStoreMetadata> retrievedResponse = dataStoreServiceClient.PollOnceCreateDataStore(operationName);
        // Check if the retrieved long-running operation has completed
        if (retrievedResponse.IsCompleted)
        {
            // If it has completed, then access the result
            DataStore retrievedResult = retrievedResponse.Result;
        }
    }
}

导入文档

using Google.Cloud.DiscoveryEngine.V1;
using Google.LongRunning;
using Google.Protobuf.WellKnownTypes;

public sealed partial class GeneratedDocumentServiceClientSnippets
{
    /// <summary>Snippet for ImportDocuments</summary>
    /// <remarks>
    /// This snippet has been automatically generated and should be regarded as a code template only.
    /// It will require modifications to work:
    /// - It may require correct/in-range values for request initialization.
    /// - It may require specifying regional endpoints when creating the service client as shown in
    ///   https://cloud.google.com/dotnet/docs/reference/help/client-configuration#endpoint.
    /// </remarks>
    public void ImportDocumentsRequestObject()
    {
        // Create client
        DocumentServiceClient documentServiceClient = DocumentServiceClient.Create();
        // Initialize request argument(s)
        ImportDocumentsRequest request = new ImportDocumentsRequest
        {
            ParentAsBranchName = BranchName.FromProjectLocationDataStoreBranch("[PROJECT]", "[LOCATION]", "[DATA_STORE]", "[BRANCH]"),
            InlineSource = new ImportDocumentsRequest.Types.InlineSource(),
            ErrorConfig = new ImportErrorConfig(),
            ReconciliationMode = ImportDocumentsRequest.Types.ReconciliationMode.Unspecified,
            UpdateMask = new FieldMask(),
            AutoGenerateIds = false,
            IdField = "",
            ForceRefreshContent = false,
        };
        // Make the request
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> response = documentServiceClient.ImportDocuments(request);

        // Poll until the returned long-running operation is complete
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> completedResponse = response.PollUntilCompleted();
        // Retrieve the operation result
        ImportDocumentsResponse result = completedResponse.Result;

        // Or get the name of the operation
        string operationName = response.Name;
        // This name can be stored, then the long-running operation retrieved later by name
        Operation<ImportDocumentsResponse, ImportDocumentsMetadata> retrievedResponse = documentServiceClient.PollOnceImportDocuments(operationName);
        // Check if the retrieved long-running operation has completed
        if (retrievedResponse.IsCompleted)
        {
            // If it has completed, then access the result
            ImportDocumentsResponse retrievedResult = retrievedResponse.Result;
        }
    }
}

Go

如需了解详情,请参阅 AI Applications Go API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


package main

import (
	"context"

	discoveryengine "cloud.google.com/go/discoveryengine/apiv1"
	discoveryenginepb "cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb"
)

func main() {
	ctx := context.Background()
	// This snippet has been automatically generated and should be regarded as a code template only.
	// It will require modifications to work:
	// - It may require correct/in-range values for request initialization.
	// - It may require specifying regional endpoints when creating the service client as shown in:
	//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options
	c, err := discoveryengine.NewDataStoreClient(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	defer c.Close()

	req := &discoveryenginepb.CreateDataStoreRequest{
		// TODO: Fill request struct fields.
		// See https://pkg.go.dev/cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb#CreateDataStoreRequest.
	}
	op, err := c.CreateDataStore(ctx, req)
	if err != nil {
		// TODO: Handle error.
	}

	resp, err := op.Wait(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	// TODO: Use resp.
	_ = resp
}

导入文档


package main

import (
	"context"

	discoveryengine "cloud.google.com/go/discoveryengine/apiv1"
	discoveryenginepb "cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb"
)

func main() {
	ctx := context.Background()
	// This snippet has been automatically generated and should be regarded as a code template only.
	// It will require modifications to work:
	// - It may require correct/in-range values for request initialization.
	// - It may require specifying regional endpoints when creating the service client as shown in:
	//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options
	c, err := discoveryengine.NewDocumentClient(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	defer c.Close()

	req := &discoveryenginepb.ImportDocumentsRequest{
		// TODO: Fill request struct fields.
		// See https://pkg.go.dev/cloud.google.com/go/discoveryengine/apiv1/discoveryenginepb#ImportDocumentsRequest.
	}
	op, err := c.ImportDocuments(ctx, req)
	if err != nil {
		// TODO: Handle error.
	}

	resp, err := op.Wait(ctx)
	if err != nil {
		// TODO: Handle error.
	}
	// TODO: Use resp.
	_ = resp
}

Java

如需了解详情,请参阅 AI Applications Java API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

import com.google.cloud.discoveryengine.v1.CollectionName;
import com.google.cloud.discoveryengine.v1.CreateDataStoreRequest;
import com.google.cloud.discoveryengine.v1.DataStore;
import com.google.cloud.discoveryengine.v1.DataStoreServiceClient;

public class SyncCreateDataStore {

  public static void main(String[] args) throws Exception {
    syncCreateDataStore();
  }

  public static void syncCreateDataStore() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (DataStoreServiceClient dataStoreServiceClient = DataStoreServiceClient.create()) {
      CreateDataStoreRequest request =
          CreateDataStoreRequest.newBuilder()
              .setParent(CollectionName.of("[PROJECT]", "[LOCATION]", "[COLLECTION]").toString())
              .setDataStore(DataStore.newBuilder().build())
              .setDataStoreId("dataStoreId929489618")
              .setCreateAdvancedSiteSearch(true)
              .setSkipDefaultSchemaCreation(true)
              .build();
      DataStore response = dataStoreServiceClient.createDataStoreAsync(request).get();
    }
  }
}

导入文档

import com.google.cloud.discoveryengine.v1.BranchName;
import com.google.cloud.discoveryengine.v1.DocumentServiceClient;
import com.google.cloud.discoveryengine.v1.ImportDocumentsRequest;
import com.google.cloud.discoveryengine.v1.ImportDocumentsResponse;
import com.google.cloud.discoveryengine.v1.ImportErrorConfig;
import com.google.protobuf.FieldMask;

public class SyncImportDocuments {

  public static void main(String[] args) throws Exception {
    syncImportDocuments();
  }

  public static void syncImportDocuments() throws Exception {
    // This snippet has been automatically generated and should be regarded as a code template only.
    // It will require modifications to work:
    // - It may require correct/in-range values for request initialization.
    // - It may require specifying regional endpoints when creating the service client as shown in
    // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
    try (DocumentServiceClient documentServiceClient = DocumentServiceClient.create()) {
      ImportDocumentsRequest request =
          ImportDocumentsRequest.newBuilder()
              .setParent(
                  BranchName.ofProjectLocationDataStoreBranchName(
                          "[PROJECT]", "[LOCATION]", "[DATA_STORE]", "[BRANCH]")
                      .toString())
              .setErrorConfig(ImportErrorConfig.newBuilder().build())
              .setUpdateMask(FieldMask.newBuilder().build())
              .setAutoGenerateIds(true)
              .setIdField("idField1629396127")
              .setForceRefreshContent(true)
              .build();
      ImportDocumentsResponse response = documentServiceClient.importDocumentsAsync(request).get();
    }
  }
}

Node.js

如需了解详情,请参阅 AI Applications Node.js API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  Resource name of the CmekConfig to use for protecting this DataStore.
 */
// const cmekConfigName = 'abc123'
/**
 *  DataStore without CMEK protections. If a default CmekConfig is set for
 *  the project, setting this field will override the default CmekConfig as
 *  well.
 */
// const disableCmek = true
/**
 *  Required. The parent resource name, such as
 *  `projects/{project}/locations/{location}/collections/{collection}`.
 */
// const parent = 'abc123'
/**
 *  Required. The DataStore google.cloud.discoveryengine.v1.DataStore  to
 *  create.
 */
// const dataStore = {}
/**
 *  Required. The ID to use for the
 *  DataStore google.cloud.discoveryengine.v1.DataStore, which will become
 *  the final component of the
 *  DataStore google.cloud.discoveryengine.v1.DataStore's resource name.
 *  This field must conform to RFC-1034 (https://tools.ietf.org/html/rfc1034)
 *  standard with a length limit of 63 characters. Otherwise, an
 *  INVALID_ARGUMENT error is returned.
 */
// const dataStoreId = 'abc123'
/**
 *  A boolean flag indicating whether user want to directly create an advanced
 *  data store for site search.
 *  If the data store is not configured as site
 *  search (GENERIC vertical and PUBLIC_WEBSITE content_config), this flag will
 *  be ignored.
 */
// const createAdvancedSiteSearch = true
/**
 *  A boolean flag indicating whether to skip the default schema creation for
 *  the data store. Only enable this flag if you are certain that the default
 *  schema is incompatible with your use case.
 *  If set to true, you must manually create a schema for the data store before
 *  any documents can be ingested.
 *  This flag cannot be specified if `data_store.starting_schema` is specified.
 */
// const skipDefaultSchemaCreation = true

// Imports the Discoveryengine library
const {DataStoreServiceClient} = require('@google-cloud/discoveryengine').v1;

// Instantiates a client
const discoveryengineClient = new DataStoreServiceClient();

async function callCreateDataStore() {
  // Construct request
  const request = {
    parent,
    dataStore,
    dataStoreId,
  };

  // Run request
  const [operation] = await discoveryengineClient.createDataStore(request);
  const [response] = await operation.promise();
  console.log(response);
}

callCreateDataStore();

导入文档

/**
 * This snippet has been automatically generated and should be regarded as a code template only.
 * It will require modifications to work.
 * It may require correct/in-range values for request initialization.
 * TODO(developer): Uncomment these variables before running the sample.
 */
/**
 *  The Inline source for the input content for documents.
 */
// const inlineSource = {}
/**
 *  Cloud Storage location for the input content.
 */
// const gcsSource = {}
/**
 *  BigQuery input source.
 */
// const bigquerySource = {}
/**
 *  FhirStore input source.
 */
// const fhirStoreSource = {}
/**
 *  Spanner input source.
 */
// const spannerSource = {}
/**
 *  Cloud SQL input source.
 */
// const cloudSqlSource = {}
/**
 *  Firestore input source.
 */
// const firestoreSource = {}
/**
 *  AlloyDB input source.
 */
// const alloyDbSource = {}
/**
 *  Cloud Bigtable input source.
 */
// const bigtableSource = {}
/**
 *  Required. The parent branch resource name, such as
 *  `projects/{project}/locations/{location}/collections/{collection}/dataStores/{data_store}/branches/{branch}`.
 *  Requires create/update permission.
 */
// const parent = 'abc123'
/**
 *  The desired location of errors incurred during the Import.
 */
// const errorConfig = {}
/**
 *  The mode of reconciliation between existing documents and the documents to
 *  be imported. Defaults to
 *  ReconciliationMode.INCREMENTAL google.cloud.discoveryengine.v1.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL.
 */
// const reconciliationMode = {}
/**
 *  Indicates which fields in the provided imported documents to update. If
 *  not set, the default is to update all fields.
 */
// const updateMask = {}
/**
 *  Whether to automatically generate IDs for the documents if absent.
 *  If set to `true`,
 *  Document.id google.cloud.discoveryengine.v1.Document.id s are
 *  automatically generated based on the hash of the payload, where IDs may not
 *  be consistent during multiple imports. In which case
 *  ReconciliationMode.FULL google.cloud.discoveryengine.v1.ImportDocumentsRequest.ReconciliationMode.FULL 
 *  is highly recommended to avoid duplicate contents. If unset or set to
 *  `false`, Document.id google.cloud.discoveryengine.v1.Document.id s have
 *  to be specified using
 *  id_field google.cloud.discoveryengine.v1.ImportDocumentsRequest.id_field,
 *  otherwise, documents without IDs fail to be imported.
 *  Supported data sources:
 *  * GcsSource google.cloud.discoveryengine.v1.GcsSource.
 *  GcsSource.data_schema google.cloud.discoveryengine.v1.GcsSource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * BigQuerySource google.cloud.discoveryengine.v1.BigQuerySource.
 *  BigQuerySource.data_schema google.cloud.discoveryengine.v1.BigQuerySource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * SpannerSource google.cloud.discoveryengine.v1.SpannerSource.
 *  * CloudSqlSource google.cloud.discoveryengine.v1.CloudSqlSource.
 *  * FirestoreSource google.cloud.discoveryengine.v1.FirestoreSource.
 *  * BigtableSource google.cloud.discoveryengine.v1.BigtableSource.
 */
// const autoGenerateIds = true
/**
 *  The field indicates the ID field or column to be used as unique IDs of
 *  the documents.
 *  For GcsSource google.cloud.discoveryengine.v1.GcsSource  it is the key of
 *  the JSON field. For instance, `my_id` for JSON `{"my_id": "some_uuid"}`.
 *  For others, it may be the column name of the table where the unique ids are
 *  stored.
 *  The values of the JSON field or the table column are used as the
 *  Document.id google.cloud.discoveryengine.v1.Document.id s. The JSON field
 *  or the table column must be of string type, and the values must be set as
 *  valid strings conform to RFC-1034 (https://tools.ietf.org/html/rfc1034)
 *  with 1-63 characters. Otherwise, documents without valid IDs fail to be
 *  imported.
 *  Only set this field when
 *  auto_generate_ids google.cloud.discoveryengine.v1.ImportDocumentsRequest.auto_generate_ids 
 *  is unset or set as `false`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  If it is unset, a default value `_id` is used when importing from the
 *  allowed data sources.
 *  Supported data sources:
 *  * GcsSource google.cloud.discoveryengine.v1.GcsSource.
 *  GcsSource.data_schema google.cloud.discoveryengine.v1.GcsSource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * BigQuerySource google.cloud.discoveryengine.v1.BigQuerySource.
 *  BigQuerySource.data_schema google.cloud.discoveryengine.v1.BigQuerySource.data_schema 
 *  must be `custom` or `csv`. Otherwise, an INVALID_ARGUMENT error is thrown.
 *  * SpannerSource google.cloud.discoveryengine.v1.SpannerSource.
 *  * CloudSqlSource google.cloud.discoveryengine.v1.CloudSqlSource.
 *  * FirestoreSource google.cloud.discoveryengine.v1.FirestoreSource.
 *  * BigtableSource google.cloud.discoveryengine.v1.BigtableSource.
 */
// const idField = 'abc123'
/**
 *  Optional. Whether to force refresh the unstructured content of the
 *  documents.
 *  If set to `true`, the content part of the documents will be refreshed
 *  regardless of the update status of the referencing content.
 */
// const forceRefreshContent = true

// Imports the Discoveryengine library
const {DocumentServiceClient} = require('@google-cloud/discoveryengine').v1;

// Instantiates a client
const discoveryengineClient = new DocumentServiceClient();

async function callImportDocuments() {
  // Construct request
  const request = {
    parent,
  };

  // Run request
  const [operation] = await discoveryengineClient.importDocuments(request);
  const [response] = await operation.promise();
  console.log(response);
}

callImportDocuments();

Python

如需了解详情,请参阅 AI Applications Python API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"

# Examples:
# - Unstructured documents
#   - `gs://bucket/directory/file.pdf`
#   - `gs://bucket/directory/*.pdf`
# - Unstructured documents with JSONL Metadata
#   - `gs://bucket/directory/file.json`
# - Unstructured documents with CSV Metadata
#   - `gs://bucket/directory/file.csv`
# gcs_uri = "YOUR_GCS_PATH"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    gcs_source=discoveryengine.GcsSource(
        # Multiple URIs are supported
        input_uris=[gcs_uri],
        # Options:
        # - `content` - Unstructured documents (PDF, HTML, DOC, TXT, PPTX)
        # - `custom` - Unstructured documents with custom JSONL metadata
        # - `document` - Structured documents in the discoveryengine.Document format.
        # - `csv` - Unstructured documents with CSV metadata
        data_schema="content",
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

Ruby

如需了解详情,请参阅 AI Applications Ruby API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区

require "google/cloud/discovery_engine/v1"

##
# Snippet for the create_data_store call in the DataStoreService service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::DiscoveryEngine::V1::DataStoreService::Client#create_data_store.
#
def create_data_store
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::DiscoveryEngine::V1::DataStoreService::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::DiscoveryEngine::V1::CreateDataStoreRequest.new

  # Call the create_data_store method.
  result = client.create_data_store request

  # The returned object is of type Gapic::Operation. You can use it to
  # check the status of an operation, cancel it, or wait for results.
  # Here is how to wait for a response.
  result.wait_until_done! timeout: 60
  if result.response?
    p result.response
  else
    puts "No response received."
  end
end

导入文档

require "google/cloud/discovery_engine/v1"

##
# Snippet for the import_documents call in the DocumentService service
#
# This snippet has been automatically generated and should be regarded as a code
# template only. It will require modifications to work:
# - It may require correct/in-range values for request initialization.
# - It may require specifying regional endpoints when creating the service
# client as shown in https://cloud.google.com/ruby/docs/reference.
#
# This is an auto-generated example demonstrating basic usage of
# Google::Cloud::DiscoveryEngine::V1::DocumentService::Client#import_documents.
#
def import_documents
  # Create a client object. The client can be reused for multiple calls.
  client = Google::Cloud::DiscoveryEngine::V1::DocumentService::Client.new

  # Create a request. To set request fields, pass in keyword arguments.
  request = Google::Cloud::DiscoveryEngine::V1::ImportDocumentsRequest.new

  # Call the import_documents method.
  result = client.import_documents request

  # The returned object is of type Gapic::Operation. You can use it to
  # check the status of an operation, cancel it, or wait for results.
  # Here is how to wait for a response.
  result.wait_until_done! timeout: 60
  if result.response?
    p result.response
  else
    puts "No response received."
  end
end

通过定期同步连接到 Cloud Storage

在导入数据之前,请查看准备数据以便提取

以下过程介绍了如何创建将 Cloud Storage 位置与 Vertex AI Search 数据连接器相关联的数据连接器,以及如何为要创建的数据存储区指定该位置中的文件夹或文件。数据连接器的子数据存储区称为实体数据存储区。

数据会定期同步到实体数据存储区。您可以指定每天、每三天或每五天同步一次。

控制台

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 前往数据存储区页面。

  3. 点击创建数据存储区

  4. 来源页面上,选择 Cloud Storage

  5. 选择要导入的数据类型。

  6. 点击周期性

  7. 选择同步频率,即您希望 Vertex AI Search 连接器与 Cloud Storage 位置同步的频率。您可以稍后更改频次。

  8. 选择您要导入的文件夹或文件部分,选择文件夹文件

  9. 点击浏览,然后选择您已准备好要提取的数据,再点击选择。 或者,直接在 gs:// 字段中输入位置。

  10. 点击继续

  11. 为您的数据连接器选择区域。

  12. 为数据连接器输入名称。

  13. 可选:如果您选择了非结构化文档,则可以选择文档的解析和分块选项。如需比较解析器,请参阅解析文档。如需了解有关分块的信息,请参阅为 RAG 分块文档

    OCR 解析器和布局解析器可能会产生额外费用。请参阅 Document AI 功能价格

    如需选择解析器,请展开文档处理选项,然后指定要使用的解析器选项。

  14. 点击创建

    您现在已创建数据连接器,该连接器会定期与 Cloud Storage 位置同步数据。您还创建了一个名为 gcs_store 的实体数据存储区。

  15. 如需查看数据注入状态,请前往数据存储区页面,然后点击数据连接器名称,在其数据页面上查看相关详情

    数据注入活动标签页。当数据提取活动标签页上的“状态”列从正在进行变为成功时,表示首次提取已完成。

    注入过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。

首次设置数据源并导入数据后,系统会按照您在设置期间选择的频率从该来源同步数据。 创建数据连接器大约一小时后,系统会进行首次同步。下一次同步会在大约 24 小时、72 小时或 120 小时后进行。

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

连接到 Google 云端硬盘

AI 应用可以使用数据联邦从 Google 云端硬盘中搜索数据,直接从指定的数据源检索信息。由于数据不会复制到 Vertex AI Search 索引中,因此您无需担心数据存储问题。

准备工作

  • 您必须使用计划连接的 Google 云端硬盘实例所用的同一账号登录 Google Cloud 控制台。AI 应用会使用您的 Google Workspace 客户 ID 连接到 Google 云端硬盘。
  • 为了在 AI 应用中强制执行数据源访问权限控制并保护数据,请确保您已配置身份提供方
  • 如果您使用安全控制措施,请注意下表中讨论的与 Google 云端硬盘中的数据相关的限制:

    安全控制 请注意以下事项
    数据驻留 (DRZ) AI 应用仅保证数据驻留在 Google Cloud。如需了解数据驻留和 Google 云端硬盘,请参阅 Google Workspace 合规性指南和文档,例如选择数据存储区域 数字主权
    客户管理的加密密钥 (CMEK) 您的密钥仅加密 Google Cloud内的数据。Cloud Key Management Service 控制措施不适用于存储在 Google 云端硬盘中的数据。
    Access Transparency Access Transparency 会记录 Google 员工对 Google Cloud 项目执行的操作。您还需要查看 Google Workspace 创建的 Access Transparency 日志。如需了解详情,请参阅 Google Workspace 管理员帮助文档中的 Access Transparency 日志事件

使用数据联邦

控制台

如需使用控制台使 Google 云端硬盘数据可供搜索,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 在导航菜单中,点击数据存储区

  3. 点击 创建数据存储区

  4. 选择数据源页面上,选择 Google 云端硬盘

  5. 为数据存储区指定云端硬盘来源。

    • 全部:将整个云端硬盘添加到数据存储区。
    • 特定共享云端硬盘:添加共享云端硬盘的文件夹 ID。
    • 特定共享文件夹:添加共享文件夹的 ID。

    如需查找共享云端硬盘的文件夹 ID 或特定文件夹 ID,请前往相应共享云端硬盘或文件夹,然后从网址中复制 ID。网址采用以下格式:https://drive.google.com/corp/drive/folders/ID

    例如 https://drive.google.com/corp/drive/folders/123456789012345678901

  6. 点击继续

  7. 为数据存储区选择一个区域。

  8. 为数据存储区输入名称。

  9. 可选:如需在您使用该应用查询数据时,排除此数据存储区中的数据,以免其用于生成式 AI 内容,请点击生成式 AI 选项,然后选择从生成式 AI 功能中排除

  10. 点击创建

错误消息

下表介绍了使用此 Google 数据源时可能会遇到的错误消息,包括 HTTP 错误代码和建议的问题排查步骤。

错误代码 错误消息 说明 问题排查
403 (Permission Denied) Google Workspace 数据存储区不支持使用服务账号凭据进行搜索。 被搜索的引擎具有 Google Workspace 数据存储区,并且传递的凭据是服务账号的凭据。不支持使用服务账号凭据在 Google Workspace 数据存储区中进行搜索。 使用用户凭据调用搜索,或从引擎中移除 Google Workspace 数据存储区。
403 (Permission Denied) Google Workspace 数据存储区不支持个人账号。 搜索是使用消费者账号 (@gmail.com) 凭据调用的,而 Google Workspace 数据存储区不支持这种凭据。 从引擎中移除 Google Workspace 数据存储区,或使用受管理的 Google 账号。
403 (Permission Denied) Datastore 的客户 ID 不匹配 只有与 Google Workspace 数据存储区属于同一组织的用户才能进行搜索。 从引擎中移除 Google Workspace 数据存储区,或者联系支持人员(如果用户和 Google Workspace 数据存储区应位于不同的组织中)。
400(参数无效) Engine 不能同时包含默认和共享的 Google 云端硬盘数据存储区。 您无法将包含所有云端硬盘(默认)的数据存储区和包含特定共享云端硬盘的数据存储区连接到同一应用。 如需将新的 Google 云端硬盘数据源与应用相关联,请先取消关联不需要的数据存储区,然后添加要使用的新数据存储区。

使用数据联邦

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需在设置好应用和数据存储区后获取搜索结果,请参阅获取搜索结果

连接到 Gmail

按照以下步骤在 Google Cloud 控制台中创建连接到 Gmail 的数据存储区。连接数据存储区后,您可以将该数据存储区附加到搜索应用,并搜索 Gmail 数据。

准备工作

  • 您必须使用计划连接的 Google Workspace 实例所用的同一账号登录 Google Cloud 控制台。 Vertex AI Search 使用您的 Google Workspace 客户 ID 连接到 Gmail。
  • 为了在 AI 应用中强制执行数据源访问权限控制并保护数据,请确保您已配置身份提供方

限制

  • 如果您使用安全控制措施,请注意下表中讨论的与 Gmail 中的数据相关的限制:

    安全控制 请注意以下事项
    数据驻留 (DRZ) AI 应用仅保证数据驻留在 Google Cloud。如需了解数据驻留和 Gmail,请参阅 Google Workspace 合规性指南和文档,例如选择数据存储区域 数字主权
    客户管理的加密密钥 (CMEK) 您的密钥仅加密 Google Cloud内的数据。Cloud Key Management Service 控制措施不适用于存储在 Gmail 中的数据。
    Access Transparency Access Transparency 会记录 Google 员工对 Google Cloud 项目执行的操作。您还需要查看 Google Workspace 创建的 Access Transparency 日志。如需了解详情,请参阅 Google Workspace 管理员帮助文档中的 Access Transparency 日志事件

创建 Gmail 数据存储区

控制台

如需使用控制台使 Gmail 数据可供搜索,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 在导航菜单中,点击数据存储区

  3. 点击 创建数据存储区

  4. 选择数据源页面上,选择 Google Gmail

  5. 为数据存储区选择一个区域。

  6. 为数据存储区输入名称。

  7. 点击创建

  8. 按照创建搜索应用中的步骤操作,将创建的数据存储区附加到 Vertex AI Search 应用。

错误消息

下表介绍了使用此 Google 数据源时可能会遇到的错误消息,包括 HTTP 错误代码和建议的问题排查步骤。

错误代码 错误消息 说明 问题排查
403 (Permission Denied) Google Workspace 数据存储区不支持使用服务账号凭据进行搜索。 被搜索的引擎具有 Google Workspace 数据存储区,并且传递的凭据是服务账号的凭据。不支持使用服务账号凭据在 Google Workspace 数据存储区中进行搜索。 使用用户凭据调用搜索,或从引擎中移除 Google Workspace 数据存储区。
403 (Permission Denied) Google Workspace 数据存储区不支持个人账号。 搜索是使用消费者账号 (@gmail.com) 凭据调用的,而 Google Workspace 数据存储区不支持这种凭据。 从引擎中移除 Google Workspace 数据存储区,或使用受管理的 Google 账号。
403 (Permission Denied) Datastore 的客户 ID 不匹配 只有与 Google Workspace 数据存储区属于同一组织的用户才能进行搜索。 从引擎中移除 Google Workspace 数据存储区,或者联系支持人员(如果用户和 Google Workspace 数据存储区应位于不同的组织中)。
400(参数无效) Engine 不能同时包含默认和共享的 Google 云端硬盘数据存储区。 您无法将包含所有云端硬盘(默认)的数据存储区和包含特定共享云端硬盘的数据存储区连接到同一应用。 如需将新的 Google 云端硬盘数据源与应用相关联,请先取消关联不需要的数据存储区,然后添加要使用的新数据存储区。

后续步骤

  • 如需预览设置应用和数据存储区后的搜索结果显示效果,请参阅预览搜索结果

关联到 Google 协作平台

如需搜索 Google 网站中的数据,请按照以下步骤使用 Google Cloud 控制台创建连接器。

准备工作:

  • 您必须使用计划连接的 Google Workspace 实例所用的同一账号登录 Google Cloud 控制台。 Vertex AI Search 使用您的 Google Workspace 客户 ID 连接到 Google 协作平台。

  • 为了在 AI 应用中强制执行数据源访问权限控制并保护数据,请确保您已配置身份提供方

  • 如果您使用安全控制措施,请注意下表中讨论的与 Google Sites 中的数据相关的限制:

    安全控制 请注意以下事项
    数据驻留 (DRZ) AI 应用仅保证数据驻留在 Google Cloud。如需了解数据驻留和 Google Sites,请参阅 Google Workspace 合规性指南和文档,例如选择数据存储区域 数字主权
    客户管理的加密密钥 (CMEK) 您的密钥仅加密 Google Cloud内的数据。Cloud Key Management Service 控制措施不适用于存储在 Google Sites 中的数据。
    Access Transparency Access Transparency 会记录 Google 员工对 Google Cloud 项目执行的操作。您还需要查看 Google Workspace 创建的 Access Transparency 日志。如需了解详情,请参阅 Google Workspace 管理员帮助文档中的 Access Transparency 日志事件

控制台

如需使用控制台使 Google Sites 数据可供搜索,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 前往数据存储区页面。

  3. 点击新数据存储区

  4. 来源页面上,选择 Google 协作平台

  5. 为数据存储区选择一个区域。

  6. 为数据存储区输入名称。

  7. 点击创建

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

连接到 Google 日历

如需搜索 Google 日历中的数据,请按照以下步骤使用 Google Cloud 控制台创建连接器。

准备工作

  • 您必须使用计划连接的 Google Workspace 实例所用的同一账号登录 Google Cloud 控制台。 Vertex AI Search 使用您的 Google Workspace 客户 ID 连接到 Google 日历。
  • 为了在 AI 应用中强制执行数据源访问权限控制并保护数据,请确保您已配置身份提供方
  • 如果您使用安全控制措施,请注意下表中讨论的与 Google 日历中的数据相关的限制:

    安全控制 请注意以下事项
    数据驻留 (DRZ) AI 应用仅保证数据驻留在 Google Cloud。如需了解数据驻留和 Google 日历,请参阅 Google Workspace 合规性指南和文档,例如选择数据存储区域 数字主权
    客户管理的加密密钥 (CMEK) 您的密钥仅加密 Google Cloud内的数据。Cloud Key Management Service 控制措施不适用于存储在 Google 日历中的数据。
    Access Transparency Access Transparency 会记录 Google 员工对 Google Cloud 项目执行的操作。您还需要查看 Google Workspace 创建的 Access Transparency 日志。如需了解详情,请参阅 Google Workspace 管理员帮助文档中的 Access Transparency 日志事件

创建 Google 日历数据存储区

控制台

如需使用控制台使 Google 日历数据可供搜索,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 在导航菜单中,点击数据存储区

  3. 点击 创建数据存储区

  4. 选择数据源页面上,选择 Google 日历

  5. 为数据存储区选择一个区域。

  6. 为数据存储区输入名称。

  7. 点击创建

错误消息

下表介绍了使用此 Google 数据源时可能会遇到的错误消息,包括 HTTP 错误代码和建议的问题排查步骤。

错误代码 错误消息 说明 问题排查
403 (Permission Denied) Google Workspace 数据存储区不支持使用服务账号凭据进行搜索。 被搜索的引擎具有 Google Workspace 数据存储区,并且传递的凭据是服务账号的凭据。不支持使用服务账号凭据在 Google Workspace 数据存储区中进行搜索。 使用用户凭据调用搜索,或从引擎中移除 Google Workspace 数据存储区。
403 (Permission Denied) Google Workspace 数据存储区不支持个人账号。 搜索是使用消费者账号 (@gmail.com) 凭据调用的,而 Google Workspace 数据存储区不支持这种凭据。 从引擎中移除 Google Workspace 数据存储区,或使用受管理的 Google 账号。
403 (Permission Denied) Datastore 的客户 ID 不匹配 只有与 Google Workspace 数据存储区属于同一组织的用户才能进行搜索。 从引擎中移除 Google Workspace 数据存储区,或者联系支持人员(如果用户和 Google Workspace 数据存储区应位于不同的组织中)。
400(参数无效) Engine 不能同时包含默认和共享的 Google 云端硬盘数据存储区。 您无法将包含所有云端硬盘(默认)的数据存储区和包含特定共享云端硬盘的数据存储区连接到同一应用。 如需将新的 Google 云端硬盘数据源与应用相关联,请先取消关联不需要的数据存储区,然后添加要使用的新数据存储区。

后续步骤

  • 如需将数据存储区与应用相关联,请按照创建搜索应用中的说明创建应用,然后选择数据存储区。

  • 如需在设置好应用和数据存储区后获取搜索结果,请参阅获取搜索结果

连接到 Google 群组

如需搜索 Google 群组中的数据,请按以下步骤使用 Google Cloud 控制台创建连接器。

准备工作:

  • 您必须使用计划连接的 Google Workspace 实例所用的同一账号登录 Google Cloud 控制台。 Vertex AI Search 使用您的 Google Workspace 客户 ID 连接到 Google 群组。

  • 为了在 AI 应用中强制执行数据源访问权限控制并保护数据,请确保您已配置身份提供方

  • 如果您使用安全控制措施,请注意下表中讨论的与 Google 群组中的数据相关的限制:

    安全控制 请注意以下事项
    数据驻留 (DRZ) AI 应用仅保证数据驻留在 Google Cloud。如需了解数据驻留和 Google 群组,请参阅 Google Workspace 合规性指南和文档,例如选择数据存储区域 数字主权
    客户管理的加密密钥 (CMEK) 您的密钥仅加密 Google Cloud内的数据。Cloud Key Management Service 控制措施不适用于存储在 Google 群组中的数据。
    Access Transparency Access Transparency 会记录 Google 员工对 Google Cloud 项目执行的操作。您还需要查看 Google Workspace 创建的 Access Transparency 日志。如需了解详情,请参阅 Google Workspace 管理员帮助文档中的 Access Transparency 日志事件

控制台

如需使用控制台使 Google 群组数据可供搜索,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 前往数据存储区页面。

  3. 点击新数据存储区

  4. 来源页面上,选择 Google 群组

  5. 为数据存储区选择一个区域。

  6. 为数据存储区输入名称。

  7. 点击创建。注入过程可能需要几分钟到几小时才能完成,具体取决于数据的大小。至少等待一小时,然后再使用数据存储区进行搜索。

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

从 Cloud SQL 导入

如需从 Cloud SQL 中注入数据,请按以下步骤操作,设置 Cloud SQL 访问权限、创建数据存储区并注入数据。

为 Cloud SQL 实例设置临时存储桶访问权限

从 Cloud SQL 提取数据时,数据会先暂存到 Cloud Storage 存储桶。请按照以下步骤授予 Cloud SQL 实例对 Cloud Storage 存储分区的访问权限。

  1. 在 Google Cloud 控制台中,前往 SQL 页面。

    SQL

  2. 点击您计划从中导入数据的 Cloud SQL 实例。

  3. 复制实例的服务账号的标识符,类似于电子邮件地址,例如 p9876-abcd33f@gcp-sa-cloud-sql.iam.gserviceaccount.com

  4. 前往 IAM 和管理页面。

    IAM 和管理

  5. 点击授予访问权限

  6. 新的主账号中,输入实例的服务账号标识符,然后选择 Cloud Storage > Storage Admin 角色。

  7. 点击保存

下一步:

设置从其他项目访问 Cloud SQL

如需向 Vertex AI Search 授予对其他项目中的 Cloud SQL 数据的访问权限,请按以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为您的 Vertex AI Search 项目编号,然后复制代码块的内容。以下是您的 Vertex AI Search 服务账号标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com`
    
  2. 前往 IAM 和管理页面。

    IAM 和管理

  3. IAM 和管理页面上切换到 Cloud SQL 项目,然后点击授予访问权限

  4. 新的主账号中,输入服务账号的标识符,然后选择 Cloud SQL > Cloud SQL Viewer 角色。

  5. 点击保存

接下来,请参阅从 Cloud SQL 导入数据

从 Cloud SQL 导入数据

控制台

如需使用控制台从 Cloud SQL 中注入数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 前往数据存储区页面。

  3. 点击新数据存储区

  4. 来源页面上,选择 Cloud SQL

  5. 指定您计划导入的数据的项目 ID、实例 ID、数据库 ID 和表 ID。

  6. 点击浏览,选择要将数据导出到的中间 Cloud Storage 位置,然后点击选择。或者,直接在 gs:// 字段中输入位置。

  7. 选择是否启用无服务器导出。无服务器导出功能会产生额外费用。如需了解无服务器导出,请参阅 Cloud SQL 文档中的最大限度地降低导出对性能的影响

  8. 点击继续

  9. 为数据存储区选择一个区域。

  10. 为数据存储区输入名称。

  11. 点击创建

  12. 如需查看数据注入状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详情。 当活动标签页上的“状态”列从正在进行更改为导入已完成时,表示提取已完成。

    注入过程可能需要几分钟或几小时才能完成,具体取决于数据的大小。

REST

如需使用命令行创建数据存储区并从 Cloud SQL 中注入数据,请按以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
    }'
    

    替换以下内容:

    • PROJECT_ID:您的项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名称。这可能会显示在 Google Cloud 控制台中。
  2. 从 Cloud SQL 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "cloudSqlSource": {
          "projectId": "SQL_PROJECT_ID",
          "instanceId": "INSTANCE_ID",
          "databaseId": "DATABASE_ID",
          "tableId": "TABLE_ID",
          "gcsStagingDir": "STAGING_DIRECTORY"
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • SQL_PROJECT_ID:您的 Cloud SQL 项目的 ID。
    • INSTANCE_ID:Cloud SQL 实例的 ID。
    • DATABASE_ID:Cloud SQL 数据库的 ID。
    • TABLE_ID:Cloud SQL 表的 ID。
    • STAGING_DIRECTORY:可选。Cloud Storage 目录,例如 gs://<your-gcs-bucket>/directory/import_errors
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 Cloud SQL 到数据存储区的增量数据刷新。此方法会执行 upsert 操作,即添加新文档,并将现有文档替换为具有相同 ID 的更新文档。 指定 FULL 会导致数据存储区中的文档完全重新设置基准。换句话说,系统会将新文档和更新后的文档添加到您的数据存储区,并从您的数据存储区中移除 Cloud SQL 中不存在的文档。如果您想自动删除不再需要的文档,FULL 模式会很有帮助。

Python

如需了解详情,请参阅 AI Applications Python API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# sql_project_id = "YOUR_SQL_PROJECT_ID"
# sql_instance_id = "YOUR_SQL_INSTANCE_ID"
# sql_database_id = "YOUR_SQL_DATABASE_ID"
# sql_table_id = "YOUR_SQL_TABLE_ID"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    cloud_sql_source=discoveryengine.CloudSqlSource(
        project_id=sql_project_id,
        instance_id=sql_instance_id,
        database_id=sql_database_id,
        table_id=sql_table_id,
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

从 Spanner 导入

如需从 Spanner 中注入数据,请按照以下步骤操作,使用 Google Cloud 控制台或 API 创建数据存储区并注入数据。

设置从其他项目访问 Spanner

如果您的 Spanner 数据与 Vertex AI Search 位于同一项目中,请跳至从 Spanner 导入数据

如需向 Vertex AI Search 授予对其他项目中 Spanner 数据的访问权限,请按以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为您的 Vertex AI Search 项目编号,然后复制此代码块的内容。以下是您的 Vertex AI Search 服务账号标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com
    
  2. 前往 IAM 和管理页面。

    IAM 和管理

  3. IAM 和管理页面上切换到您的 Spanner 项目,然后点击授予访问权限

  4. 新的主账号中,输入服务账号的标识符,然后选择以下选项之一:

    • 如果您在导入期间不使用 Data Boost,请选择 Cloud Spanner > Cloud Spanner Database Reader 角色。
    • 如果您计划在导入期间使用 Data Boost,请选择 Cloud Spanner > Cloud Spanner Database Admin 角色,或具有 Cloud Spanner Database Readerspanner.databases.useDataBoost 权限的自定义角色。 如需了解 Data Boost,请参阅 Spanner 文档中的 Data Boost 概览
  5. 点击保存

接下来,请参阅从 Spanner 导入数据

从 Spanner 导入数据

控制台

如需使用控制台从 Spanner 中注入数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 前往数据存储区页面。

  3. 点击新数据存储区

  4. 来源页面上,选择 Cloud Spanner

  5. 指定您计划导入的数据的项目 ID、实例 ID、数据库 ID 和表 ID。

  6. 选择是否启用 Data Boost。如需了解 Data Boost,请参阅 Spanner 文档中的 Data Boost 概览

  7. 点击继续

  8. 为数据存储区选择一个区域。

  9. 为数据存储区输入名称。

  10. 点击创建

  11. 如需查看数据注入状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详情。 当活动标签页上的“状态”列从正在进行更改为导入已完成时,表示提取已完成。

    注入过程可能需要几分钟或几小时才能完成,具体取决于数据的大小。

REST

如需使用命令行创建数据存储区并从 Spanner 中注入数据,请按以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
      "contentConfig": "CONTENT_REQUIRED",
    }'
    

    替换以下内容:

    • PROJECT_ID:Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名称。这可能会显示在 Google Cloud 控制台中。
  2. 从 Spanner 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "cloudSpannerSource": {
          "projectId": "SPANNER_PROJECT_ID",
          "instanceId": "INSTANCE_ID",
          "databaseId": "DATABASE_ID",
          "tableId": "TABLE_ID",
          "enableDataBoost": "DATA_BOOST_BOOLEAN"
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。
    • SPANNER_PROJECT_ID:您的 Spanner 项目的 ID。
    • INSTANCE_ID:您的 Spanner 实例的 ID。
    • DATABASE_ID:您的 Spanner 数据库的 ID。
    • TABLE_ID:Spanner 表的 ID。
    • DATA_BOOST_BOOLEAN:可选。是否开启 Data Boost。 如需了解 Data Boost,请参阅 Spanner 文档中的 Data Boost 概览
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 Spanner 到数据存储区的数据增量刷新。此方法会执行 upsert 操作,即添加新文档,并将现有文档替换为具有相同 ID 的更新文档。指定 FULL 会导致数据存储区中的文档进行完全重新定位。换句话说,系统会将新文档和更新后的文档添加到数据存储区,并从数据存储区中移除 Spanner 中不存在的文档。如果您想自动删除不再需要的文档,FULL 模式会很有帮助。
    • AUTO_GENERATE_IDS:可选。指定是否自动生成文档 ID。如果设置为 true,则根据载荷的哈希值生成文档 ID。请注意,生成的文档 ID 在多次导入时可能不会保持一致。如果您在多次导入时自动生成 ID,Google 强烈建议您将 reconciliationMode 设置为 FULL,以保持文档 ID 的一致性。

    • ID_FIELD:可选。指定哪些字段是文档 ID。

Python

如需了解详情,请参阅 AI Applications Python API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# spanner_project_id = "YOUR_SPANNER_PROJECT_ID"
# spanner_instance_id = "YOUR_SPANNER_INSTANCE_ID"
# spanner_database_id = "YOUR_SPANNER_DATABASE_ID"
# spanner_table_id = "YOUR_SPANNER_TABLE_ID"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    spanner_source=discoveryengine.SpannerSource(
        project_id=spanner_project_id,
        instance_id=spanner_instance_id,
        database_id=spanner_database_id,
        table_id=spanner_table_id,
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

从 Firestore 导入

如需从 Firestore 中注入数据,请按以下步骤操作,使用 Google Cloud 控制台或 API 创建数据存储区并注入数据。

如果您的 Firestore 数据与 Vertex AI Search 位于同一项目中,请前往从 Firestore 导入数据

如果您的 Firestore 数据与 Vertex AI Search 项目位于不同的项目中,请参阅设置 Firestore 访问权限

设置从其他项目访问 Firestore

如需向 Vertex AI Search 授予对其他项目中 Firestore 数据的访问权限,请按以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为您的 Vertex AI Search 项目编号,然后复制此代码块的内容。以下是您的 Vertex AI Search 服务账号标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com
    
  2. 前往 IAM 和管理页面。

    IAM 和管理

  3. IAM 和管理页面上,切换到您的 Firestore 项目,然后点击授予访问权限

  4. 新的主账号中,输入实例的服务账号标识符,然后选择 Datastore > Cloud Datastore Import Export Admin 角色。

  5. 点击保存

  6. 切换回 Vertex AI Search 项目。

接下来,前往从 Firestore 导入数据

从 Firestore 导入数据

控制台

如需使用控制台从 Firestore 中注入数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 前往数据存储区页面。

  3. 点击新数据存储区

  4. 来源页面上,选择 Firestore

  5. 指定您计划导入的数据的项目 ID、数据库 ID 和集合 ID。

  6. 点击继续

  7. 为数据存储区选择一个区域。

  8. 为数据存储区输入名称。

  9. 点击创建

  10. 如需查看数据注入状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详情。 当活动标签页上的“状态”列从正在进行更改为导入已完成时,表示提取已完成。

    注入过程可能需要几分钟或几小时才能完成,具体取决于数据的大小。

REST

如需使用命令行创建数据存储区并从 Firestore 中注入数据,请按以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
    }'
    

    替换以下内容:

    • PROJECT_ID:您的项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名称。这可能会显示在 Google Cloud 控制台中。
  2. 从 Firestore 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "firestoreSource": {
          "projectId": "FIRESTORE_PROJECT_ID",
          "databaseId": "DATABASE_ID",
          "collectionId": "COLLECTION_ID",
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • FIRESTORE_PROJECT_ID:您的 Firestore 项目的 ID。
    • DATABASE_ID:您的 Firestore 数据库的 ID。
    • COLLECTION_ID:Firestore 集合的 ID。
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 Firestore 到数据存储区的数据增量刷新。此方法会执行 upsert 操作,即添加新文档,并将现有文档替换为具有相同 ID 的更新文档。 指定 FULL 会导致数据存储区中的文档完全重新设置基准。换句话说,系统会将新文档和更新后的文档添加到数据存储区,并从数据存储区中移除 Firestore 中不存在的文档。如果您想自动删除不再需要的文档,FULL 模式会很有帮助。
    • AUTO_GENERATE_IDS:可选。指定是否自动生成文档 ID。如果设置为 true,则根据载荷的哈希值生成文档 ID。请注意,生成的文档 ID 在多次导入时可能不会保持一致。如果您在多次导入时自动生成 ID,Google 强烈建议您将 reconciliationMode 设置为 FULL,以保持文档 ID 的一致性。
    • ID_FIELD:可选。指定哪些字段是文档 ID。

Python

如需了解详情,请参阅 AI Applications Python API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# firestore_project_id = "YOUR_FIRESTORE_PROJECT_ID"
# firestore_database_id = "YOUR_FIRESTORE_DATABASE_ID"
# firestore_collection_id = "YOUR_FIRESTORE_COLLECTION_ID"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    firestore_source=discoveryengine.FirestoreSource(
        project_id=firestore_project_id,
        database_id=firestore_database_id,
        collection_id=firestore_collection_id,
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

从 Bigtable 导入

如需从 Bigtable 中注入数据,请按以下步骤操作,使用 API 创建数据存储区并注入数据。

设置 Bigtable 访问权限

如需向 Vertex AI Search 授予对其他项目中的 Bigtable 数据的访问权限,请按照以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为您的 Vertex AI Search 项目编号,然后复制此代码块的内容。以下是您的 Vertex AI Search 服务账号标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com`
    
  2. 前往 IAM 和管理页面。

    IAM 和管理

  3. IAM 和管理页面上,切换到您的 Bigtable 项目,然后点击授予访问权限

  4. 新的主账号中,输入实例的服务账号标识符,然后选择 Bigtable > Bigtable Reader 角色。

  5. 点击保存

  6. 切换回 Vertex AI Search 项目。

接下来,请参阅从 Bigtable 导入数据

从 Bigtable 导入数据

REST

如需使用命令行创建数据存储区并从 Bigtable 中注入数据,请按以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
    }'
    

    替换以下内容:

    • PROJECT_ID:您的项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名称。这可能会显示在 Google Cloud 控制台中。
  2. 从 Bigtable 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "bigtableSource ": {
          "projectId": "BIGTABLE_PROJECT_ID",
          "instanceId": "INSTANCE_ID",
          "tableId": "TABLE_ID",
          "bigtableOptions": {
            "keyFieldName": "KEY_FIELD_NAME",
            "families": {
              "key": "KEY",
              "value": {
                "fieldName": "FIELD_NAME",
                "encoding": "ENCODING",
                "type": "TYPE",
                "columns": [
                  {
                    "qualifier": "QUALIFIER",
                    "fieldName": "FIELD_NAME",
                    "encoding": "COLUMN_ENCODING",
                    "type": "COLUMN_VALUES_TYPE"
                  }
                ]
              }
             }
             ...
          }
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • BIGTABLE_PROJECT_ID:您的 Bigtable 项目的 ID。
    • INSTANCE_ID:您的 Bigtable 实例的 ID。
    • TABLE_ID:Bigtable 表的 ID。
    • KEY_FIELD_NAME:可选,但建议填写。在将数据提取到 Vertex AI Search 后,用于行键值的字段名称。
    • KEY:必填。列族键的字符串值。
    • ENCODING:可选。当类型不是 STRING 时,值的编码模式。您可以在 columns 中列出特定列并为其指定编码,从而针对该列替换此设置。
    • COLUMN_TYPE:可选。相应列族中值的类型。
    • QUALIFIER:必填。列的限定符。
    • FIELD_NAME:可选,但建议填写。将此列提取到 Vertex AI Search 后要使用的字段名称。
    • COLUMN_ENCODING:可选。当类型不是 STRING 时,特定列的值的编码模式。
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 Bigtable 到数据存储区的数据增量刷新。此方法会执行 upsert 操作,即添加新文档,并将现有文档替换为具有相同 ID 的更新文档。指定 FULL 会导致数据存储区中的文档完全重新定位。换句话说,系统会将新文档和更新后的文档添加到您的数据存储区,并从您的数据存储区中移除 Bigtable 中不存在的文档。如果您想自动删除不再需要的文档,FULL 模式会很有帮助。
    • AUTO_GENERATE_IDS:可选。指定是否自动生成文档 ID。如果设置为 true,则根据载荷的哈希值生成文档 ID。请注意,生成的文档 ID 在多次导入时可能不会保持一致。如果您在多次导入时自动生成 ID,Google 强烈建议您将 reconciliationMode 设置为 FULL,以保持文档 ID 的一致性。

      仅当 bigquerySource.dataSchema 设置为 custom 时,才指定 autoGenerateIds。否则,系统将返回 INVALID_ARGUMENT 错误。如果您未指定 autoGenerateIds 或将其设置为 false,则必须指定 idField。否则,文档将无法导入。

    • ID_FIELD:可选。指定哪些字段是文档 ID。

Python

如需了解详情,请参阅 AI Applications Python API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# bigtable_project_id = "YOUR_BIGTABLE_PROJECT_ID"
# bigtable_instance_id = "YOUR_BIGTABLE_INSTANCE_ID"
# bigtable_table_id = "YOUR_BIGTABLE_TABLE_ID"

#  For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

bigtable_options = discoveryengine.BigtableOptions(
    families={
        "family_name_1": discoveryengine.BigtableOptions.BigtableColumnFamily(
            type_=discoveryengine.BigtableOptions.Type.STRING,
            encoding=discoveryengine.BigtableOptions.Encoding.TEXT,
            columns=[
                discoveryengine.BigtableOptions.BigtableColumn(
                    qualifier="qualifier_1".encode("utf-8"),
                    field_name="field_name_1",
                ),
            ],
        ),
        "family_name_2": discoveryengine.BigtableOptions.BigtableColumnFamily(
            type_=discoveryengine.BigtableOptions.Type.INTEGER,
            encoding=discoveryengine.BigtableOptions.Encoding.BINARY,
        ),
    }
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    bigtable_source=discoveryengine.BigtableSource(
        project_id=bigtable_project_id,
        instance_id=bigtable_instance_id,
        table_id=bigtable_table_id,
        bigtable_options=bigtable_options,
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

从 AlloyDB for PostgreSQL 导入

如需从 AlloyDB for PostgreSQL 中注入数据,请按照以下步骤操作,使用 Google Cloud 控制台或 API 创建数据存储区并注入数据。

如果您的 AlloyDB for PostgreSQL 数据与 Vertex AI Search 项目位于同一项目中,请前往从 AlloyDB for PostgreSQL 导入数据

如果您的 AlloyDB for PostgreSQL 数据与 Vertex AI Search 项目位于不同的项目中,请参阅设置 AlloyDB for PostgreSQL 访问权限

设置从其他项目访问 AlloyDB for PostgreSQL

如需向 Vertex AI Search 授予对其他项目中 AlloyDB for PostgreSQL 数据的访问权限,请按以下步骤操作:

  1. 将以下 PROJECT_NUMBER 变量替换为您的 Vertex AI Search 项目编号,然后复制此代码块的内容。以下是您的 Vertex AI Search 服务账号标识符:

    service-PROJECT_NUMBER@gcp-sa-discoveryengine.iam.gserviceaccount.com
    
  2. 切换到 AlloyDB for PostgreSQL 数据所在的 Google Cloud 项目。

  3. 转到 IAM 页面。

    IAM

  4. 点击授予访问权限

  5. 对于新主账号,请输入 Vertex AI Search 服务账号标识符,然后选择 Cloud AlloyDB > Cloud AlloyDB Admin 角色。

  6. 点击保存

  7. 切换回 Vertex AI Search 项目。

接下来,请参阅从 AlloyDB for PostgreSQL 导入数据

从 AlloyDB for PostgreSQL 导入数据

控制台

如需使用控制台从 AlloyDB for PostgreSQL 中注入数据,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI 应用

  2. 在导航菜单中,点击数据存储区

  3. 点击创建数据存储区

  4. 来源页面上,选择 AlloyDB

  5. 指定您计划导入的数据的项目 ID、位置 ID、集群 ID、数据库 ID 和表 ID。

  6. 点击继续

  7. 为数据存储区选择一个区域。

  8. 为数据存储区输入名称。

  9. 点击创建

  10. 如需查看数据注入状态,请前往数据存储区页面,然后点击数据存储区名称,在其数据页面上查看相关详情。 当活动标签页上的“状态”列从正在进行更改为导入已完成时,表示提取已完成。

    注入过程可能需要几分钟或几小时才能完成,具体取决于数据的大小。

REST

如需使用命令行创建数据存储区并从 AlloyDB for PostgreSQL 中注入数据,请按以下步骤操作:

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"],
    }'
    

    替换以下内容:

    • PROJECT_ID:您的项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • DISPLAY_NAME:数据存储区的显示名称。这可能会显示在 Google Cloud 控制台中。
  2. 从 AlloyDB for PostgreSQL 导入数据。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents:import" \
      -d '{
        "alloydbSource": {
          "projectId": "ALLOYDB_PROJECT_ID",
          "locationId": "LOCATION_ID",
          "clusterId": "CLUSTER_ID",
          "databaseId": "DATABASE_ID",
          "tableId": "TABLE_ID",
        },
        "reconciliationMode": "RECONCILIATION_MODE",
        "autoGenerateIds": "AUTO_GENERATE_IDS",
        "idField": "ID_FIELD",
      }'
    

    替换以下内容:

    • PROJECT_ID:Vertex AI Search 项目的 ID。
    • DATA_STORE_ID:数据存储区的 ID。ID 只能包含小写字母、数字、下划线和连字符。
    • ALLOYDB_PROJECT_ID:AlloyDB for PostgreSQL 项目的 ID。
    • LOCATION_ID:AlloyDB for PostgreSQL 位置的 ID。
    • CLUSTER_ID:AlloyDB for PostgreSQL 集群的 ID。
    • DATABASE_ID:AlloyDB for PostgreSQL 数据库的 ID。
    • TABLE_ID:AlloyDB for PostgreSQL 表的 ID。
    • RECONCILIATION_MODE:可选。值为 FULLINCREMENTAL。默认值为 INCREMENTAL。 指定 INCREMENTAL 会导致从 AlloyDB for PostgreSQL 到数据存储区的增量数据刷新。此方法会执行 upsert 操作,即添加新文档,并将现有文档替换为具有相同 ID 的更新文档。 指定 FULL 会导致数据存储区中的文档完全重新设置基准。换句话说,系统会将新文档和更新后的文档添加到数据存储区,并从数据存储区中移除 AlloyDB for PostgreSQL 中不存在的文档。如果您想自动删除不再需要的文档,FULL 模式会很有帮助。
    • AUTO_GENERATE_IDS:可选。指定是否自动生成文档 ID。如果设置为 true,则根据载荷的哈希值生成文档 ID。请注意,生成的文档 ID 在多次导入时可能不会保持一致。如果您在多次导入时自动生成 ID,Google 强烈建议您将 reconciliationMode 设置为 FULL,以保持文档 ID 的一致性。
    • ID_FIELD:可选。指定哪些字段是文档 ID。

Python

如需了解详情,请参阅 AI Applications Python API 参考文档

如需向 AI 应用进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

创建数据存储区


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"


def create_data_store_sample(
    project_id: str,
    location: str,
    data_store_id: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.DataStoreServiceClient(client_options=client_options)

    # The full resource name of the collection
    # e.g. projects/{project}/locations/{location}/collections/default_collection
    parent = client.collection_path(
        project=project_id,
        location=location,
        collection="default_collection",
    )

    data_store = discoveryengine.DataStore(
        display_name="My Data Store",
        # Options: GENERIC, MEDIA, HEALTHCARE_FHIR
        industry_vertical=discoveryengine.IndustryVertical.GENERIC,
        # Options: SOLUTION_TYPE_RECOMMENDATION, SOLUTION_TYPE_SEARCH, SOLUTION_TYPE_CHAT, SOLUTION_TYPE_GENERATIVE_CHAT
        solution_types=[discoveryengine.SolutionType.SOLUTION_TYPE_SEARCH],
        # TODO(developer): Update content_config based on data store type.
        # Options: NO_CONTENT, CONTENT_REQUIRED, PUBLIC_WEBSITE
        content_config=discoveryengine.DataStore.ContentConfig.CONTENT_REQUIRED,
    )

    request = discoveryengine.CreateDataStoreRequest(
        parent=parent,
        data_store_id=data_store_id,
        data_store=data_store,
        # Optional: For Advanced Site Search Only
        # create_advanced_site_search=True,
    )

    # Make the request
    operation = client.create_data_store(request=request)

    print(f"Waiting for operation to complete: {operation.operation.name}")
    response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    metadata = discoveryengine.CreateDataStoreMetadata(operation.metadata)

    # Handle the response
    print(response)
    print(metadata)

    return operation.operation.name

导入文档

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# alloy_db_project_id = "YOUR_ALLOY_DB_PROJECT_ID"
# alloy_db_location_id = "YOUR_ALLOY_DB_LOCATION_ID"
# alloy_db_cluster_id = "YOUR_ALLOY_DB_CLUSTER_ID"
# alloy_db_database_id = "YOUR_ALLOY_DB_DATABASE_ID"
# alloy_db_table_id = "YOUR_ALLOY_DB_TABLE_ID"

# For more information, refer to:
# https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
client_options = (
    ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
    if location != "global"
    else None
)

# Create a client
client = discoveryengine.DocumentServiceClient(client_options=client_options)

# The full resource name of the search engine branch.
# e.g. projects/{project}/locations/{location}/dataStores/{data_store_id}/branches/{branch}
parent = client.branch_path(
    project=project_id,
    location=location,
    data_store=data_store_id,
    branch="default_branch",
)

request = discoveryengine.ImportDocumentsRequest(
    parent=parent,
    alloy_db_source=discoveryengine.AlloyDbSource(
        project_id=alloy_db_project_id,
        location_id=alloy_db_location_id,
        cluster_id=alloy_db_cluster_id,
        database_id=alloy_db_database_id,
        table_id=alloy_db_table_id,
    ),
    # Options: `FULL`, `INCREMENTAL`
    reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL,
)

# Make the request
operation = client.import_documents(request=request)

print(f"Waiting for operation to complete: {operation.operation.name}")
response = operation.result()

# After the operation is complete,
# get information from operation metadata
metadata = discoveryengine.ImportDocumentsMetadata(operation.metadata)

# Handle the response
print(response)
print(metadata)

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

使用 API 上传结构化 JSON 数据

如需使用 API 直接上传 JSON 文档或对象,请按以下步骤操作。

在导入数据之前,请准备数据以便提取

REST

如需使用命令行创建数据存储区并导入结构化 JSON 数据,请按以下步骤操作。

  1. 创建数据存储区。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores?dataStoreId=DATA_STORE_ID" \
    -d '{
      "displayName": "DATA_STORE_DISPLAY_NAME",
      "industryVertical": "GENERIC",
      "solutionTypes": ["SOLUTION_TYPE_SEARCH"]
    }'
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • DATA_STORE_ID:要创建的 Vertex AI Search 数据存储区的 ID。此 ID 只能包含小写字母、数字、下划线和连字符。
    • DATA_STORE_DISPLAY_NAME:您要创建的 Vertex AI Search 数据存储区的显示名称。
  2. 导入结构化数据。

    您可以使用多种方法来上传数据,包括:

    • 上传 JSON 文档。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents?documentId=DOCUMENT_ID" \
      -d '{
        "jsonData": "JSON_DOCUMENT_STRING"
      }'
      

      替换以下内容:

      • DOCUMENT_ID:文档的唯一 ID。 此 ID 最多可包含 63 个字符,并且只能包含小写字母、数字、下划线和连字符。
      • JSON_DOCUMENT_STRING:JSON 文档(以单个字符串的形式)。此文件必须符合您在上一步中提供的 JSON 架构,例如:

        { \"title\": \"test title\", \"categories\": [\"cat_1\", \"cat_2\"], \"uri\": \"test uri\"}
        
    • 上传 JSON 对象。

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents?documentId=DOCUMENT_ID" \
      -d '{
        "structData": JSON_DOCUMENT_OBJECT
      }'
      

      JSON_DOCUMENT_OBJECT 替换为 JSON 文档(以 JSON 对象的形式)。此文件必须符合您在上一步中提供的 JSON 架构,例如:

      ```json
      {
        "title": "test title",
        "categories": [
          "cat_1",
          "cat_2"
        ],
        "uri": "test uri"
      }
      ```
      
    • 使用 JSON 文档进行更新。

      curl -X PATCH \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents/DOCUMENT_ID" \
      -d '{
        "jsonData": "JSON_DOCUMENT_STRING"
      }'
      
    • 使用 JSON 对象进行更新。

      curl -X PATCH \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/branches/0/documents/DOCUMENT_ID" \
      -d '{
        "structData": JSON_DOCUMENT_OBJECT
      }'
      

后续步骤

  • 如需将数据存储区附加到应用,请按照创建搜索应用中的步骤创建应用并选择数据存储区。

  • 如需预览在设置应用和数据存储区后搜索结果的显示方式,请参阅获取搜索结果

排查数据注入问题

如果您在数据注入方面遇到问题,请查看以下提示:

  • 如果您使用的是客户管理的加密密钥,并且数据导入失败(并显示错误消息 The caller does not have permission),请确保已向 Cloud Storage 服务代理授予密钥的 CryptoKey Encrypter/Decrypter IAM 角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter)。如需了解详情,请参阅“客户管理的加密密钥”中的准备工作

  • 如果您使用的是高级网站索引编制功能,并且数据存储区的文档使用量远低于预期,请检查您为索引编制指定的网址模式,确保指定的网址模式涵盖您要编入索引的网页,并根据需要进行扩展。例如,如果您使用了 *.en.example.com/*,可能需要向您希望编入索引的网站添加 *.example.com/*

使用 Terraform 创建数据存储区

您可以使用 Terraform 创建空数据存储区。创建空数据存储区后,您可以使用 Google Cloud 控制台或 API 命令将数据注入到数据存储区中。

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

如需使用 Terraform 创建空数据存储区,请参阅 google_discovery_engine_data_store