您可以使用 AlloyDB Omni 中的外部搜索集成来访问和搜索存储在 Apache Solr 中的数据。
限制
在将 AlloyDB 连接到 Solr 之前,请了解以下限制:
Solr 集成仅适用于 PostgreSQL 主要版本
17及更高版本。AlloyDB 可以读取 Solr 数据,但无法写入。
AlloyDB 不会自动将数据库数据编入 Solr 索引。您需要负责填充 Solr 集合,并确保 AlloyDB 中的数据与 Solr 中的索引数据保持一致。
AlloyDB 不会自动将架构与 Solr 同步。如果 Solr 集合架构发生变化,您必须手动更新相应 PostgreSQL 外部表的架构。
与 Elasticsearch 不同,Solr 没有预定义的 JSON 类型字段。您必须将 JSON 类型字段映射到
TEXT或jsonb格式的字符串。Solr 要求排序表达式中包含唯一键,以便分页正常运行。默认情况下,系统会使用
id字段。 您可以在创建外部表时使用unique_key_sort_suffix选项指定自定义字段,或指定以英文逗号分隔的多个字段及其各自的排序顺序,例如myid0 ASC, myid1 DESC。
准备工作
在开始之前,请确保您已完成以下操作:
部署并运行 Solr 集群,并提供可访问的面向公众的网址。
在 Secret Manager 中存储 Solr 凭据。对于基本身份验证,密文的值必须是采用 base64 编码的字符串,格式为
username:password。确保 AlloyDB 使用的服务帐号具有
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/123456789012/secrets/apikey/versions/1。123456789012表示您的 Google Cloud 项目 ID。
为 Solr 服务器定义 PostgreSQL 用户映射。请注意,PostgreSQL FDW 需要此用户映射才能正常运行。 AlloyDB 使用 REST 授权标头进行身份验证。
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 接受 SQL 查询,并将其转换为 Solr REST API 查询。
如需查询 Solr 数据,您可以使用以下选项:
- 标准 SQL 查询
- 查询 DSL
- 混合搜索
标准 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 向量搜索结果联接。
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 的查询。例如,"solr_field_name:\"cloud databases\""会在solr_field_name字段中搜索短语 "cloud databases"。