从 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 读取密文。如需了解详情,请参阅管理对密文的访问权限

启用并配置 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 向量搜索结果联接起来。

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 集群中配置的基本身份验证(用户名和密码)。

后续步骤