从 AlloyDB Omni 访问 OpenSearch 数据

选择文档版本:

您可以使用 AlloyDB Omni 中的外部搜索集成来访问和搜索存储在 OpenSearch 中的数据。通过此集成,您可以在现有 OpenSearch 索引和关系表之间执行联合搜索,而无需复制或移动数据。

准备工作

在开始之前,请完成以下步骤:

在 Secret Manager 中存储 OpenSearch 凭证

AlloyDB Omni 会在 Secret Manager 中存储和读取 OpenSearch 凭据。对于基本 HTTP 身份验证,Secret Manager 中的 Secret 值必须是格式为 username:password 的字符串。如需详细了解如何使用 Secret Manager,请参阅使用 Secret Manager 创建和访问 Secret。

确保 AlloyDB Omni 使用的服务账号具有 secretmanager.secretAccessor 权限,可以从 Secret Manager 读取密文。如需了解详情,请参阅管理对 Secret 的访问权限。 如需在 Kubernetes 数据库集群上配置服务账号密钥 Secret,请参阅使用服务账号密钥创建 Kubernetes Secret 和使用 AlloyDB AI 创建数据库集群。

启用并配置 external_search_fdw 扩展程序

如需开始与 OpenSearch 集成,请通过外部数据服务器配置对 OpenSearch 集群的访问权限。

  1. 连接到您的数据库并启用扩展程序:

    CREATE EXTENSION external_search_fdw;
    
  2. 创建外部服务器:

    CREATE SERVER OPENSEARCH_SERVER_NAME
    FOREIGN DATA WRAPPER external_search_fdw
    OPTIONS (
      server 'OPENSEARCH_SERVER_HOST_PORT',
      search_provider 'opensearch',
      auth_mode 'secret_manager',
      auth_method 'AUTH_METHOD',
      secret_path 'SECRET_PATH'
    );
    

    执行以下变量替换操作:

    • OPENSEARCH_SERVER_NAME:外部数据服务器的名称。例如 opensearch。

    • OPENSEARCH_SERVER_HOST_PORT:OpenSearch 集群的公开网址。例如 https://search-my-domain.us-east-1.es.amazonaws.com:443。

    • AUTH_METHOD:要使用的身份验证类型。例如 Basic。

    • SECRET_PATH:OpenSearch 身份验证凭证的 Secret Manager 路径。例如 projects/PROJECT_ID/secrets/opensearch-credentials/versions/1。

  3. 为 OpenSearch 服务器定义用户映射:

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER OPENSEARCH_SERVER_NAME;
    
  4. 将 OpenSearch 索引的架构映射到 PostgreSQL 外部表:

    CREATE FOREIGN TABLE OPENSEARCH_FD_TABLE(
        metadata external_search_fdw_schema.OpaqueMetadata,
        OPENSEARCH_FIELDS)
           SERVER OPENSEARCH_SERVER_NAME
           OPTIONS(
                remote_table_name 'OPENSEARCH_INDEX_NAME'
           );
    

    执行以下变量替换操作:

    • OPENSEARCH_FD_TABLE:表示 OpenSearch 表的外部数据表的名称。例如 my-fd-opensearch-table。

    • OPENSEARCH_FIELDS:逗号分隔列表,其中每个条目都遵循 opensearch_field_name PG_DATA_TYPE 格式。如需查看支持的 OpenSearch 数据类型及其对应的 PostgreSQL 类型,请参阅支持的数据类型。

    • OPENSEARCH_INDEX_NAME:OpenSearch 索引的名称。例如 my-opensearch-index。

查询 OpenSearch 数据

AlloyDB Omni 会将 SQL 查询转换为 OpenSearch REST API 查询。

标准 SQL 查询

您可以将标准 SQL 与 Lucene 语法结合使用来编写搜索表达式。

SELECT id, body
FROM OPENSEARCH_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';

执行以下变量替换操作:

  • OPENSEARCH_FD_TABLE:表示 OpenSearch 表的外部数据表的名称。例如 my-fd-opensearch-table。

  • FILTER:(可选)要应用于 OpenSearch 查询的过滤条件。例如 a = 10 AND b < 105。

  • QUERY:要发送到 OpenSearch 的查询。例如 body:database。

查询 DSL

对于高级用例,请使用 OpenSearch JSON 样式的查询领域专用语言 (DSL)。

SELECT id, title
FROM OPENSEARCH_FD_TABLE
ORDER BY metadata <@> $${
  "query": {
    "bool": {
      "must": { "match": { "title": "opensearch" } },
      "filter": { "term": { "category": "software" } }
    }
  },
  "sort": [
    { "price": { "order": "desc" } }
  ]
}$$
LIMIT 1;

将 OPENSEARCH_FD_TABLE 替换为表示 OpenSearch 表的外部数据表的名称。例如 my-fd-opensearch-table。

如需对 OpenSearch 数据执行混合搜索,请将 OpenSearch 词元搜索结果与 AlloyDB Omni Vector Search 结果联接。

SELECT *
FROM ai.hybrid_search(
  ARRAY[
    '{"limit": LIMIT,
      "weight": WEIGHT,
      "table_name": "OPENSEARCH_FD_TABLE",
      "key_column": "id",
      "query_text_input": "QUERY"}'::jsonb
  ])
ORDER BY score DESC;

执行以下变量替换操作:

  • LIMIT:要返回的结果数。例如 10。

  • WEIGHT:此搜索条目对整体倒数排序融合 (RRF) 的贡献。例如 0.5。如果您不提供权重,则权重会均匀分布。如需了解详情,请参阅混合搜索函数参数。

  • OPENSEARCH_FD_TABLE:表示 OpenSearch 表的外部数据表的名称。例如 my-fd-opensearch-table。

  • QUERY:要发送到 OpenSearch 的查询。例如 body:database。

问题排查

如果您在查询 OpenSearch 集群时遇到身份验证或连接性问题,请检查以下方面:

  • HTTP 401 或 403 身份验证错误:验证 Secret Manager 中的 OpenSearch 密钥是否包含格式为 username:password 的字符串,以及您的服务账号是否具有 secretmanager.secretAccessor 权限。

  • 连接超时:验证 AlloyDB Omni 与 OpenSearch 端点之间的网络规则和防火墙配置。

限制

  • 只读:AlloyDB Omni 会读取 OpenSearch 数据,但不会向其写入数据。

  • 数据管理:AlloyDB Omni 不会自动将数据库数据编入 OpenSearch 索引。您负责填充 OpenSearch 索引,并保持 AlloyDB Omni 中的数据与 OpenSearch 中的索引数据之间的一致性。

  • 架构管理:AlloyDB Omni 不会自动与 OpenSearch 同步架构。如果 OpenSearch 索引架构发生更改,请手动更新相应 PostgreSQL 外部表的架构。

  • 不支持的类型:不支持专用 OpenSearch 类型,例如地理空间类型。

  • 身份验证:您必须使用在 OpenSearch 集群中配置的基本身份验证(用户名和密码)。

后续步骤