从 AlloyDB for PostgreSQL 访问 Solr 数据

您可以使用 AlloyDB for PostgreSQL 中的外部搜索集成来访问和搜索存储在 Apache Solr 中的数据。

准备工作

在开始之前,请确保您已完成以下操作:

  • 在主 AlloyDB 实例上 添加出站公共 IP 连接。

  • 部署并运行 Solr 集群,并使用可访问的面向公众的网址。

在 Secret Manager 中存储 Solr 凭据

AlloyDB 会从 Secret Manager 存储和读取您的 Solr 凭据。对于基本身份验证,Secret Manager 中 Secret 的值必须是采用 base64 编码的字符串,格式为 username:password。如需详细了解如何使用 Secret Manager,请参阅 使用 Secret Manager 创建和访问 Secret

确保您的 AlloyDB 服务帐号具有 Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) 角色,以便从 Secret Manager 读取 Secret。如需了解详情,请参阅 使用 Secret Manager 创建和访问 Secret

启用并配置 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/1123456789012 表示您的 Google Cloud 项目 ID。

  1. 为 Solr 服务器定义 PostgreSQL 用户映射。请注意,PostgreSQL FDW 需要此用户映射才能正常运行。 AlloyDB 使用 REST 授权标头进行身份验证。

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER SOLR_SERVER_NAME;
    
  2. 将 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"。

问题排查

如果您在查询 Solr 集群时遇到身份验证或连接问题,请检查以下常见原因:

  • HTTP 401 或 403 身份验证错误 :验证 Secret Manager 中的 Solr Secret 是否包含采用 username:password 格式的 base64 编码字符串,以及 AlloyDB 使用的服务帐号是否具有 secretmanager.secretAccessor 权限。
  • 连接超时 :验证是否在主 AlloyDB 实例上启用了出站公共 IP 连接,以及 Solr 防火墙是否允许在指定端口上建立入站连接。

限制

在将 AlloyDB 连接到 Solr 之前,请了解以下限制:

  • Solr 集成仅适用于 PostgreSQL 主要版本 17 及更高版本。

  • AlloyDB 会读取 Solr 数据,但不会写入 Solr 数据。

  • AlloyDB 不会自动将数据库数据编入 Solr 索引。您负责填充 Solr 集合,并保持 AlloyDB 中的数据与 Solr 中的索引数据之间的一致性。

  • AlloyDB 不会自动将架构与 Solr 同步。如果 Solr 集合架构发生变化,您必须手动更新相应 PostgreSQL 外部表的架构。

  • 与 Elasticsearch 不同,Solr 没有预定义的 JSON 类型字段。您必须将 JSON 类型字段映射到 TEXTjsonb 格式的字符串。

  • Solr 需要排序表达式中的唯一键,才能使分页正常运行。默认情况下,系统会使用 id 字段。 您可以使用 unique_key_sort_suffix 选项创建外部表时,指定自定义字段,或包含多个字段及其各自排序顺序(例如 myid0 ASC, myid1 DESC)的英文逗号分隔列表。

后续步骤