从 AlloyDB Omni 访问 Apache Solr 数据

选择文档版本:

您可以使用 AlloyDB Omni 中的外部搜索集成来访问和搜索存储在 Apache Solr 中的数据。通过此集成,您可以将密集型全文搜索、复杂查询解析和高级分面工作负载从操作型数据库分流到 Solr,从而缩短查询延迟时间并提高整体系统吞吐量。

准备工作

在开始之前,请完成以下步骤:

将 Solr 凭证存储在 Secret Manager 中

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

确保 AlloyDB Omni 使用的服务账号具有 secretmanager.secretAccessor 权限,可以从 Secret Manager 读取密文。如需了解详情,请参阅管理对 Secret 的访问权限。

启用并配置 external_search_fdw 扩展程序

如需开始与 Solr 集成,请通过外部数据服务器配置对 Solr 集群的访问权限。

  1. 连接到您的数据库并启用扩展程序:

    CREATE EXTENSION external_search_fdw;
    
  2. 创建外部服务器:

    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。

  3. 为 Solr 服务器定义用户映射:

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER SOLR_SERVER_NAME;
    
  4. 将 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 查询的过滤条件。例如 a = 10 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 Vector Search 结果联接。

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 密钥是否包含格式为 username:password 的 base64 编码字符串,以及 AlloyDB Omni 使用的服务账号是否具有 secretmanager.secretAccessor 权限。

  • 连接超时:验证 AlloyDB Omni 与 Solr 端点之间的网络规则和防火墙配置。

限制

  • 只读:AlloyDB Omni 会读取但不会写入 Solr 数据。

  • 数据管理:AlloyDB Omni 不会自动将数据库数据编入 Solr 索引。您需要负责填充 Solr 集合,并维护 AlloyDB Omni 中的数据与 Solr 中的索引数据之间的一致性。

  • 架构管理:AlloyDB Omni 不会自动与 Solr 同步架构。如果 Solr 集合架构发生更改,请手动更新相应 PostgreSQL 外部表的架构。

  • 不支持的类型:不支持专用 Solr 类型,例如地理空间类型。

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

后续步骤