您可以使用 AlloyDB 中的外部搜索集成功能访问和搜索存储在 OpenSearch 中的数据。通过此集成,您可以将 OpenSearch 索引与 AlloyDB 中的关系表联接,而无需移动或复制数据。
准备工作
在开始之前,请确保您已完成以下操作:
创建集群。
在主 AlloyDB 实例上启用出站连接。
创建和配置 OpenSearch,使其具有可访问的公共端点。
在 OpenSearch 集群上启用安全插件,并在内部用户数据库中创建拥有只读权限的用户。AlloyDB 会使用这些凭据访问您的 OpenSearch 集群。
在 Secret Manager 中存储 OpenSearch 凭证
AlloyDB 会在 Secret Manager 中存储和读取您的 OpenSearch 凭据。如需详细了解如何使用 Secret Manager,请参阅使用 Secret Manager 创建和访问 Secret。
确保您的 AlloyDB 服务账号具有 Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) 角色,以便从 Secret Manager 读取 Secret。如需了解详情,请参阅使用 Secret Manager 创建和访问 Secret。
启用并配置 external_search_fdw 扩展程序
如需开始与 OpenSearch 集成,请配置通过外部数据服务器访问 OpenSearch 集群。
启用
external_search_fdw扩展程序。CREATE EXTENSION external_search_fdw;为 OpenSearch 集群创建服务器。
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 'Basic', secret_path 'SECRET_PATH' );执行以下变量替换操作:
OPENSEARCH_SERVER_NAME:外部数据服务器的名称。例如opensearch。OPENSEARCH_SERVER_HOST_PORT:OpenSearch 集群的公开网址(端点)。SECRET_PATH:OpenSearch 身份验证凭证的 Secret Manager 路径。例如projects/123456789012/secrets/opensearch-credentials/versions/1。123456789012表示您的 Google Cloud 项目 ID。
为 OpenSearch 服务器定义 PostgreSQL 用户映射。请注意,PostgreSQL FDW 需要此用户映射才能正常运行。AlloyDB 使用 REST 授权标头进行身份验证。
CREATE USER MAPPING FOR CURRENT_USER SERVER OPENSEARCH_SERVER_NAME;将 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。
支持的数据类型
AlloyDB 支持以下 OpenSearch 数据类型:
| 数据类型 | AlloyDB 类型 |
|---|---|
alias
|
alias 引用的字段的 PostgreSQL 类型
|
binary
|
bytea
|
boolean
|
BOOLEAN
|
|
|
SMALLINT
|
date
|
TIMESTAMPTZ
|
DOUBLE PRECISION
|
|
REAL
|
|
integer
|
INTEGER
|
long
|
BIGINT
|
jsonb
|
|
|
|
TEXT
|
unsigned_long
|
NUMERIC
|
查询 OpenSearch 数据
AlloyDB 会接收 SQL 查询,并将其转换为 OpenSearch REST API 查询。
如需查询 OpenSearch 数据,您可以使用以下选项:
- 标准 SQL 查询
- 查询 DSL
- 混合搜索
标准 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 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 的查询。例如,"opensearch_field_name:\"cloud databases\""会在opensearch_field_name字段中搜索短语“cloud databases”。
下推示例
为了提高查询效率,AlloyDB 会尝试将查询的以下方面直接下推到对 OpenSearch 进行的 API 调用中:
SELECT个字段WHERE个过滤条件ORDER BY种排序方式LIMIT
如需查看说明 AlloyDB 能够和不能下推哪些方面的示例查询,请参阅下表。
| 查询类型 | 查询示例 | 下推的查询元素 |
|---|---|---|
| 未过滤的查询 |
SELECT id, body FROM opensearch_table ORDER BY metadata <@> 'body:foo' DESC LIMIT 10; |
|
| 完全匹配文本 |
SELECT id, body FROM opensearch_table WHERE body = 'foo' LIMIT 10; |
|
| 单字段表达式 |
SELECT id, body FROM opensearch_table WHERE id > 10 ORDER BY metadata <@> 'body:foo' LIMIT 10; |
|
| 常量表达式 |
SELECT id, body FROM opensearch_table WHERE id > (1+1) LIMIT 10; |
|
| 包含函数的表达式 |
SELECT id, body FROM opensearch_table WHERE id > CEIL(3.14) LIMIT 10; |
|
| 多字段表达式 |
SELECT id, body FROM opensearch_table WHERE dbl_field < flt_field LIMIT 10; |
|
| 分数过滤 |
SELECT id, body, (metadata <@> 'body:bar') AS score FROM opensearch_table WHERE score > 0.5 ORDER by score desc LIMIT 10; |
|
LIKE 和类似运算符 |
SELECT id, body FROM opensearch_table WHERE id > 10 AND body LIKE '%foo%' LIMIT 10; |
|
| 原始查询 |
SELECT id, body FROM opensearch_table WHERE id < 10 ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC LIMIT 10; |
|
问题排查
如果您在查询 OpenSearch 集群时遇到身份验证或连接问题,请检查以下常见原因:
- HTTP 401 或 403 身份验证错误:验证 Secret Manager 中的 OpenSearch 密钥是否包含格式为
username:password的字符串,以及您的 AlloyDB 服务账号是否具有 Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) 角色。 - 连接超时:验证您的主 AlloyDB 实例上是否已启用出站公共 IP 连接,以及您的 OpenSearch 防火墙是否允许在指定端口上建立传入连接。
限制
在将 AlloyDB 连接到 OpenSearch 之前,请了解以下限制:
OpenSearch 集成仅适用于 PostgreSQL 主要版本
17及更高版本。AlloyDB 会读取 OpenSearch 数据,但不会向其写入数据。
AlloyDB 不会自动将数据库数据编入 OpenSearch 索引。您负责填充 OpenSearch 索引,并维护 AlloyDB 中的数据与 OpenSearch 中的索引数据之间的一致性。
AlloyDB 不会自动与 OpenSearch 同步架构。如果 OpenSearch 索引架构发生更改,您必须手动更新相应 PostgreSQL 外部表的架构。
不支持专用 OpenSearch 类型,例如
geo_point。如需查看受支持数据类型的完整列表,请参阅受支持的数据类型。您必须使用在 OpenSearch 集群中配置的基本身份验证(用户名和密码)。
后续步骤
- 了解如何访问 Elasticsearch 数据。
- 了解如何访问 Solr 数据。
- 了解如何运行混合向量相似性搜索。