您可以使用 AlloyDB Omni 中的外部搜索集成来访问和搜索存储在 OpenSearch 中的数据。通过此集成,您可以在现有 OpenSearch 索引和关系表之间执行联合搜索,而无需复制或移动数据。
准备工作
在开始之前,请完成以下步骤:
- 使用容器编排器安装 AlloyDB Omni。
- 部署和配置具有可访问公共端点的 OpenSearch。
- 在 OpenSearch 集群上启用安全插件,并在内部用户数据库中创建拥有只读权限的用户。AlloyDB Omni 会使用这些凭证访问您的 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 集群的访问权限。
连接到您的数据库并启用扩展程序:
CREATE EXTENSION external_search_fdw;创建外部服务器:
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。
为 OpenSearch 服务器定义用户映射:
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。
查询 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 集群中配置的基本身份验证(用户名和密码)。
后续步骤
了解如何访问 Elasticsearch 数据。
了解如何访问 Solr 数据。
了解如何运行混合向量相似性搜索。