您可以使用 AlloyDB Omni 中的外部搜索集成功能,访问和搜索存储在 Apache Solr 中的数据。通过此集成,您可以将密集型全文搜索、复杂查询解析和高级分面工作负载从运营数据库分流到 Solr,从而缩短查询延迟时间并提高整体系统吞吐量。
准备工作
在开始之前,请完成以下步骤:
在 Secret Manager 中存储 Solr 凭据
AlloyDB Omni 会在 Secret Manager 中存储和读取您的 Solr 凭据。对于 HTTP 基本身份验证,Secret Manager 中 Secret 的值必须是采用 base64 编码的字符串,格式为 username:password。如需详细了解如何使用 Secret Manager,请参阅使用 Secret Manager 创建和访问 Secret。
确保 AlloyDB Omni 使用的服务账号具有 secretmanager.secretAccessor 权限,可以从 Secret Manager 读取密文。如需了解详情,请参阅管理对密文的访问权限。
启用并配置 external_search_fdw 扩展程序
若要开始与 Solr 集成,请通过外部数据服务器配置对 Solr 集群的访问权限。
连接到您的数据库并启用扩展程序:
CREATE EXTENSION external_search_fdw;创建外部服务器:
CREATE SERVER SOLR_SERVER_NAME FOREIGN DATA WRAPPER external_search_fdw OPTIONS ( server 'SOLR_SERVER_HOST_PORT', search_provider 'solr', auth_mode 'secret_manager', auth_method 'AUTH_METHOD', secret_path 'SECRET_PATH' );执行以下变量替换操作:
SOLR_SERVER_NAME:外部数据服务器的名称。例如solr。SOLR_SERVER_HOST_PORT: Solr 集群的面向公众的网址。例如https://node1.solr.test.com:8983。AUTH_METHOD:要使用的身份验证类型。例如Basic。SECRET_PATH:Solr 身份验证凭据的 Secret Manager 路径。例如projects/PROJECT_ID/secrets/apikey/versions/1。
为 Solr 服务器定义用户映射:
CREATE USER MAPPING FOR CURRENT_USER SERVER SOLR_SERVER_NAME;将 Solr 集合的架构映射到 PostgreSQL 外部表。
CREATE FOREIGN TABLE SOLR_FD_TABLE( metadata external_search_fdw_schema.OpaqueMetadata, SOLR_FIELDS) SERVER SOLR_SERVER_NAME OPTIONS( remote_table_name 'SOLR_COLLECTION_NAME', unique_key_sort_suffix 'UNIQUE_KEY_SORT_SUFFIX' );执行以下变量替换操作:
SOLR_FD_TABLE:表示 Solr 表的外部数据表的名称。例如my-fd-solr-table。SOLR_FIELDS:逗号分隔列表,其中每个条目都遵循solr_field_name PG_DATA_TYPE格式。如需查看支持的 Solr 数据类型及其对应的 PostgreSQL 类型,请参阅支持的数据类型。UNIQUE_KEY_SORT_SUFFIX:(可选)Solr 中的唯一键字段,或包含多个字段及其排序顺序的英文逗号分隔列表(例如myid0 ASC, myid1 DESC),用于分页。默认值为id。PG_DATA_TYPE:您要将该类型映射到的 PostgreSQL 类型。例如:TEXT适用于字符串数据。INTEGER,用于数值数据。
SOLR_COLLECTION_NAME:Solr 集合的名称。例如my-solr-collection。
查询 Solr 数据
AlloyDB Omni 会将 SQL 查询转换为 Solr REST API 查询。
标准 SQL 查询
对于搜索表达式,您可以使用标准 SQL 和 Lucene 语法。
SELECT id, body
FROM SOLR_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';
执行以下变量替换操作:
SOLR_FD_TABLE:表示 Solr 表的外部数据表的名称。例如my-fd-solr-table。FILTER:(可选)要应用于 Solr 查询的过滤条件。例如AND qubits < 105。QUERY:要发送给 Solr 的查询。例如body:database。
查询 DSL
对于高级使用情形(例如实现嵌套查询、自定义排序或复杂过滤),请使用 Solr JSON 样式的查询 DSL。
SELECT id, title
FROM SOLR_FD_TABLE
ORDER BY metadata <@> $${
"query": "title:solr",
"filter": ["category:software", "inStock:true"],
"sort": "price desc"
}$$
LIMIT 1;
将 SOLR_FD_TABLE 替换为表示 Solr 表的外部数据表的名称。例如 my-fd-solr-table。
混合搜索
如需对 Solr 数据执行混合搜索,请将 Solr 令牌搜索结果与 AlloyDB Omni 向量搜索结果联接起来。
SELECT *
FROM ai.hybrid_search(
ARRAY[
'{"limit": LIMIT,
"weight": WEIGHT,
"table_name": "SOLR_FD_TABLE",
"key_column": "id",
"query_text_input": "QUERY"}'::jsonb
])
ORDER BY score DESC;
执行以下变量替换操作:
LIMIT:要返回的结果数。例如10。WEIGHT:相应搜索条目对总体倒数排序融合 (RRF) 的贡献。例如0.5。如果您不提供权重,系统会均匀分配权重。如需了解详情,请参阅混合搜索函数参数。SOLR_FD_TABLE:表示 Solr 表的外部数据表的名称。例如my-fd-solr-table。QUERY:要发送给 Solr 的查询。例如body:database。
问题排查
如果您在查询 Solr 集群时遇到身份验证或连接问题,请检查以下各项:
- HTTP 401 或 403 身份验证错误:验证 Secret Manager 中的 Solr Secret 是否包含
username:password格式的 Base64 编码字符串,以及 AlloyDB Omni 使用的服务账号是否具有secretmanager.secretAccessor权限。 - 连接超时:验证 AlloyDB Omni 与 Solr 端点之间的网络规则和防火墙配置。
限制
- 只读:AlloyDB Omni 读取 Solr 数据,但不向 Solr 数据写入数据。
- 数据管理:AlloyDB Omni 不会自动将数据库数据编入 Solr 索引。您负责填充 Solr 集合,并保持 AlloyDB Omni 中的数据与 Solr 中的索引数据之间的一致性。
- 架构管理:AlloyDB Omni 不会自动将架构与 Solr 同步。如果您的 Solr 集合架构发生变化,请手动更新相应 PostgreSQL 外部表的架构。
- 不支持的类型:不支持专门的 Solr 类型,例如地理空间类型。
- 稳定排序:为了使分页正常运行,Solr 需要在排序表达式中使用唯一键。默认情况下,系统会使用
id字段。如需指定自定义字段或以逗号分隔列表形式指定的多个字段及其各自的排序顺序,请在创建外部表时使用unique_key_sort_suffix选项。例如,指定myid0 ASC, myid1 DESC。
后续步骤
- 了解如何访问 OpenSearch 数据。
- 了解如何访问 Elasticsearch 数据。
- 了解如何运行混合式向量相似性搜索。