这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

扩展详情

每个 PostgreSQL 扩展的详细信息,可用性情况,下载链接,使用说明

Pigsty 中扩展的完整清单,请参考 扩展列表RPM 包列表DEB 包列表


元数据说明

扩展(Extension, name)是 PostgreSQL 中的一个逻辑功能模块,名称与 pg_available_extensions 系统视图中的名称一致,是 PostgreSQL 世界里的唯一标识。 使用 CREATE EXTENSION <name> 来创建一个扩展,使用 DROP EXTENSION <name> 来删除一个扩展。

扩展包(Package, pkg)是包含一个或多个扩展的二进制软件包(RPM 或 DEB)。一个扩展包可能包含多个扩展, 例如 postgis 扩展包中包含了 postgispostgis_topologypostgis_raster 等多个扩展。 扩展包的名称不一定与扩展名一致,例如扩展包 pgvector 对应的核心扩展名为 vector

当一个扩展包中包含多个扩展时,会有一个首要扩展(Lead Extension, lead)作为该包的代表。 首要扩展通常是包中最核心的扩展,其他扩展被视为 “兄弟扩展”。


分类维度

扩展可以按照以下维度进行分类:

维度说明
分类按功能划分为 16 个预定义类目,见下方分类表
协议按开源许可证分类:MIT、PostgreSQL、Apache-2.0、GPL 等
语言按实现语言分类:C、C++、Rust、SQL、Python 等
仓库按归属仓库分类:PGDG、PIGSTY、CONTRIB、MIXED

属性标记

每个扩展都有 7 个布尔属性标记,在扩展列表中以 7 位字符串 cbsLdtr 的形式展示,每一位代表一个属性:

字符列名字段全称说明
1cContribcontrib内核自带是否为 PostgreSQL 内核自带的 contrib 扩展
2bBinhas_bin二进制扩展包是否包含额外的可执行二进制文件/命令行工具
3sSolibhas_lib共享库扩展是否包含共享库文件(.so),即 C/Rust 编译产物
4LLoadneed_ddl显式加载是否需要通过 shared_preload_libraries 预加载并重启
5dDDLneed_load需要创建是否需要执行 CREATE EXTENSION DDL 语句完成安装
6tTrusttrusted信任扩展是否为受信任的扩展,普通用户(非超级用户)可直接创建
7rRelocrelocatable可重定位扩展是否可以被安装到指定的 Schema 中

当该属性为真时,显示对应字母;为假时,显示短横线 -

例如 --sLd-r 表示该扩展包含共享库,需要预加载,需要创建,不受信任(需要超级用户来创建)但可重定位。


可用性状态

Pigsty 为每一个扩展都提供了 版本可用性矩阵,这是一个表格,行为操作系统(例如 el9.x86_64),列为 PG 大版本(18, 17, …)。

每一个单元格代表这个 Linux 操作系统与 PG 大版本组合下的扩展状态,包括:

  • 版本:这个 OS/PG 组合下,该扩展的最新可用版本号,如果缺失则显示为 MISS
  • 仓库:上面的最新可用版本是来自哪个 仓库?可能是 PGDG/PIGSTY
  • 状态:扩展的状态如下表所示,状态会使用徽章的颜色进行区分与标记:
状态说明
AVAIL可用(PGDG 仓库),显示该平台上可用的具体版本号
AVAIL可用(PIGSTY 仓库),显示该平台上可用的具体版本号
AVAIL可用(CONTRIB 内核自带),显示该平台上可用的具体版本号
MISS缺失,该平台上没有可用的二进制包
HIDE隐藏,该扩展已知不支持此 PG 版本(如版本范围限制)
THROW异常,该包存在但安装时会抛出错误
BREAK损坏,该包存在但运行时可能导致问题
FORK分支,需要使用特定的 PostgreSQL 内核分支版本

数据库模式

Pigsty 扩展目录的模式定义于 github.com/pgsty/pgext,数据位于 extension.csv 中。

Extension 表结构定义
CREATE TABLE IF NOT EXISTS pgext.extension
(
    id          INTEGER PRIMARY KEY,      -- Unique extension identifier
    name        TEXT NOT NULL UNIQUE,     -- Extension name as it appears in pg_extension
    pkg         TEXT NOT NULL,            -- Normalized package name (may differ from extension name)
    lead_ext    TEXT,                     -- Leading/primary extension in multi-extension packages
    category    TEXT,                     -- Category classification (TIME, GIS, RAG, FTS, etc.)
    state       TEXT,                     -- Extension state: available, deprecated, removed, not-ready
    url         TEXT,                     -- Extension homepage or source repository URL
    license     TEXT,                     -- Software license (PostgreSQL, MIT, Apache-2.0, etc.)
    tags        TEXT[],                   -- Additional classification tags
    version     TEXT,                     -- Latest available version of this extension
    repo        TEXT,                     -- Source repository type (github, gitlab, etc.)
    lang        TEXT,                     -- Primary programming language (C, SQL, PLpgSQL, Rust, etc.)
    contrib     BOOLEAN,                  -- Whether this is a PostgreSQL contrib extension
    lead        BOOLEAN,                  -- Whether this is the lead extension in its package
    has_bin     BOOLEAN,                  -- Whether extension includes binary executables
    has_lib     BOOLEAN,                  -- Whether extension includes shared libraries (.so/.dll)
    need_ddl    BOOLEAN,                  -- Whether requires CREATE EXTENSION DDL to install
    need_load   BOOLEAN,                  -- Whether requires LOAD or shared_preload_libraries
    trusted     BOOLEAN,                  -- Whether non-superuser can install (trusted extension)
    relocatable BOOLEAN,                  -- Whether extension can be relocated to different schema
    schemas     TEXT[],                   -- Fixed schema names if not relocatable
    pg_ver      TEXT[],                   -- Supported PostgreSQL major versions
    requires    TEXT[],                   -- Extension dependencies (other extensions required)
    require_by  TEXT[],                   -- Extensions that depend on this extension
    see_also    TEXT[],                   -- Related or similar extensions
    rpm_ver     TEXT,                     -- Latest RPM package version
    rpm_repo    TEXT,                     -- RPM repository source (PGDG, PIGSTY, etc.)
    rpm_pkg     TEXT,                     -- RPM package name template ($v for PG version)
    rpm_pg      TEXT[],                   -- PostgreSQL versions available in RPM
    rpm_deps    TEXT[],                   -- RPM package dependencies
    deb_ver     TEXT,                     -- Latest DEB package version
    deb_repo    TEXT,                     -- DEB repository source (PGDG, PIGSTY, etc.)
    deb_pkg     TEXT,                     -- DEB package name template ($v for PG version)
    deb_deps    TEXT[],                   -- DEB package dependencies
    deb_pg      TEXT[],                   -- PostgreSQL versions available in DEB
    source      TEXT,                     -- Source tarball name if built by Pigsty
    extra       JSONB,                    -- Additional metadata in JSONB format
    en_desc     TEXT,                     -- English description of extension functionality
    zh_desc     TEXT,                     -- Chinese description of extension functionality
    comment     TEXT,                     -- Additional notes or special instructions
    mtime       DATE DEFAULT CURRENT_DATE -- Last modification date of this record
);

CREATE INDEX IF NOT EXISTS ext_name_pkg_idx ON pgext.extension (name, pkg);

COMMENT ON TABLE pgext.extension IS 'PostgreSQL Extension Central Catalog Table';
COMMENT ON COLUMN pgext.extension.id IS 'Unique integer identifier for each extension';
COMMENT ON COLUMN pgext.extension.name IS 'Extension name as it appears in PostgreSQL system catalog (pg_extension)';
COMMENT ON COLUMN pgext.extension.pkg IS 'Normalized package name used for package management (may differ from extension name)';
COMMENT ON COLUMN pgext.extension.lead_ext IS 'Primary/leading extension name in multi-extension packages';
COMMENT ON COLUMN pgext.extension.category IS 'Functional category: TIME, GIS, RAG, FTS, OLAP, FEAT, LANG, TYPE, UTIL, FUNC, ADMIN, STAT, SEC, FDW, SIM, ETL';
COMMENT ON COLUMN pgext.extension.state IS 'Extension lifecycle state: available, deprecated, removed, not-ready';
COMMENT ON COLUMN pgext.extension.url IS 'Extension homepage or source code repository URL (GitHub, GitLab, etc.)';
COMMENT ON COLUMN pgext.extension.license IS 'Software license (e.g., PostgreSQL, MIT, Apache-2.0, GPL, BSD)';
COMMENT ON COLUMN pgext.extension.tags IS 'Additional classification tags as string array for flexible categorization';
COMMENT ON COLUMN pgext.extension.version IS 'Latest available version of this extension';
COMMENT ON COLUMN pgext.extension.repo IS 'Source repository hosting platform (github, gitlab, bitbucket, etc.)';
COMMENT ON COLUMN pgext.extension.lang IS 'Primary implementation language (C, SQL, PLpgSQL, Rust, Go, Python, etc.)';
COMMENT ON COLUMN pgext.extension.contrib IS 'Whether this is an official PostgreSQL contrib extension';
COMMENT ON COLUMN pgext.extension.lead IS 'Whether this is the primary/lead extension in a multi-extension package';
COMMENT ON COLUMN pgext.extension.has_bin IS 'Whether the extension package includes binary executables/utilities';
COMMENT ON COLUMN pgext.extension.has_lib IS 'Whether the extension includes shared library files (.so on Linux, .dll on Windows)';
COMMENT ON COLUMN pgext.extension.need_ddl IS 'Whether extension requires CREATE EXTENSION DDL command to install';
COMMENT ON COLUMN pgext.extension.need_load IS 'Whether requires explicit LOAD or shared_preload_libraries configuration';
COMMENT ON COLUMN pgext.extension.trusted IS 'Whether non-superuser can install this extension (trusted extension feature)';
COMMENT ON COLUMN pgext.extension.relocatable IS 'Whether extension can be relocated to a different schema after installation';
COMMENT ON COLUMN pgext.extension.schemas IS 'Fixed schema names if extension is not relocatable (must be installed in specific schema)';
COMMENT ON COLUMN pgext.extension.pg_ver IS 'Array of supported PostgreSQL major versions (e.g., {14,15,16,17,18})';
COMMENT ON COLUMN pgext.extension.requires IS 'Array of extension dependencies (other extensions that must be installed first)';
COMMENT ON COLUMN pgext.extension.require_by IS 'Array of extensions that depend on this extension (reverse dependency list)';
COMMENT ON COLUMN pgext.extension.see_also IS 'Array of related or similar extensions (for discovery and comparison)';
COMMENT ON COLUMN pgext.extension.rpm_ver IS 'Latest available RPM package version';
COMMENT ON COLUMN pgext.extension.rpm_repo IS 'RPM repository source (PGDG, PIGSTY, EPEL, etc.)';
COMMENT ON COLUMN pgext.extension.rpm_pkg IS 'RPM package name template where $v is replaced with PostgreSQL major version';
COMMENT ON COLUMN pgext.extension.rpm_pg IS 'Array of PostgreSQL versions available as RPM packages';
COMMENT ON COLUMN pgext.extension.rpm_deps IS 'Array of RPM package dependencies (system libraries and other packages)';
COMMENT ON COLUMN pgext.extension.deb_ver IS 'Latest available DEB package version';
COMMENT ON COLUMN pgext.extension.deb_repo IS 'DEB repository source (PGDG, PIGSTY, etc.)';
COMMENT ON COLUMN pgext.extension.deb_pkg IS 'DEB package name template where $v is replaced with PostgreSQL major version';
COMMENT ON COLUMN pgext.extension.deb_deps IS 'Array of DEB package dependencies (system libraries and other packages)';
COMMENT ON COLUMN pgext.extension.deb_pg IS 'Array of PostgreSQL versions available as DEB packages';
COMMENT ON COLUMN pgext.extension.source IS 'Source code tarball filename if built and distributed by Pigsty';
COMMENT ON COLUMN pgext.extension.extra IS 'Additional extension metadata stored as JSONB for extensibility';
COMMENT ON COLUMN pgext.extension.en_desc IS 'English description of extension functionality and purpose';
COMMENT ON COLUMN pgext.extension.zh_desc IS 'Chinese description of extension functionality and purpose';
COMMENT ON COLUMN pgext.extension.comment IS 'Additional notes, special instructions, or warnings';
COMMENT ON COLUMN pgext.extension.mtime IS 'Last modification timestamp of this record';

1 - timescaledb

时序数据库扩展插件

概览

扩展包名版本分类许可证语言
timescaledb2.26.3TIMETimescaleC
ID扩展名BinLibLoadCreateTrustReloc模式
1000timescaledbtimescaledb_information
相关扩展timescaledb_toolkit timeseries pg_cron pg_partman periods temporal_tables emaj pg_task

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.26.31817161514timescaledb-
RPMPIGSTY2.26.31817161514timescaledb-tsl_$v-
DEBPIGSTY2.26.31817161514postgresql-$v-timescaledb-tsl-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PIGSTY 2.26.3
el8.x86_64.pg17 : timescaledb-tsl_17
timescaledb-tsl_17-2.26.3-1PIGSTY.el8.x86_64.rpm PIGSTY · 2.26.3 · 821.2KiB timescaledb-tsl_17-2.26.3-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.3 · 749.8KiB timescaledb-tsl_17-2.26.2-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.2 · 750.9KiB timescaledb-tsl_17-2.26.1-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.1 · 749.7KiB timescaledb-tsl_17-2.26.0-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.0 · 748.8KiB timescaledb-tsl_17-2.25.2-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.25.2 · 729.1KiB timescaledb-tsl_17-2.25.1-2PGDG.rhel8.10.x86_64.rpm PGDG · 2.25.1 · 726.5KiB timescaledb-tsl_17-2.25.0-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.25.0 · 726.0KiB timescaledb-tsl_17-2.23.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.23.1 · 733.2KiB timescaledb-tsl_17-2.23.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.23.0 · 732.7KiB timescaledb-tsl_17-2.22.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.22.1 · 733.1KiB timescaledb-tsl_17-2.22.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.22.0 · 730.7KiB timescaledb-tsl_17-2.21.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.3 · 738.9KiB timescaledb-tsl_17-2.21.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.2 · 738.7KiB timescaledb-tsl_17-2.21.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.1 · 737.8KiB timescaledb-tsl_17-2.21.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.0 · 737.0KiB timescaledb-tsl_17-2.20.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.20.3 · 722.7KiB timescaledb-tsl_17-2.20.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.20.2 · 721.1KiB timescaledb-tsl_17-2.20.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.20.1 · 720.2KiB timescaledb-tsl_17-2.19.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.3 · 700.0KiB timescaledb-tsl_17-2.19.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.2 · 698.9KiB timescaledb-tsl_17-2.19.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.1 · 698.3KiB timescaledb-tsl_17-2.19.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.0 · 773.5KiB timescaledb-tsl_17-2.18.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.2 · 746.3KiB timescaledb-tsl_17-2.18.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.1 · 745.6KiB timescaledb-tsl_17-2.18.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.0 · 743.6KiB timescaledb-tsl_17-2.17.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.2 · 686.4KiB timescaledb-tsl_17-2.17.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.1 · 685.9KiB timescaledb-tsl_17-2.17.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.0 · 683.4KiB
PIGSTY 2.26.3
el8.x86_64.pg16 : timescaledb-tsl_16
timescaledb-tsl_16-2.26.3-1PIGSTY.el8.x86_64.rpm PIGSTY · 2.26.3 · 821.4KiB timescaledb-tsl_16-2.26.3-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.3 · 750.0KiB timescaledb-tsl_16-2.26.2-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.2 · 750.8KiB timescaledb-tsl_16-2.26.1-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.1 · 749.7KiB timescaledb-tsl_16-2.26.0-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.0 · 748.8KiB timescaledb-tsl_16-2.25.2-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.25.2 · 729.2KiB timescaledb-tsl_16-2.25.1-2PGDG.rhel8.10.x86_64.rpm PGDG · 2.25.1 · 726.2KiB timescaledb-tsl_16-2.25.0-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.25.0 · 725.6KiB timescaledb-tsl_16-2.23.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.23.1 · 732.3KiB timescaledb-tsl_16-2.23.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.23.0 · 731.8KiB timescaledb-tsl_16-2.22.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.22.1 · 732.6KiB timescaledb-tsl_16-2.22.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.22.0 · 730.0KiB timescaledb-tsl_16-2.21.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.3 · 737.4KiB timescaledb-tsl_16-2.21.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.2 · 736.7KiB timescaledb-tsl_16-2.21.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.1 · 735.8KiB timescaledb-tsl_16-2.21.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.0 · 735.5KiB timescaledb-tsl_16-2.20.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.20.3 · 721.2KiB timescaledb-tsl_16-2.20.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.20.2 · 720.0KiB timescaledb-tsl_16-2.20.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.20.1 · 719.4KiB timescaledb-tsl_16-2.19.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.3 · 699.6KiB timescaledb-tsl_16-2.19.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.2 · 698.4KiB timescaledb-tsl_16-2.19.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.1 · 697.6KiB timescaledb-tsl_16-2.19.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.0 · 772.7KiB timescaledb-tsl_16-2.18.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.2 · 745.8KiB timescaledb-tsl_16-2.18.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.1 · 744.7KiB timescaledb-tsl_16-2.18.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.0 · 742.4KiB timescaledb-tsl_16-2.17.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.2 · 686.8KiB timescaledb-tsl_16-2.17.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.1 · 686.3KiB timescaledb-tsl_16-2.17.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.0 · 683.7KiB timescaledb-tsl_16-2.16.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.16.0 · 641.5KiB timescaledb-tsl_16-2.15.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.15.3 · 638.4KiB timescaledb-tsl_16-2.15.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.15.2 · 637.7KiB timescaledb-tsl_16-2.15.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.15.0 · 635.3KiB timescaledb-tsl_16-2.13.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.13.1 · 758.6KiB timescaledb-tsl_16-2.13.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.13.0 · 757.4KiB
PIGSTY 2.26.3
el8.x86_64.pg15 : timescaledb-tsl_15
timescaledb-tsl_15-2.26.3-1PIGSTY.el8.x86_64.rpm PIGSTY · 2.26.3 · 819.7KiB timescaledb-tsl_15-2.26.3-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.3 · 748.5KiB timescaledb-tsl_15-2.26.2-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.2 · 749.2KiB timescaledb-tsl_15-2.26.1-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.1 · 748.5KiB timescaledb-tsl_15-2.26.0-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.26.0 · 747.7KiB timescaledb-tsl_15-2.25.2-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.25.2 · 727.5KiB timescaledb-tsl_15-2.25.1-2PGDG.rhel8.10.x86_64.rpm PGDG · 2.25.1 · 725.0KiB timescaledb-tsl_15-2.25.0-1PGDG.rhel8.10.x86_64.rpm PGDG · 2.25.0 · 724.5KiB timescaledb-tsl_15-2.23.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.23.1 · 731.2KiB timescaledb-tsl_15-2.23.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.23.0 · 731.0KiB timescaledb-tsl_15-2.22.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.22.1 · 730.8KiB timescaledb-tsl_15-2.22.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.22.0 · 728.2KiB timescaledb-tsl_15-2.21.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.3 · 736.2KiB timescaledb-tsl_15-2.21.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.2 · 735.8KiB timescaledb-tsl_15-2.21.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.1 · 734.6KiB timescaledb-tsl_15-2.21.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.21.0 · 734.1KiB timescaledb-tsl_15-2.20.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.20.3 · 719.9KiB timescaledb-tsl_15-2.20.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.20.2 · 718.6KiB timescaledb-tsl_15-2.20.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.20.1 · 718.0KiB timescaledb-tsl_15-2.19.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.3 · 699.1KiB timescaledb-tsl_15-2.19.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.2 · 697.5KiB timescaledb-tsl_15-2.19.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.1 · 696.9KiB timescaledb-tsl_15-2.19.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.0 · 772.4KiB timescaledb-tsl_15-2.18.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.2 · 744.9KiB timescaledb-tsl_15-2.18.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.1 · 743.9KiB timescaledb-tsl_15-2.18.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.0 · 742.0KiB timescaledb-tsl_15-2.17.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.2 · 686.1KiB timescaledb-tsl_15-2.17.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.1 · 685.5KiB timescaledb-tsl_15-2.17.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.0 · 682.7KiB timescaledb-tsl_15-2.16.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.16.0 · 640.9KiB timescaledb-tsl_15-2.15.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.15.3 · 637.4KiB timescaledb-tsl_15-2.15.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.15.2 · 637.0KiB timescaledb-tsl_15-2.15.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.15.0 · 633.4KiB timescaledb-tsl_15-2.13.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.13.1 · 768.2KiB
PIGSTY 2.19.3
el8.x86_64.pg14 : timescaledb-tsl_14
timescaledb-tsl_14-2.19.3-9PIGSTY.el8.x86_64.rpm PIGSTY · 2.19.3 · 763.9KiB timescaledb-tsl_14-2.19.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.3 · 693.2KiB timescaledb-tsl_14-2.19.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.2 · 692.0KiB timescaledb-tsl_14-2.19.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.1 · 691.5KiB timescaledb-tsl_14-2.19.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.19.0 · 766.7KiB timescaledb-tsl_14-2.18.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.2 · 739.7KiB timescaledb-tsl_14-2.18.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.1 · 738.5KiB timescaledb-tsl_14-2.18.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.18.0 · 736.7KiB timescaledb-tsl_14-2.17.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.2 · 680.1KiB timescaledb-tsl_14-2.17.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.1 · 679.5KiB timescaledb-tsl_14-2.17.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.17.0 · 677.4KiB timescaledb-tsl_14-2.16.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.16.0 · 637.4KiB timescaledb-tsl_14-2.15.3-1PGDG.rhel8.x86_64.rpm PGDG · 2.15.3 · 634.0KiB timescaledb-tsl_14-2.15.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.15.2 · 633.8KiB timescaledb-tsl_14-2.15.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.15.0 · 630.3KiB timescaledb-tsl_14-2.13.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.13.1 · 764.5KiB timescaledb-tsl_14-2.13.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.13.0 · 763.3KiB timescaledb-tsl_14-2.12.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.12.2 · 747.2KiB timescaledb-tsl_14-2.12.0-1PGDG.rhel8.x86_64.rpm PGDG · 2.12.0 · 745.9KiB timescaledb-tsl_14-2.11.2-1PGDG.rhel8.x86_64.rpm PGDG · 2.11.2 · 710.0KiB timescaledb-tsl_14-2.11.1-1PGDG.rhel8.x86_64.rpm PGDG · 2.11.1 · 709.2KiB timescaledb-tsl_14-2.11.0-1.rhel8.x86_64.rpm PGDG · 2.11.0 · 707.9KiB timescaledb-tsl_14-2.10.2-1.rhel8.x86_64.rpm PGDG · 2.10.2 · 683.3KiB timescaledb-tsl_14-2.10.0-1.rhel8.x86_64.rpm PGDG · 2.10.0 · 679.0KiB timescaledb-tsl_14-2.9.3-1.rhel8.x86_64.rpm PGDG · 2.9.3 · 676.4KiB timescaledb-tsl_14-2.9.2-1.rhel8.x86_64.rpm PGDG · 2.9.2 · 675.5KiB timescaledb-tsl_14-2.9.1-1.rhel8.x86_64.rpm PGDG · 2.9.1 · 674.2KiB timescaledb-tsl_14-2.8.1-1.rhel8.x86_64.rpm PGDG · 2.8.1 · 644.5KiB timescaledb-tsl_14-2.8.0-1.rhel8.x86_64.rpm PGDG · 2.8.0 · 643.2KiB timescaledb-tsl_14-2.7.2-1.rhel8.x86_64.rpm PGDG · 2.7.2 · 616.0KiB timescaledb-tsl_14-2.6.1-1.rhel8.x86_64.rpm PGDG · 2.6.1 · 594.7KiB timescaledb-tsl_14-2.6.0-1.rhel8.x86_64.rpm PGDG · 2.6.0 · 593.1KiB timescaledb-tsl_14-2.5.2-1.rhel8.x86_64.rpm PGDG · 2.5.2 · 579.1KiB timescaledb-tsl_14-2.5.1-1.rhel8.x86_64.rpm PGDG · 2.5.1 · 619.0KiB timescaledb-tsl_14-2.5.0-1.rhel8.x86_64.rpm PGDG · 2.5.0 · 617.4KiB
el8.aarch64
el9.x86_64
PIGSTY 2.26.3
el9.x86_64.pg17 : timescaledb-tsl_17
timescaledb-tsl_17-2.26.3-1PIGSTY.el9.x86_64.rpm PIGSTY · 2.26.3 · 744.7KiB timescaledb-tsl_17-2.26.3-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.3 · 724.7KiB timescaledb-tsl_17-2.26.2-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.2 · 725.6KiB timescaledb-tsl_17-2.26.1-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.1 · 726.5KiB timescaledb-tsl_17-2.26.0-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.0 · 722.8KiB timescaledb-tsl_17-2.25.2-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.25.2 · 702.3KiB timescaledb-tsl_17-2.25.1-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.25.1 · 700.2KiB timescaledb-tsl_17-2.25.0-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.25.0 · 700.1KiB timescaledb-tsl_17-2.23.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.23.1 · 717.5KiB timescaledb-tsl_17-2.23.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.23.0 · 715.6KiB timescaledb-tsl_17-2.22.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.22.1 · 712.8KiB timescaledb-tsl_17-2.22.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.22.0 · 710.1KiB timescaledb-tsl_17-2.21.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.3 · 718.9KiB timescaledb-tsl_17-2.21.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.2 · 715.9KiB timescaledb-tsl_17-2.21.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.1 · 721.9KiB timescaledb-tsl_17-2.21.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.0 · 719.9KiB timescaledb-tsl_17-2.20.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.20.3 · 698.7KiB timescaledb-tsl_17-2.20.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.20.2 · 695.6KiB timescaledb-tsl_17-2.19.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.3 · 660.9KiB timescaledb-tsl_17-2.19.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.2 · 658.1KiB timescaledb-tsl_17-2.19.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.1 · 657.8KiB timescaledb-tsl_17-2.19.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.0 · 679.2KiB timescaledb-tsl_17-2.18.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.2 · 659.2KiB timescaledb-tsl_17-2.18.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.1 · 657.9KiB timescaledb-tsl_17-2.18.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.0 · 658.2KiB timescaledb-tsl_17-2.17.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.2 · 607.6KiB timescaledb-tsl_17-2.17.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.1 · 607.4KiB timescaledb-tsl_17-2.17.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.0 · 606.4KiB
PIGSTY 2.26.3
el9.x86_64.pg16 : timescaledb-tsl_16
timescaledb-tsl_16-2.26.3-1PIGSTY.el9.x86_64.rpm PIGSTY · 2.26.3 · 746.7KiB timescaledb-tsl_16-2.26.3-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.3 · 723.8KiB timescaledb-tsl_16-2.26.2-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.2 · 725.9KiB timescaledb-tsl_16-2.26.1-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.1 · 725.5KiB timescaledb-tsl_16-2.26.0-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.0 · 723.5KiB timescaledb-tsl_16-2.25.2-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.25.2 · 702.0KiB timescaledb-tsl_16-2.25.1-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.25.1 · 701.6KiB timescaledb-tsl_16-2.25.0-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.25.0 · 700.1KiB timescaledb-tsl_16-2.23.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.23.1 · 716.7KiB timescaledb-tsl_16-2.23.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.23.0 · 714.5KiB timescaledb-tsl_16-2.22.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.22.1 · 712.5KiB timescaledb-tsl_16-2.22.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.22.0 · 709.3KiB timescaledb-tsl_16-2.21.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.3 · 715.6KiB timescaledb-tsl_16-2.21.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.2 · 713.2KiB timescaledb-tsl_16-2.21.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.1 · 713.6KiB timescaledb-tsl_16-2.21.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.0 · 720.3KiB timescaledb-tsl_16-2.20.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.20.3 · 695.7KiB timescaledb-tsl_16-2.20.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.20.2 · 694.8KiB timescaledb-tsl_16-2.19.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.3 · 658.9KiB timescaledb-tsl_16-2.19.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.2 · 657.6KiB timescaledb-tsl_16-2.19.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.1 · 656.1KiB timescaledb-tsl_16-2.19.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.0 · 677.2KiB timescaledb-tsl_16-2.18.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.2 · 656.5KiB timescaledb-tsl_16-2.18.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.1 · 655.8KiB timescaledb-tsl_16-2.18.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.0 · 653.2KiB timescaledb-tsl_16-2.17.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.2 · 607.8KiB timescaledb-tsl_16-2.17.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.1 · 606.8KiB timescaledb-tsl_16-2.17.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.0 · 606.3KiB timescaledb-tsl_16-2.16.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.16.0 · 571.2KiB timescaledb-tsl_16-2.15.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.15.3 · 565.9KiB timescaledb-tsl_16-2.15.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.15.2 · 566.2KiB timescaledb-tsl_16-2.15.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.15.0 · 565.8KiB timescaledb-tsl_16-2.13.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.13.1 · 716.4KiB timescaledb-tsl_16-2.13.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.13.0 · 715.8KiB
PIGSTY 2.26.3
el9.x86_64.pg15 : timescaledb-tsl_15
timescaledb-tsl_15-2.26.3-1PIGSTY.el9.x86_64.rpm PIGSTY · 2.26.3 · 743.0KiB timescaledb-tsl_15-2.26.3-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.3 · 722.9KiB timescaledb-tsl_15-2.26.2-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.2 · 723.1KiB timescaledb-tsl_15-2.26.1-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.1 · 722.0KiB timescaledb-tsl_15-2.26.0-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.26.0 · 722.6KiB timescaledb-tsl_15-2.25.2-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.25.2 · 700.6KiB timescaledb-tsl_15-2.25.1-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.25.1 · 695.8KiB timescaledb-tsl_15-2.25.0-1PGDG.rhel9.7.x86_64.rpm PGDG · 2.25.0 · 701.2KiB timescaledb-tsl_15-2.23.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.23.1 · 712.9KiB timescaledb-tsl_15-2.23.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.23.0 · 712.7KiB timescaledb-tsl_15-2.22.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.22.1 · 709.8KiB timescaledb-tsl_15-2.22.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.22.0 · 708.3KiB timescaledb-tsl_15-2.21.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.3 · 713.0KiB timescaledb-tsl_15-2.21.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.2 · 715.6KiB timescaledb-tsl_15-2.21.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.1 · 718.8KiB timescaledb-tsl_15-2.21.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.21.0 · 717.8KiB timescaledb-tsl_15-2.20.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.20.3 · 697.3KiB timescaledb-tsl_15-2.20.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.20.2 · 693.5KiB timescaledb-tsl_15-2.19.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.3 · 657.5KiB timescaledb-tsl_15-2.19.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.2 · 655.8KiB timescaledb-tsl_15-2.19.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.1 · 654.6KiB timescaledb-tsl_15-2.19.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.0 · 676.9KiB timescaledb-tsl_15-2.18.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.2 · 655.4KiB timescaledb-tsl_15-2.18.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.1 · 654.6KiB timescaledb-tsl_15-2.18.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.0 · 652.2KiB timescaledb-tsl_15-2.17.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.2 · 607.4KiB timescaledb-tsl_15-2.17.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.1 · 607.7KiB timescaledb-tsl_15-2.17.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.0 · 606.6KiB timescaledb-tsl_15-2.16.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.16.0 · 570.9KiB timescaledb-tsl_15-2.15.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.15.3 · 565.1KiB timescaledb-tsl_15-2.15.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.15.2 · 565.2KiB timescaledb-tsl_15-2.13.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.13.1 · 725.1KiB timescaledb-tsl_15-2.13.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.13.0 · 726.7KiB timescaledb-tsl_15-2.12.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.12.2 · 708.6KiB timescaledb-tsl_15-2.12.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.12.0 · 707.6KiB timescaledb-tsl_15-2.11.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.11.2 · 677.1KiB timescaledb-tsl_15-2.11.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.11.1 · 675.4KiB timescaledb-tsl_15-2.11.0-1.rhel9.x86_64.rpm PGDG · 2.11.0 · 674.1KiB timescaledb-tsl_15-2.10.2-1.rhel9.x86_64.rpm PGDG · 2.10.2 · 652.1KiB timescaledb-tsl_15-2.9.3-1.rhel9.x86_64.rpm PGDG · 2.9.3 · 643.6KiB timescaledb-tsl_15-2.9.2-1.rhel9.x86_64.rpm PGDG · 2.9.2 · 642.8KiB timescaledb-tsl_15-2.9.1-1.rhel9.x86_64.rpm PGDG · 2.9.1 · 642.3KiB
PIGSTY 2.19.3
el9.x86_64.pg14 : timescaledb-tsl_14
timescaledb-tsl_14-2.19.3-9PIGSTY.el9.x86_64.rpm PIGSTY · 2.19.3 · 670.4KiB timescaledb-tsl_14-2.19.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.3 · 653.0KiB timescaledb-tsl_14-2.19.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.2 · 650.9KiB timescaledb-tsl_14-2.19.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.1 · 650.4KiB timescaledb-tsl_14-2.19.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.19.0 · 671.3KiB timescaledb-tsl_14-2.18.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.2 · 648.5KiB timescaledb-tsl_14-2.18.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.1 · 647.7KiB timescaledb-tsl_14-2.18.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.18.0 · 646.8KiB timescaledb-tsl_14-2.17.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.2 · 601.4KiB timescaledb-tsl_14-2.17.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.1 · 601.2KiB timescaledb-tsl_14-2.17.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.17.0 · 600.8KiB timescaledb-tsl_14-2.16.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.16.0 · 566.9KiB timescaledb-tsl_14-2.15.3-1PGDG.rhel9.x86_64.rpm PGDG · 2.15.3 · 563.4KiB timescaledb-tsl_14-2.15.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.15.2 · 560.5KiB timescaledb-tsl_14-2.13.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.13.1 · 723.9KiB timescaledb-tsl_14-2.13.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.13.0 · 723.4KiB timescaledb-tsl_14-2.12.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.12.2 · 706.1KiB timescaledb-tsl_14-2.12.0-1PGDG.rhel9.x86_64.rpm PGDG · 2.12.0 · 704.9KiB timescaledb-tsl_14-2.11.2-1PGDG.rhel9.x86_64.rpm PGDG · 2.11.2 · 675.9KiB timescaledb-tsl_14-2.11.1-1PGDG.rhel9.x86_64.rpm PGDG · 2.11.1 · 674.8KiB timescaledb-tsl_14-2.11.0-1.rhel9.x86_64.rpm PGDG · 2.11.0 · 673.0KiB timescaledb-tsl_14-2.10.2-1.rhel9.x86_64.rpm PGDG · 2.10.2 · 650.7KiB timescaledb-tsl_14-2.10.0-1.rhel9.x86_64.rpm PGDG · 2.10.0 · 646.2KiB timescaledb-tsl_14-2.9.3-1.rhel9.x86_64.rpm PGDG · 2.9.3 · 643.2KiB timescaledb-tsl_14-2.9.2-1.rhel9.x86_64.rpm PGDG · 2.9.2 · 641.7KiB timescaledb-tsl_14-2.9.1-1.rhel9.x86_64.rpm PGDG · 2.9.1 · 641.8KiB timescaledb-tsl_14-2.8.1-1.rhel9.x86_64.rpm PGDG · 2.8.1 · 611.2KiB timescaledb-tsl_14-2.7.2-1.rhel9.x86_64.rpm PGDG · 2.7.2 · 585.0KiB timescaledb-tsl_14-2.7.0-1.rhel9.x86_64.rpm PGDG · 2.7.0 · 578.1KiB
el9.aarch64
el10.x86_64
PIGSTY 2.26.3
el10.x86_64.pg17 : timescaledb-tsl_17
timescaledb-tsl_17-2.26.3-1PIGSTY.el10.x86_64.rpm PIGSTY · 2.26.3 · 774.1KiB timescaledb-tsl_17-2.26.3-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.3 · 755.1KiB timescaledb-tsl_17-2.26.2-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.2 · 756.9KiB timescaledb-tsl_17-2.26.1-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.1 · 756.0KiB timescaledb-tsl_17-2.26.0-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.0 · 753.8KiB timescaledb-tsl_17-2.25.2-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.25.2 · 731.9KiB timescaledb-tsl_17-2.25.1-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.25.1 · 726.7KiB timescaledb-tsl_17-2.25.0-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.25.0 · 727.5KiB timescaledb-tsl_17-2.23.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.23.1 · 742.0KiB timescaledb-tsl_17-2.23.0-1PGDG.rhel10.x86_64.rpm PGDG · 2.23.0 · 740.6KiB timescaledb-tsl_17-2.22.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.22.1 · 737.7KiB timescaledb-tsl_17-2.22.0-1PGDG.rhel10.x86_64.rpm PGDG · 2.22.0 · 737.4KiB timescaledb-tsl_17-2.21.3-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.3 · 741.3KiB timescaledb-tsl_17-2.21.2-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.2 · 740.6KiB timescaledb-tsl_17-2.21.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.1 · 740.2KiB timescaledb-tsl_17-2.21.0-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.0 · 739.6KiB timescaledb-tsl_17-2.20.3-1PGDG.rhel10.x86_64.rpm PGDG · 2.20.3 · 723.7KiB timescaledb-tsl_17-2.20.2-1PGDG.rhel10.x86_64.rpm PGDG · 2.20.2 · 723.4KiB timescaledb-tsl_17-2.20.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.20.1 · 722.8KiB
PIGSTY 2.26.3
el10.x86_64.pg16 : timescaledb-tsl_16
timescaledb-tsl_16-2.26.3-1PIGSTY.el10.x86_64.rpm PIGSTY · 2.26.3 · 775.6KiB timescaledb-tsl_16-2.26.3-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.3 · 756.0KiB timescaledb-tsl_16-2.26.2-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.2 · 756.8KiB timescaledb-tsl_16-2.26.1-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.1 · 756.4KiB timescaledb-tsl_16-2.26.0-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.0 · 756.1KiB timescaledb-tsl_16-2.25.2-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.25.2 · 732.6KiB timescaledb-tsl_16-2.25.1-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.25.1 · 726.2KiB timescaledb-tsl_16-2.25.0-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.25.0 · 730.1KiB timescaledb-tsl_16-2.23.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.23.1 · 743.0KiB timescaledb-tsl_16-2.23.0-1PGDG.rhel10.x86_64.rpm PGDG · 2.23.0 · 740.7KiB timescaledb-tsl_16-2.22.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.22.1 · 737.0KiB timescaledb-tsl_16-2.22.0-1PGDG.rhel10.x86_64.rpm PGDG · 2.22.0 · 737.8KiB timescaledb-tsl_16-2.21.3-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.3 · 741.3KiB timescaledb-tsl_16-2.21.2-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.2 · 740.8KiB timescaledb-tsl_16-2.21.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.1 · 739.4KiB timescaledb-tsl_16-2.21.0-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.0 · 739.3KiB timescaledb-tsl_16-2.20.3-1PGDG.rhel10.x86_64.rpm PGDG · 2.20.3 · 726.5KiB timescaledb-tsl_16-2.20.2-1PGDG.rhel10.x86_64.rpm PGDG · 2.20.2 · 723.1KiB timescaledb-tsl_16-2.20.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.20.1 · 723.6KiB
PIGSTY 2.26.3
el10.x86_64.pg15 : timescaledb-tsl_15
timescaledb-tsl_15-2.26.3-1PIGSTY.el10.x86_64.rpm PIGSTY · 2.26.3 · 775.3KiB timescaledb-tsl_15-2.26.3-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.3 · 755.7KiB timescaledb-tsl_15-2.26.2-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.2 · 755.2KiB timescaledb-tsl_15-2.26.1-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.1 · 754.3KiB timescaledb-tsl_15-2.26.0-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.26.0 · 754.0KiB timescaledb-tsl_15-2.25.2-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.25.2 · 731.2KiB timescaledb-tsl_15-2.25.1-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.25.1 · 727.9KiB timescaledb-tsl_15-2.25.0-1PGDG.rhel10.1.x86_64.rpm PGDG · 2.25.0 · 724.4KiB timescaledb-tsl_15-2.23.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.23.1 · 741.6KiB timescaledb-tsl_15-2.23.0-1PGDG.rhel10.x86_64.rpm PGDG · 2.23.0 · 739.2KiB timescaledb-tsl_15-2.22.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.22.1 · 736.3KiB timescaledb-tsl_15-2.22.0-1PGDG.rhel10.x86_64.rpm PGDG · 2.22.0 · 735.7KiB timescaledb-tsl_15-2.21.3-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.3 · 741.2KiB timescaledb-tsl_15-2.21.2-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.2 · 739.9KiB timescaledb-tsl_15-2.21.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.1 · 738.9KiB timescaledb-tsl_15-2.21.0-1PGDG.rhel10.x86_64.rpm PGDG · 2.21.0 · 738.6KiB timescaledb-tsl_15-2.20.3-1PGDG.rhel10.x86_64.rpm PGDG · 2.20.3 · 724.8KiB timescaledb-tsl_15-2.20.2-1PGDG.rhel10.x86_64.rpm PGDG · 2.20.2 · 721.9KiB timescaledb-tsl_15-2.20.1-1PGDG.rhel10.x86_64.rpm PGDG · 2.20.1 · 721.6KiB
PIGSTY MISS
el10.aarch64PIGSTY MISS
d12.x86_64
d12.aarch64
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.19.3
d13.x86_64
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY MISS
d13.aarch64
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY MISS
u22.x86_64
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.19.3
u22.aarch64
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.19.3
u24.x86_64
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.19.3
u24.aarch64
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.26.3
PIGSTY 2.19.3

构建

您可以使用 pig build 命令构建 timescaledb 扩展的 RPM / DEB 包:

pig build pkg timescaledb         # 构建 RPM / DEB 包

安装

您可以直接安装 timescaledb 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install timescaledb;          # 当前活跃 PG 版本安装
pig ext install -y timescaledb -v 18  # PG 18
pig ext install -y timescaledb -v 17  # PG 17
pig ext install -y timescaledb -v 16  # PG 16
pig ext install -y timescaledb -v 15  # PG 15
dnf install -y timescaledb-tsl_18       # PG 18
dnf install -y timescaledb-tsl_17       # PG 17
dnf install -y timescaledb-tsl_16       # PG 16
dnf install -y timescaledb-tsl_15       # PG 15
apt install -y postgresql-18-timescaledb-tsl   # PG 18
apt install -y postgresql-17-timescaledb-tsl   # PG 17
apt install -y postgresql-16-timescaledb-tsl   # PG 16
apt install -y postgresql-15-timescaledb-tsl   # PG 15

预加载配置

shared_preload_libraries = 'timescaledb';

创建扩展

CREATE EXTENSION timescaledb;

用法

创建一张表并将其转换为超表(hypertable)

DROP TABLE IF EXISTS ts_test;
CREATE TABLE ts_test
(
    ts TIMESTAMPTZ NOT NULL,
    id BIGINT,
    v  INTEGER -- 载荷数据
);
SELECT create_hypertable('ts_test', by_range('ts'));

INSERT INTO ts_test
    SELECT now() + (i || ' seconds')::INTERVAL, i, i % 100
    FROM generate_series(1, 1000000) i;

连续聚合示例:

CREATE MATERIALIZED VIEW ts_hourly
WITH (timescaledb.continuous) AS
  SELECT time_bucket('1 hour', ts) AS bucket,
         count(*) AS cnt,
         avg(v)   AS avg_v
  FROM ts_test
  GROUP BY bucket;

-- 添加刷新策略以保持连续聚合的数据是最新的
SELECT add_continuous_aggregate_policy('ts_hourly',
    start_offset    => INTERVAL '3 hours',
    end_offset      => INTERVAL '1 hour',
    schedule_interval => INTERVAL '1 hour');

任务调度示例:

SELECT add_job('SELECT 1','1h', initial_start => now()::timestamptz);

压缩示例:

ALTER TABLE ts_test SET (
    timescaledb.compress,
    timescaledb.compress_segmentby = 'id',
    timescaledb.compress_orderby = 'ts'
);

-- 添加压缩策略,自动压缩超过 1 天的数据块
SELECT add_compression_policy('ts_test', INTERVAL '1 day');

2 - timescaledb_toolkit

超表分析查询,时间序列流式处理,以及其他SQL工具

概览

扩展包名版本分类许可证语言
timescaledb_toolkit1.22.0TIMETimescaleRust
ID扩展名BinLibLoadCreateTrustReloc模式
1010timescaledb_toolkit-
相关扩展timescaledb timeseries periods temporal_tables emaj pg_cron pg_partman table_version

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.22.01817161514timescaledb_toolkit-
RPMPIGSTY1.22.01817161514timescaledb-toolkit_$v-
DEBPIGSTY1.22.01817161514postgresql-$v-timescaledb-toolkit-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY MISS
el8.aarch64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY MISS
el9.x86_64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY MISS
el9.aarch64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY MISS
el10.x86_64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY MISS
el10.aarch64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY MISS
d12.x86_64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.19.0
d12.aarch64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.19.0
d13.x86_64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY MISS
d13.aarch64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY MISS
u22.x86_64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.19.0
u22.aarch64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.19.0
u24.x86_64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.19.0
u24.aarch64
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.22.0
PIGSTY 1.19.0

构建

您可以使用 pig build 命令构建 timescaledb_toolkit 扩展的 RPM / DEB 包:

pig build pkg timescaledb_toolkit         # 构建 RPM / DEB 包

安装

您可以直接安装 timescaledb_toolkit 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install timescaledb_toolkit;          # 当前活跃 PG 版本安装
pig ext install -y timescaledb_toolkit -v 18  # PG 18
pig ext install -y timescaledb_toolkit -v 17  # PG 17
pig ext install -y timescaledb_toolkit -v 16  # PG 16
pig ext install -y timescaledb_toolkit -v 15  # PG 15
dnf install -y timescaledb-toolkit_18       # PG 18
dnf install -y timescaledb-toolkit_17       # PG 17
dnf install -y timescaledb-toolkit_16       # PG 16
dnf install -y timescaledb-toolkit_15       # PG 15
apt install -y postgresql-18-timescaledb-toolkit   # PG 18
apt install -y postgresql-17-timescaledb-toolkit   # PG 17
apt install -y postgresql-16-timescaledb-toolkit   # PG 16
apt install -y postgresql-15-timescaledb-toolkit   # PG 15

创建扩展

CREATE EXTENSION timescaledb_toolkit;

用法

TimescaleDB Toolkit 提供了一系列专用于时序数据分析的函数,采用两步聚合模式。大多数函数会先创建中间表示,再通过访问器函数进行查询,从而实现高效复用和多维分析。

近似分析

HyperLogLog - 基数估算

基于概率的去重计数,支持可配置精度,适用于高基数数据集。

-- 估算每日独立用户数
SELECT
    date_trunc('day', timestamp) as day,
    distinct_count(hyperloglog(64, user_id)) as unique_users
FROM events
GROUP BY day;

-- 跨分区合并计数
SELECT distinct_count(rollup(hll))
FROM (SELECT hyperloglog(32, session_id) as hll FROM events_2023
      UNION ALL
      SELECT hyperloglog(32, session_id) FROM events_2024) t;

T-Digest - 分位数近似

高精度百分位估算,针对尾部分位数(P95、P99)进行了优化。

-- 追踪响应时间百分位
SELECT
    service_name,
    approx_percentile(0.50, tdigest(100, response_time)) as p50,
    approx_percentile(0.95, tdigest(100, response_time)) as p95,
    approx_percentile(0.99, tdigest(100, response_time)) as p99
FROM api_metrics
GROUP BY service_name;

-- 结合连续聚合计算每小时百分位
CREATE MATERIALIZED VIEW hourly_percentiles AS
SELECT
    time_bucket('1 hour', timestamp) as hour,
    tdigest(200, response_time) as digest
FROM requests GROUP BY hour;

UddSketch - 有界误差分位数

带有最大相对误差保证的分位数估算。

-- 计算 CPU 利用率百分位,最大误差 1%
SELECT
    host_id,
    approx_percentile(0.95, uddsketch(100, 0.01, cpu_percent)) as p95_cpu,
    error(uddsketch(100, 0.01, cpu_percent)) as actual_error
FROM system_metrics
GROUP BY host_id;

计数器分析

计数器聚合 - 单调递增指标

处理单调递增的计数器,自动检测重置。

-- 计算请求速率
SELECT
    time_bucket('5 min', timestamp) as bucket,
    rate(counter_agg(timestamp, request_count)) as requests_per_sec,
    delta(counter_agg(timestamp, request_count)) as total_requests
FROM metrics
GROUP BY bucket;

-- 对不完整时间桶进行外推速率计算
SELECT
    extrapolated_rate(
        counter_agg(timestamp, bytes_sent,
                   bounds => time_bucket_range('1 hour', timestamp))
    ) as bytes_per_second
FROM network_stats;

仪表聚合 - 波动指标

用于分析上下波动的指标(如温度、内存使用量)。

-- 温度变化分析
SELECT
    sensor_id,
    delta(gauge_agg(timestamp, temperature)) as temp_delta,
    rate(gauge_agg(timestamp, temperature)) as temp_rate_per_sec
FROM weather_data
GROUP BY sensor_id;

时间加权分析

时间加权平均

处理不规则采样数据,支持插值方法(LOCF 末次观测值保持、Linear 线性插值)。

-- 对不规则传感器读数计算加权平均
SELECT
    device_id,
    average(time_weight('LOCF', timestamp, sensor_value)) as weighted_avg,
    average(time_weight('Linear', timestamp, sensor_value)) as linear_avg
FROM iot_readings
GROUP BY device_id;

-- 合并多个时间范围
SELECT average(rollup(tw))
FROM (SELECT time_weight('LOCF', ts, val) as tw FROM readings_2023
      UNION ALL
      SELECT time_weight('LOCF', ts, val) FROM readings_2024) t;

数据可视化

LTTB 降采样

在保持视觉相似性的前提下对时序数据进行降采样,适用于图表展示。

-- 将 10 万个数据点降采样为 1000 个用于可视化
SELECT time, value
FROM unnest((
    SELECT lttb(timestamp, price, 1000)
    FROM stock_prices
    WHERE symbol = 'AAPL'
));

ASAP 平滑

通过降噪生成易于阅读的图表,同时保留趋势特征。

-- 将每日数据平滑为周粒度
SELECT time, value
FROM unnest((
    SELECT asap_smooth(date, daily_sales, 52)
    FROM sales_data
    WHERE date >= '2023-01-01'
));

统计分析

统计聚合

提供全面的统计分析能力,支持一维和二维回归分析。

-- 多变量分析
SELECT
    -- 基础统计量
    average(stats_agg(response_time)) as avg_response,
    stddev(stats_agg(response_time)) as response_stddev,

    -- 回归分析
    slope(stats_agg(response_time, request_size)) as size_impact,
    corr(stats_agg(response_time, request_size)) as correlation,
    determination_coeff(stats_agg(response_time, request_size)) as r_squared
FROM performance_data;

Timevector 数据类型

用于时序操作的高效中间表示。

-- 创建和操作 timevector
CREATE VIEW cpu_series AS
SELECT host_id, timevector(timestamp, cpu_percent) as ts
FROM system_metrics GROUP BY host_id;

-- 对 timevector 进行链式操作
SELECT host_id, unnest(lttb(ts, 100))
FROM cpu_series;

集成模式

连续聚合支持

大多数 Toolkit 函数可与 TimescaleDB 连续聚合无缝配合使用:

CREATE MATERIALIZED VIEW hourly_analytics AS
SELECT
    time_bucket('1 hour', timestamp) as hour,
    service_name,
    tdigest(100, response_time) as response_digest,
    counter_agg(timestamp, request_count) as request_counter,
    hyperloglog(64, user_id) as unique_users
FROM api_events
GROUP BY hour, service_name;

-- 查询预计算的聚合结果
SELECT
    hour,
    approx_percentile(0.95, response_digest) as p95_response,
    rate(request_counter) as req_per_sec,
    distinct_count(unique_users) as unique_users
FROM hourly_analytics
WHERE hour >= NOW() - INTERVAL '24 hours';

两步分析模式

存储中间聚合结果,支持多维度分析复用:

-- 第一步:创建聚合
CREATE TABLE daily_summaries AS
SELECT
    date_trunc('day', timestamp) as day,
    tdigest(200, response_time) as response_digest,
    stats_agg(response_time, request_size) as stats
FROM requests GROUP BY day;

-- 第二步:基于同一份数据进行多维分析
SELECT
    day,
    approx_percentile(0.50, response_digest) as median,
    approx_percentile(0.99, response_digest) as p99,
    average(stats) as avg_response,
    slope(stats) as size_correlation
FROM daily_summaries;

所有位于 experimental 模式(toolkit_experimental)中的函数可能会在版本间发生变化。生产环境中如需 API 稳定性保证,请使用稳定版函数。

3 - timeseries

时序数据API封装

概览

扩展包名版本分类许可证语言
pg_timeseries0.2.0TIMEPostgreSQLSQL
ID扩展名BinLibLoadCreateTrustReloc模式
1020timeseries-
相关扩展pg_cron pg_partman timescaledb timescaledb_toolkit periods temporal_tables emaj table_version pg_task pg_later

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.2.01817161514pg_timeseriespg_cron, pg_partman
RPMPIGSTY0.2.01817161514pg_timeseries_$vpg_cron_$v, pg_partman_$v
DEBPIGSTY0.2.01817161514postgresql-$v-pg-timeseriespostgresql-$v-cron, postgresql-$v-partman
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
d12.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
d13.x86_64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
d13.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
u22.x86_64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
u22.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
u24.x86_64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
u24.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0

构建

您可以使用 pig build 命令构建 pg_timeseries 扩展的 RPM / DEB 包:

pig build pkg pg_timeseries         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_timeseries 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_timeseries;          # 当前活跃 PG 版本安装
pig ext install -y pg_timeseries -v 18  # PG 18
pig ext install -y pg_timeseries -v 17  # PG 17
pig ext install -y pg_timeseries -v 16  # PG 16
pig ext install -y pg_timeseries -v 15  # PG 15
pig ext install -y pg_timeseries -v 14  # PG 14
dnf install -y pg_timeseries_18       # PG 18
dnf install -y pg_timeseries_17       # PG 17
dnf install -y pg_timeseries_16       # PG 16
dnf install -y pg_timeseries_15       # PG 15
dnf install -y pg_timeseries_14       # PG 14
apt install -y postgresql-18-pg-timeseries   # PG 18
apt install -y postgresql-17-pg-timeseries   # PG 17
apt install -y postgresql-16-pg-timeseries   # PG 16
apt install -y postgresql-15-pg-timeseries   # PG 15
apt install -y postgresql-14-pg-timeseries   # PG 14

创建扩展

CREATE EXTENSION timeseries CASCADE;  -- 依赖: pg_cron, pg_partman

用法

pg_timeseries: 时间序列便捷 API

本扩展为时间序列表的创建、维护和使用提供了一致的用户体验。

快速开始

假设你已经有一张分区表,只需调用 enable_ts_table 函数即可启用时间序列功能:

CREATE EXTENSION timeseries CASCADE;

SELECT enable_ts_table('sensor_readings');

这一调用会自动完成以下操作:

  • 使用 PostgreSQL 原生分区功能将表重构为一系列分区
  • 每个分区覆盖一段时间范围(默认一周)
  • 自动为未来创建新分区(默认提前一个月)
  • 每小时运行一次维护任务,创建缺失的分区和未来所需的分区

使用表

索引

时间序列表本质上就是标准的 PostgreSQL 分区表,所有 PostgreSQL 的现有功能都能正常使用。

传统 B-Tree 索引适用于时间序列数据,但在某些查询场景下(通常是返回大量结果的查询),BRIN 索引可能表现更优。如果每个分区不超过一百万条记录,建议先用 B-Tree。

分区大小

扩展提供了 ts_part_info 视图,可方便查看各分区的数据大小、索引大小和总大小。一般建议每个分区能容纳在可用内存的约四分之一以内。

数据保留

调用 set_ts_retention_policy 设置保留策略,超出保留窗口的分区每小时会被自动删除。使用 clear_ts_retention_policy 恢复默认行为(无限保留)。

压缩

调用 set_ts_compression_policy 可对超过指定时间间隔的分区使用列式存储进行压缩。压缩功能依赖 citus 和 citus_columnar 扩展:

CREATE EXTENSION citus;
CREATE EXTENSION citus_columnar;

分析辅助函数

firstlast

按一个维度分组,但按另一个维度取首条/末条记录:

SELECT machine_id,
       last(cpu_util, recorded_at)
FROM events
GROUP BY machine_id;

date_bin_table

自动将时间序列值对齐到指定步长,并为无数据的时间段补充 NULL 行:

SELECT * FROM date_bin_table(NULL::target_table, '1 hour', '[2024-02-01 00:00, 2024-02-02 15:00]');

输出结果与直接查表相比有三点不同:

  • 按时间升序排列
  • 时间列的值对齐到指定步长
  • 无数据的时间段会补充 NULL 行

make_view_incremental

将普通视图转换为自动保持更新的增量物化视图,无需手动 REFRESH。该功能基于 pg_ivm 实现:

CREATE EXTENSION pg_ivm;

依赖

可选依赖

4 - periods

为 PERIODs 和 SYSTEM VERSIONING 提供标准 SQL 功能

概览

扩展包名版本分类许可证语言
periods1.2.3TIMEPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
1030periods-
相关扩展btree_gist timescaledb_toolkit timescaledb timeseries temporal_tables emaj table_version pg_cron pg_partman

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.2.31817161514periodsbtree_gist
RPMPGDG1.2.31817161514periods_$v-
DEBPGDG1.2.31817161514postgresql-$v-periods-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
d12.aarch64
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
d13.x86_64
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
d13.aarch64
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
u22.x86_64
u22.aarch64
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
u24.x86_64
u24.aarch64
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3
PGDG 1.2.3

构建

您可以使用 pig build 命令构建 periods 扩展的 RPM 包:

pig build pkg periods         # 构建 RPM 包

安装

您可以直接安装 periods 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install periods;          # 当前活跃 PG 版本安装
pig ext install -y periods -v 18  # PG 18
pig ext install -y periods -v 17  # PG 17
pig ext install -y periods -v 16  # PG 16
pig ext install -y periods -v 15  # PG 15
pig ext install -y periods -v 14  # PG 14
dnf install -y periods_18       # PG 18
dnf install -y periods_17       # PG 17
dnf install -y periods_16       # PG 16
dnf install -y periods_15       # PG 15
dnf install -y periods_14       # PG 14
apt install -y postgresql-18-periods   # PG 18
apt install -y postgresql-17-periods   # PG 17
apt install -y postgresql-16-periods   # PG 16
apt install -y postgresql-15-periods   # PG 15
apt install -y postgresql-14-periods   # PG 14

创建扩展

CREATE EXTENSION periods CASCADE;  -- 依赖: btree_gist

用法

periods: PostgreSQL 的时间段与系统版本控制

本扩展实现了 SQL:2016 标准(最初于 SQL:2011 引入)中关于时间段(Period)和 SYSTEM VERSIONING 系统版本控制的行为。

什么是时间段?

时间段是表上的一个定义,指定一个名称和两个列。时间段的值包含起始值,但不包含结束值。

-- 标准 SQL 语法
CREATE TABLE example (
    id bigint,
    start_date date,
    end_date date,
    PERIOD FOR validity (start_date, end_date)
);

由于扩展无法修改 PostgreSQL 的语法,我们通过函数、视图和触发器来尽可能模拟相同的行为:

CREATE TABLE example (
    id bigint,
    start_date date,
    end_date date
);
SELECT periods.add_period('example', 'validity', 'start_date', 'end_date');

定义时间段后,会约束两列:起始值必须严格小于结束值,且两列均不能为空。

唯一约束

时间段可以作为 PRIMARY KEYUNIQUE 约束的一部分:

CREATE TABLE example (
    id bigint,
    start_date date,
    end_date date
);
SELECT periods.add_period('example', 'validity', 'start_date', 'end_date');
SELECT periods.add_unique_key('example', ARRAY['id'], 'validity');

扩展会创建一个覆盖所有指定列和时间段两列的唯一约束,并通过 GiST 排他约束实现 WITHOUT OVERLAPS 语义。

外键

有了带时间段的唯一键,就可以创建指向它们的外键:

SELECT periods.add_foreign_key('example2', 'ARRAY[ex_id]', 'validity', 'example_id_validity');

部分操作

SQL 标准允许对时间段的一部分进行更新或删除,扩展通过 INSTEAD OF 触发器的视图来实现:

UPDATE example__for_portion_of_validity
SET ...,
    start_date = ...,
    end_date = ...
WHERE ...;

使用此功能前,表必须有主键。

谓词函数

SQL 标准定义了多种时间段谓词,以内联函数形式实现:

-- "t" 和 "u" 是具有时间段 "p" 和 "q" 的表
-- 两个时间段的底层列为 "s" 和 "e"

WHERE periods.contains(t.s, t.e, 42)            -- t.p CONTAINS 42
WHERE periods.contains(t.s, t.e, u.s, u.e)      -- t.p CONTAINS u.q
WHERE periods.equals(t.s, t.e, u.s, u.e)        -- t.p EQUALS u.q
WHERE periods.overlaps(t.s, t.e, u.s, u.e)      -- t.p OVERLAPS u.q
WHERE periods.precedes(t.s, t.e, u.s, u.e)      -- t.p PRECEDES u.q
WHERE periods.succeeds(t.s, t.e, u.s, u.e)      -- t.p SUCCEEDS u.q
WHERE periods.immediately_precedes(t.s, t.e, u.s, u.e)  -- t.p IMMEDIATELY PRECEDES u.q
WHERE periods.immediately_succeeds(t.s, t.e, u.s, u.e)  -- t.p IMMEDIATELY SUCCEEDS u.q

系统版本控制表

SYSTEM_TIME

如果时间段名为 SYSTEM_TIME,则适用特殊规则。列类型必须是 datetimestamp without time zonetimestamp with time zone,且用户不可修改。扩展使用触发器将起始列设为 transaction_timestamp(),结束列始终为 'infinity'

注意: 一般建议使用 timestamp with time zone,因为时区配置参数或夏令时变更可能导致历史记录失真。

CREATE TABLE example (
    id bigint PRIMARY KEY,
    value text
);
SELECT periods.add_system_time_period('example', 'row_start', 'row_end');

这些列无需预先存在——扩展会自动创建。

排除列

可以阻止某些列的更新触发 SYSTEM_TIME 值变化:

SELECT periods.add_system_time_period(
            'example',
            excluded_column_names => ARRAY['foo', 'bar']);

启用系统版本控制

SELECT periods.add_system_time_period('example', 'row_start', 'row_end');
SELECT periods.add_system_versioning('example');

系统会将所有变更记录到一张独立的历史表中。你也可以自行创建历史表(例如添加分区)并指定扩展使用它。

时态查询

SQL 标准扩展了 FROMJOIN 子句以支持时间点或时间范围查询,扩展通过内联函数实现:

SELECT * FROM t__as_of('...');                       -- FOR system_time AS OF '...'
SELECT * FROM t__from_to('...', '...');              -- FOR system_time FROM '...' TO '...'
SELECT * FROM t__between('...', '...');              -- FOR system_time BETWEEN '...' AND '...'
SELECT * FROM t__between_symmetric('...', '...');    -- FOR system_time BETWEEN SYMMETRIC '...' AND '...'

访问控制

历史表及辅助函数遵循基表的所有权和访问权限。历史数据为只读。如需清理旧数据,必须先暂停系统版本控制:

BEGIN;
SELECT periods.drop_system_versioning('t');
GRANT DELETE ON TABLE t TO CURRENT_USER;
DELETE FROM t_history WHERE system_time_end < now() - interval '1 year';
SELECT periods.add_system_versioning('t');
COMMIT;

5 - temporal_tables

时态表功能支持

概览

扩展包名版本分类许可证语言
temporal_tables1.2.2TIMEBSD 2-ClauseC
ID扩展名BinLibLoadCreateTrustReloc模式
1040temporal_tables-
相关扩展timescaledb_toolkit timescaledb timeseries periods emaj table_version pg_cron pg_partman

no pg17 on el8/9 pgdg repo

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.2.21817161514temporal_tables-
RPMPIGSTY1.2.21817161514temporal_tables_$v-
DEBPIGSTY1.2.21817161514postgresql-$v-temporal-tables-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
PIGSTY 1.2.2
PIGSTY 1.2.2
el9.x86_64
el9.aarch64
PIGSTY 1.2.2
el10.x86_64
PIGSTY 1.2.2
el10.aarch64
PIGSTY 1.2.2
d12.x86_64
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
d12.aarch64
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
d13.x86_64
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
d13.aarch64
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
u22.x86_64
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
u22.aarch64
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
u24.x86_64
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
u24.aarch64
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2
PIGSTY 1.2.2

构建

您可以使用 pig build 命令构建 temporal_tables 扩展的 RPM / DEB 包:

pig build pkg temporal_tables         # 构建 RPM / DEB 包

安装

您可以直接安装 temporal_tables 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install temporal_tables;          # 当前活跃 PG 版本安装
pig ext install -y temporal_tables -v 18  # PG 18
pig ext install -y temporal_tables -v 17  # PG 17
pig ext install -y temporal_tables -v 16  # PG 16
pig ext install -y temporal_tables -v 15  # PG 15
pig ext install -y temporal_tables -v 14  # PG 14
dnf install -y temporal_tables_18       # PG 18
dnf install -y temporal_tables_17       # PG 17
dnf install -y temporal_tables_16       # PG 16
dnf install -y temporal_tables_15       # PG 15
dnf install -y temporal_tables_14       # PG 14
apt install -y postgresql-18-temporal-tables   # PG 18
apt install -y postgresql-17-temporal-tables   # PG 17
apt install -y postgresql-16-temporal-tables   # PG 16
apt install -y postgresql-15-temporal-tables   # PG 15
apt install -y postgresql-14-temporal-tables   # PG 14

创建扩展

CREATE EXTENSION temporal_tables;

用法

temporal_tables: PostgreSQL 系统时段时态表

时态表(temporal table)是一种记录行有效时间段的表。系统时段(system period)是由系统自动维护的列(或列对),包含该行在数据库层面有效的时间范围。当你向这样的表中插入行时,系统会自动生成时段的起止值。当你更新或删除系统时段时态表中的行时,旧版本会自动归档到另一张表——即历史表(history table)。

更多用法可参考这篇优秀教程

创建系统时段时态表

该扩展使用一个通用触发器函数来维护系统时段时态表的行为:

versioning(<system_period_column_name>, <history_table_name>, <adjust>)

首先,创建一张表并添加系统时段列:

CREATE TABLE employees (
  name text NOT NULL PRIMARY KEY,
  department text,
  salary numeric(20, 2)
);

ALTER TABLE employees ADD COLUMN sys_period tstzrange NOT NULL;

然后创建历史表:

CREATE TABLE employees_history (LIKE employees);

历史表必须包含与原表同名、同类型的系统时段列。如果两张表都包含某列,则数据类型必须相同。

最后,创建触发器将其与历史表关联:

CREATE TRIGGER versioning_trigger
BEFORE INSERT OR UPDATE OR DELETE ON employees
FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period',
                                          'employees_history',
                                          true);

插入数据

向系统时段时态表插入数据与普通表类似:

INSERT INTO employees (name, department, salary)
VALUES ('Bernard Marx', 'Hatchery and Conditioning Centre', 10000);

INSERT INTO employees (name, department, salary)
VALUES ('Lenina Crowne', 'Hatchery and Conditioning Centre', 7000);

sys_period 列的起始值表示该行何时变为当前版本,由 CURRENT_TIMESTAMP 自动生成。

更新数据

当用户更新行时,触发器会将旧行的副本插入历史表。如果单个事务内对同一行进行了多次更新,只会生成一条历史记录:

UPDATE employees SET salary = 11200 WHERE name = 'Bernard Marx';

此时历史表包含之前的版本:

namedepartmentsalarysys_period
Bernard MarxHatchery and Conditioning Centre10000[2006-08-08, 2007-02-27)

更新冲突与时间调整

当多个事务更新同一行时,可能会发生更新冲突。当 adjust 参数设为 true 时,sys_period 的起始值会通过加上一个微小的时间增量(通常为 1 微秒)来避免冲突,否则会抛出 SQLSTATE 22000 错误。

删除数据

当用户删除数据时,触发器同样会将行添加到历史表:

DELETE FROM employees WHERE name = 'Helmholtz Watson';

高级用法

你可以为版本控制触发器设置自定义系统时间,这在从已记录时间戳的系统构建数据仓库时非常有用:

SELECT set_system_time('1985-08-08 06:42:00+08');

恢复默认行为:

SELECT set_system_time(NULL);

如果在随后被中止的事务中执行,所有更改都会撤销。如果已提交,更改将持续到会话结束。

示例与技巧

使用继承创建历史表

CREATE TABLE employees_history (
  name text NOT NULL,
  department text,
  salary numeric(20, 2),
  sys_period tstzrange NOT NULL
);

CREATE TABLE employees (PRIMARY KEY(name)) INHERITS (employees_history);

历史表清理

历史表会持续增长。以下是几种清理策略:

  1. 定期删除历史表中的旧数据。
  2. 使用分区,并将旧分区从历史表中分离。
  3. 仅保留每行的最近 N 个版本。
  4. 当时态表中的对应行被删除时,同步清理历史记录。
  5. 按业务规则清理符合条件的行。

你也可以将历史表设置到另一个表空间,将其迁移到更廉价的存储上。

数据审计

你可以添加触发器来记录修改或删除当前行的用户:

CREATE FUNCTION employees_modify()
RETURNS TRIGGER AS $$
BEGIN
  NEW.user_modified = SESSION_USER;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER employees_modify
BEFORE INSERT OR UPDATE ON employees
FOR EACH ROW EXECUTE PROCEDURE employees_modify();

CREATE FUNCTION employees_delete()
RETURNS TRIGGER AS $$
BEGIN
  NEW.user_deleted = SESSION_USER;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER employees_delete
BEFORE INSERT ON employees_history
FOR EACH ROW EXECUTE PROCEDURE employees_delete();

6 - emaj

让数据库的子集具有细粒度日志和时间旅行功能

概览

扩展包名版本分类许可证语言
emaj4.7.1TIMEGPL-3.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1050emajemaj
相关扩展dblink btree_gist timescaledb_toolkit timescaledb periods temporal_tables table_version pg_cron pg_partman timeseries

max_prepared_transactions

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED4.7.11817161514emajdblink, btree_gist
RPMPGDG4.7.11817161514e-maj_$v-
DEBPIGSTY4.7.11817161514postgresql-$v-emaj-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

构建

您可以使用 pig build 命令构建 emaj 扩展的 DEB 包:

pig build pkg emaj         # 构建 DEB 包

安装

您可以直接安装 emaj 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install emaj;          # 当前活跃 PG 版本安装
pig ext install -y emaj -v 18  # PG 18
pig ext install -y emaj -v 17  # PG 17
pig ext install -y emaj -v 16  # PG 16
pig ext install -y emaj -v 15  # PG 15
pig ext install -y emaj -v 14  # PG 14
dnf install -y e-maj_18       # PG 18
dnf install -y e-maj_17       # PG 17
dnf install -y e-maj_16       # PG 16
dnf install -y e-maj_15       # PG 15
dnf install -y e-maj_14       # PG 14
apt install -y postgresql-18-emaj   # PG 18
apt install -y postgresql-17-emaj   # PG 17
apt install -y postgresql-16-emaj   # PG 16
apt install -y postgresql-15-emaj   # PG 15
apt install -y postgresql-14-emaj   # PG 14

创建扩展

CREATE EXTENSION emaj CASCADE;  -- 依赖: dblink, btree_gist

用法

E-Maj: 记录并回滚表内容变更

文档 | Emaj_web 图形界面

E-Maj 记录表上执行的变更操作(Insert、Update、Delete、Truncate),涵盖一个或多个表集合,并可在需要时高效地撤销这些变更,将表集合恢复到预定义的稳定状态。

开发环境中,它可以轻松回滚程序执行产生的所有更新,方便反复重放测试流程。

生产环境中,它提供:

  • 表变更历史记录,供检查与审计
  • 表组的批间保存点
  • 无需停机即可将表组"恢复"到稳定状态
  • 批处理窗口内的多个保存点,每个都可用作恢复点

核心概念

表组(Tables Group)

表组是一组生命节奏相同的应用表——它们的内容可以作为整体恢复。一个组可以包含不同 schema 中的表和序列。每个组处于两种状态之一:LOGGING(记录中)或 IDLE(空闲),并可指定为:

  • ROLLBACKABLE(标准)——支持记录和回滚
  • AUDIT_ONLY——只记录变更,不支持回滚,适用于没有主键的表或 UNLOGGED 表

标记(Mark)

标记代表表组生命周期中的快照时刻,捕获所有组成员的稳定状态。标记名称在组内唯一。

回滚(Rollback)

回滚操作将表和序列恢复到建立特定标记时的状态:

  • 非日志回滚(Unlogged rollback)——撤销的更新不留痕迹
  • 日志回滚(Logged rollback)——撤销操作也会被记录,允许后续再次反转

注意:E-Maj 的回滚与 PostgreSQL 原生的事务回滚有本质区别。

主要函数

启动表组

SELECT emaj.emaj_start_group('my_group', 'mark_1');

激活变更记录。表组必须处于 IDLE 状态。会自动创建初始标记。

设置中间标记

SELECT emaj.emaj_set_mark_group('my_group', 'mark_2');

记录应用状态的时间点快照。表组必须处于 LOGGING 状态。

回滚表组

非日志回滚(恢复表,不留撤销痕迹):

SELECT * FROM emaj.emaj_rollback_group('my_group', 'mark_1');

日志回滚(允许撤销本次回滚):

SELECT * FROM emaj.emaj_logged_rollback_group('my_group', 'mark_1');

两者都支持 '_EMAJ_LAST_MARK_' 关键字来指定最近的标记。

停止表组

SELECT emaj.emaj_stop_group('my_group');

停用记录功能,将表组状态从 LOGGING 切换为 IDLE。

多组操作

支持同时对多个表组进行批量操作:

SELECT emaj.emaj_start_groups('{"group1","group2"}', 'multi_mark');
SELECT emaj.emaj_set_mark_groups('{"group1","group2"}', 'common_mark');
SELECT * FROM emaj.emaj_rollback_groups('{"group1","group2"}', 'common_mark');
SELECT emaj.emaj_stop_groups('{"group1","group2"}');

变更检查

E-Maj 提供函数用于统计和检查标记之间的数据变更内容,并可生成重放已记录变更的 SQL 脚本。这对审计和调试非常有用。

Emaj_web

Emaj_web 是一个基于 PHP 的 Web 图形管理工具,提供友好的 E-Maj 管理界面。可在 GitHub 获取,详见文档

7 - table_version

PostgreSQL 版本控制表扩展

概览

扩展包名版本分类许可证语言
table_version1.11.1TIMEBSD 3-ClauseSQL
ID扩展名BinLibLoadCreateTrustReloc模式
1060table_versiontable_version
相关扩展plpgsql periods temporal_tables emaj pg_cron timescaledb timescaledb_toolkit timeseries pg_task

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.11.11817161514table_versionplpgsql
RPMPIGSTY1.11.11817161514table_version_$v-
DEBPIGSTY1.11.11817161514postgresql-$v-table-version-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
d13.x86_64
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
d13.aarch64
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
u22.x86_64
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
u22.aarch64
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
u24.x86_64
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
u24.aarch64
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1
PIGSTY 1.11.1

构建

您可以使用 pig build 命令构建 table_version 扩展的 DEB 包:

pig build pkg table_version         # 构建 DEB 包

安装

您可以直接安装 table_version 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install table_version;          # 当前活跃 PG 版本安装
pig ext install -y table_version -v 18  # PG 18
pig ext install -y table_version -v 17  # PG 17
pig ext install -y table_version -v 16  # PG 16
pig ext install -y table_version -v 15  # PG 15
pig ext install -y table_version -v 14  # PG 14
dnf install -y table_version_18       # PG 18
dnf install -y table_version_17       # PG 17
dnf install -y table_version_16       # PG 16
dnf install -y table_version_15       # PG 15
dnf install -y table_version_14       # PG 14
apt install -y postgresql-18-table-version   # PG 18
apt install -y postgresql-17-table-version   # PG 17
apt install -y postgresql-16-table-version   # PG 16
apt install -y postgresql-15-table-version   # PG 15
apt install -y postgresql-14-table-version   # PG 14

创建扩展

CREATE EXTENSION table_version CASCADE;  -- 依赖: plpgsql

用法

table_version: PostgreSQL 表版本控制扩展

PostgreSQL 表版本控制扩展,记录行的修改及其历史。该扩展提供 API 用于获取表在特定版本的快照,以及任意两个版本之间的差异。它基于 PL/PgSQL 触发器系统来记录和访问行版本。

快速开始

CREATE EXTENSION table_version;

CREATE SCHEMA foo;
SET search_path TO foo, public;

CREATE TABLE foo.bar (
    id INTEGER NOT NULL PRIMARY KEY,
    baz TEXT
);

-- 启用版本控制
SELECT table_version.ver_enable_versioning('foo', 'bar');

-- 创建版本并插入数据
SELECT table_version.ver_create_revision('Insert data');
INSERT INTO foo.bar (id, baz) VALUES
  (1, 'foo bar 1'),
  (2, 'foo bar 2'),
  (3, 'foo bar 3');
SELECT table_version.ver_complete_revision();

-- 查看两个版本之间的差异
SELECT * FROM table_version.ver_get_foo_bar_diff(1001, 1002);

工作原理

启用表版本控制后,原始表数据保持不变,系统会创建一张新的版本表,包含原表所有字段加上 _revision_created_revision_expired 字段。原表上会设置行级触发器,记录每一次插入、更新和删除到版本数据表中。同时设置语句级触发器,禁止 TRUNCATE 操作。

表的前置条件

  • 表必须有唯一的非复合 integer、bigint、text 或 varchar 列
  • 表不能是临时表

自动版本

如果你不想显式调用 ver_create_revisionver_complete_revision,自动版本模式会按事务对编辑进行分组:

SELECT table_version.ver_enable_versioning('foo', 'bar');

BEGIN;
INSERT INTO foo.bar (id, baz) VALUES (1, 'foo bar 1');
INSERT INTO foo.bar (id, baz) VALUES (2, 'foo bar 2');
COMMIT;

BEGIN;
UPDATE foo.bar SET baz = 'foo bar 1 edit' WHERE id = 1;
COMMIT;

SELECT * FROM table_version.foo_bar_revision;

版本消息会根据事务 ID 自动创建。

使用表差异复制数据

要在远程系统上维护一份表数据的副本:

-- 1. 确定哪些表已启用版本控制
SELECT * FROM table_version.ver_get_versioned_tables();

-- 2. 获取基准版本
SELECT table_version.ver_get_table_base_revision('foo', 'bar');

-- 3. 创建基准快照
CREATE TABLE foo_bar_copy AS
SELECT * FROM table_version.ver_get_foo_bar_revision(
    table_version.ver_get_table_base_revision('foo', 'bar')
);

-- 4. 获取差异以进行增量更新
SELECT * FROM table_version.ver_get_foo_bar_diff(
    my_last_revision,
    table_version.ver_get_table_last_revision('foo', 'bar')
);

安全模型

  • 任何人都可以创建版本
  • 版本只能由其创建者完成
  • 只有拥有表所有权权限的人才能启用/禁用版本控制
  • 只有空版本可以被删除
  • 只有版本创建者才能删除该版本

注意:禁用表的版本控制会导致该表的所有历史记录被删除。

主要函数

函数说明
ver_enable_versioning(schema, table)启用表的版本控制
ver_disable_versioning(schema, table)禁用版本控制并删除历史
ver_create_revision(comment)创建新版本
ver_complete_revision()标记当前版本为已完成
ver_get_<schema>_<table>_diff(rev1, rev2)获取两个版本之间的差异
ver_get_<schema>_<table>_revision(rev)获取特定版本的快照
ver_get_versioned_tables()列出所有已版本控制的表
ver_get_last_revision()获取最后的版本号

8 - pg_cron

定时任务调度器

概览

扩展包名版本分类许可证语言
pg_cron1.6.7TIMEPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
1070pg_cronpg_catalog
相关扩展timescaledb_toolkit timescaledb periods temporal_tables pg_task pg_later emaj table_version
下游依赖documentdb pg_incremental timeseries vectorize pgmb

require cron.database_name

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.6.71817161514pg_cron-
RPMPGDG1.6.71817161514pg_cron_$v-
DEBPGDG1.6.71817161514postgresql-$v-cron-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
d12.aarch64
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
d13.x86_64
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
d13.aarch64
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
PGDG 1.6.7
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

安装

您可以直接安装 pg_cron 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_cron;          # 当前活跃 PG 版本安装
pig ext install -y pg_cron -v 18  # PG 18
pig ext install -y pg_cron -v 17  # PG 17
pig ext install -y pg_cron -v 16  # PG 16
pig ext install -y pg_cron -v 15  # PG 15
pig ext install -y pg_cron -v 14  # PG 14
dnf install -y pg_cron_18       # PG 18
dnf install -y pg_cron_17       # PG 17
dnf install -y pg_cron_16       # PG 16
dnf install -y pg_cron_15       # PG 15
dnf install -y pg_cron_14       # PG 14
apt install -y postgresql-18-cron   # PG 18
apt install -y postgresql-17-cron   # PG 17
apt install -y postgresql-16-cron   # PG 16
apt install -y postgresql-15-cron   # PG 15
apt install -y postgresql-14-cron   # PG 14

预加载配置

shared_preload_libraries = 'pg_cron';

创建扩展

CREATE EXTENSION pg_cron;

用法

请注意,cron.database 必须在将 pg_cron 添加到 shared_preload_libraries 之前设置好。

-- 每周六凌晨 3:30(GMT)删除过期数据
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
 schedule
----------
       42

-- 每天上午 10:00(GMT)执行 VACUUM
SELECT cron.schedule('nightly-vacuum', '0 10 * * *', 'VACUUM');
 schedule
----------
       43

-- 改为每天凌晨 3:00(GMT)执行 VACUUM
SELECT cron.schedule('nightly-vacuum', '0 3 * * *', 'VACUUM');
 schedule
----------
       43

-- 取消定时任务
SELECT cron.unschedule('nightly-vacuum' );
 unschedule
------------
 t

SELECT cron.unschedule(42);
 unschedule
------------
          t

-- 每周日凌晨 4:00(GMT)在 pg_cron 所在数据库之外的其他数据库中执行 VACUUM
SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'some_other_database');
 schedule
----------
       44

-- 每 5 秒调用一次存储过程
SELECT cron.schedule('process-updates', '5 seconds', 'CALL process_updates()');

-- 每月最后一天中午 12:00 执行工资处理
SELECT cron.schedule('process-payroll', '0 12 $ * *', 'CALL process_payroll()');

Crontab 格式说明:

 ┌───────────── 分钟 (0 - 59)
 │ ┌────────────── 小时 (0 - 23)
 │ │ ┌─────────────── 日期 (1 - 31) 或月末最后一天 ($)
 │ │ │ ┌──────────────── 月份 (1 - 12)
 │ │ │ │ ┌───────────────── 星期 (0 - 6)(0 到 6 表示周日到
 │ │ │ │ │                  周六,也可使用英文名称;7 同样表示周日)
 │ │ │ │ │
 │ │ │ │ │
 * * * * *

9 - pg_task

在特定时间点在后台执行SQL命令

概览

扩展包名版本分类许可证语言
pg_task1.0.0TIMEMITC
ID扩展名BinLibLoadCreateTrustReloc模式
1080pg_task-
相关扩展timescaledb pg_cron pg_later pg_background pg_partman timescaledb_toolkit timeseries periods

breaks on many systems

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.0.01817161514pg_task-
RPMPGDG2.1.71817161514pg_task_$v-
DEBPIGSTY2.1.121817161514postgresql-$v-pg-task-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
u24.x86_64
u24.aarch64
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12

构建

您可以使用 pig build 命令构建 pg_task 扩展的 DEB 包:

pig build pkg pg_task         # 构建 DEB 包

安装

您可以直接安装 pg_task 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_task;          # 当前活跃 PG 版本安装
pig ext install -y pg_task -v 18  # PG 18
pig ext install -y pg_task -v 17  # PG 17
pig ext install -y pg_task -v 16  # PG 16
pig ext install -y pg_task -v 15  # PG 15
pig ext install -y pg_task -v 14  # PG 14
dnf install -y pg_task_18       # PG 18
dnf install -y pg_task_17       # PG 17
dnf install -y pg_task_16       # PG 16
dnf install -y pg_task_15       # PG 15
dnf install -y pg_task_14       # PG 14
apt install -y postgresql-18-pg-task   # PG 18
apt install -y postgresql-17-pg-task   # PG 17
apt install -y postgresql-16-pg-task   # PG 16
apt install -y postgresql-15-pg-task   # PG 15
apt install -y postgresql-14-pg-task   # PG 14

预加载配置

shared_preload_libraries = 'pg_task';

用法

pg_task: PostgreSQL 任务调度器

pg_task 允许在后台异步地在任意指定时间执行任意 SQL 命令。支持 PostgreSQL、Greenplum 和 Greengage。

首先在 postgresql.conf 中添加:

shared_preload_libraries = 'pg_task'

然后通过向 task 表插入记录来调度任务:

-- 立即执行 SQL
INSERT INTO task (input) VALUES ('SELECT now()');

-- 5 分钟后执行 SQL
INSERT INTO task (plan, input) VALUES (now() + '5 min'::INTERVAL, 'SELECT now()');

-- 在指定时间执行 SQL
INSERT INTO task (plan, input) VALUES ('2029-07-01 12:51:00', 'SELECT now()');

-- 每 5 分钟重复执行 SQL
INSERT INTO task (repeat, input) VALUES ('5 min', 'SELECT now()');

-- 异常会被捕获并写入 error 列
INSERT INTO task (input) VALUES ('SELECT 1/0');

-- 限制同一组内的并发任务数
INSERT INTO task (group, max, input) VALUES ('group', 1, 'SELECT now()');

-- 在远程数据库上执行 SQL
INSERT INTO task (input, remote) VALUES ('SELECT now()', 'user=user host=host');

任务表列定义

列名类型默认值说明
idbigserial自增主键
parentbigintpg_task.id父任务 ID
plantimestamptzstatement_timestamp()计划执行时间
starttimestamptz实际开始时间
stoptimestamptz实际结束时间
activeinterval1 hour计划时间后任务保持活跃的时段
liveinterval0 sec后台工作进程最大存活时间
repeatinterval0 sec自动重复间隔
timeoutinterval0 sec任务执行允许的最大时间
countint0工作进程退出前的最大任务数
maxint0同一组内最大并发任务数
pidint执行任务的进程 ID
stateenumPLANPLAN、TAKE、WORK、DONE、STOP
deletebooltrue当 output 和 error 为空时自动删除
driftboolfalse根据结束时间计算下次重复时间
headerbooltrue在输出中显示列标题
grouptext‘group’任务分组名称
inputtext要执行的 SQL 命令
outputtext接收到的结果
errortext捕获的错误
remotetext远程数据库连接字符串

你可以在此表上添加任意所需的列和/或创建分区。

配置参数(GUC)

关键设置:

参数类型默认值说明
pg_task.datatextpostgres任务表所在数据库名
pg_task.usertextpostgres任务表所用用户名
pg_task.schematextpublic任务表所在模式名
pg_task.tabletexttask任务表名
pg_task.sleepint1000每 N 毫秒检查一次任务
pg_task.deletebooltrue自动删除已完成任务
pg_task.driftboolfalse根据结束时间计算重复间隔
pg_task.repeatinterval0 sec默认重复间隔
pg_task.timeoutinterval0 sec默认任务超时
pg_task.maxint0默认组内最大并发任务数
pg_task.runint2147483647最大并发执行任务数
pg_task.jsonjson[{“data”:“postgres”}]多数据库配置

多数据库配置

通过 JSON 配置在多个数据库上运行任务:

pg_task.json = '[{"data":"database1"},{"data":"database2","user":"username2"},{"data":"database3","schema":"schema3"}]'

如果指定的数据库、用户、模式或表不存在,pg_task 会自动创建它们。

10 - pg_later

执行查询,并在稍后异步获取查询结果

概览

扩展包名版本分类许可证语言
pg_later0.4.0TIMEPostgreSQLRust
ID扩展名BinLibLoadCreateTrustReloc模式
1090pg_laterpglater
相关扩展pgmq pg_cron pg_task pg_background timescaledb timescaledb_toolkit timeseries periods temporal_tables

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.4.01817161514pg_laterpgmq
RPMPIGSTY0.4.01817161514pg_later_$vpgmq_$v
DEBPIGSTY0.4.01817161514postgresql-$v-pg-laterpostgresql-$v-pgmq
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
d13.aarch64
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
u22.x86_64
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
u22.aarch64
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
u24.x86_64
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
u24.aarch64
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0
PIGSTY 0.4.0

构建

您可以使用 pig build 命令构建 pg_later 扩展的 RPM / DEB 包:

pig build pkg pg_later         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_later 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_later;          # 当前活跃 PG 版本安装
pig ext install -y pg_later -v 18  # PG 18
pig ext install -y pg_later -v 17  # PG 17
pig ext install -y pg_later -v 16  # PG 16
pig ext install -y pg_later -v 15  # PG 15
pig ext install -y pg_later -v 14  # PG 14
dnf install -y pg_later_18       # PG 18
dnf install -y pg_later_17       # PG 17
dnf install -y pg_later_16       # PG 16
dnf install -y pg_later_15       # PG 15
dnf install -y pg_later_14       # PG 14
apt install -y postgresql-18-pg-later   # PG 18
apt install -y postgresql-17-pg-later   # PG 17
apt install -y postgresql-16-pg-later   # PG 16
apt install -y postgresql-15-pg-later   # PG 15
apt install -y postgresql-14-pg-later   # PG 14

预加载配置

shared_preload_libraries = 'pg_later';

创建扩展

CREATE EXTENSION pg_later CASCADE;  -- 依赖: pgmq

用法

pg_later: 立即执行 SQL,稍后获取结果

一个用于异步执行查询的 PostgreSQL 扩展。基于 pgmq 构建。

快速开始

初始化扩展后端:

CREATE EXTENSION pg_later CASCADE;
SELECT pglater.init();

立即执行一条 SQL 查询:

SELECT pglater.exec(
  'SELECT * FROM pg_available_extensions ORDER BY name LIMIT 2'
) AS job_id;
 job_id
--------
     1

稍后通过任务 ID 获取结果:

SELECT pglater.fetch_results(1);
{
  "query": "select * from pg_available_extensions order by name limit 2",
  "job_id": 1,
  "result": [
    {
      "name": "adminpack",
      "comment": "administrative functions for PostgreSQL",
      "default_version": "2.1",
      "installed_version": null
    },
    {
      "name": "amcheck",
      "comment": "functions for verifying relation integrity",
      "default_version": "1.3",
      "installed_version": null
    }
  ],
  "status": "success"
}

11 - pg_dispatch

基于 pg_cron 的异步 SQL 分发器

概览

扩展包名版本分类许可证语言
pg_dispatch0.1.5TIMEPostgreSQLSQL
ID扩展名BinLibLoadCreateTrustReloc模式
1100pg_dispatch-
相关扩展pgcrypto pg_cron pg_cron pg_task pg_later pg_background

Pure SQL extension; runtime also needs pgcrypto from contrib in addition to pg_cron.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.1.51817161514pg_dispatchpgcrypto, pg_cron
RPMPIGSTY0.1.51817161514pg_dispatch_$v-
DEBPIGSTY0.1.51817161514postgresql-$v-pg-dispatchpostgresql-$v-cron
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
d12.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
d13.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
d13.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
u22.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
u22.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
u24.x86_64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
u24.aarch64
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5
PIGSTY 0.1.5

构建

您可以使用 pig build 命令构建 pg_dispatch 扩展的 RPM / DEB 包:

pig build pkg pg_dispatch         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_dispatch 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_dispatch;          # 当前活跃 PG 版本安装
pig ext install -y pg_dispatch -v 18  # PG 18
pig ext install -y pg_dispatch -v 17  # PG 17
pig ext install -y pg_dispatch -v 16  # PG 16
pig ext install -y pg_dispatch -v 15  # PG 15
pig ext install -y pg_dispatch -v 14  # PG 14
dnf install -y pg_dispatch_18       # PG 18
dnf install -y pg_dispatch_17       # PG 17
dnf install -y pg_dispatch_16       # PG 16
dnf install -y pg_dispatch_15       # PG 15
dnf install -y pg_dispatch_14       # PG 14
apt install -y postgresql-18-pg-dispatch   # PG 18
apt install -y postgresql-17-pg-dispatch   # PG 17
apt install -y postgresql-16-pg-dispatch   # PG 16
apt install -y postgresql-15-pg-dispatch   # PG 15
apt install -y postgresql-14-pg-dispatch   # PG 14

创建扩展

CREATE EXTENSION pg_dispatch CASCADE;  -- 依赖: pgcrypto, pg_cron

用法

语法:

CREATE EXTENSION "Snehil_Shah@pg_dispatch";
SELECT pgdispatch.fire('SELECT pg_sleep(40);');
SELECT pgdispatch.snooze('SELECT pg_sleep(20);', '20 seconds');

来源:READMEdatabase.dev 页面

pg_dispatch 是 PostgreSQL 的异步 SQL 调度器。它被设计为兼容 TLE 的 pg_later 替代方案,构建在 pg_cron 之上,因此可用于 Supabase 和 AWS RDS 等受限环境。

先决条件

上游 README 列出了以下要求:

  • PostgreSQL 13 或更高版本
  • pg_cron 1.5.0 或更高版本
  • pgcrypto

安装

文档中给出的 TLE 安装路径如下:

SELECT dbdev.install(Snehil_Shah@pg_dispatch);
CREATE EXTENSION "Snehil_Shah@pg_dispatch";

README 提醒,该扩展会安装到 pgdispatch 模式中,如果系统里已经存在同名模式,可能会发生命名空间冲突。

函数

pgdispatch.fire(command text)

异步派发一条 SQL 命令:

SELECT pgdispatch.fire('SELECT pg_sleep(40);');

pgdispatch.snooze(command text, delay interval)

延迟派发一条 SQL 命令:

SELECT pgdispatch.snooze('SELECT pg_sleep(20);', '20 seconds');

README 指出,这个延迟调度是异步完成的,不会阻塞主事务。

适用场景

该项目主要用于数据库内的异步副作用,尤其适合 PL/pgSQL 或触发器流程。示例场景是把昂贵的通知或分析任务从 AFTER INSERT 触发器中拆出去,让主 RPC 或应用请求更快返回。

12 - pg_background

在后台运行 SQL 查询

概览

扩展包名版本分类许可证语言
pg_background1.9.2TIMEGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1110pg_background-
相关扩展pg_cron pg_task pg_later pgq timescaledb timescaledb_toolkit timeseries periods

Release tag 1.9.2 still ships extension SQL version 1.9.

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.9.21817161514pg_background-
RPMPGDG1.9.21817161514pg_background_$v-
DEBPIGSTY1.9.21817161514postgresql-$v-pg-background-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

构建

您可以使用 pig build 命令构建 pg_background 扩展的 DEB 包:

pig build pkg pg_background         # 构建 DEB 包

安装

您可以直接安装 pg_background 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_background;          # 当前活跃 PG 版本安装
pig ext install -y pg_background -v 18  # PG 18
pig ext install -y pg_background -v 17  # PG 17
pig ext install -y pg_background -v 16  # PG 16
pig ext install -y pg_background -v 15  # PG 15
pig ext install -y pg_background -v 14  # PG 14
dnf install -y pg_background_18       # PG 18
dnf install -y pg_background_17       # PG 17
dnf install -y pg_background_16       # PG 16
dnf install -y pg_background_15       # PG 15
dnf install -y pg_background_14       # PG 14
apt install -y postgresql-18-pg-background   # PG 18
apt install -y postgresql-17-pg-background   # PG 17
apt install -y postgresql-16-pg-background   # PG 16
apt install -y postgresql-15-pg-background   # PG 15
apt install -y postgresql-14-pg-background   # PG 14

创建扩展

CREATE EXTENSION pg_background;

用法

pg_background: 在后台工作进程中执行 SQL

在 PostgreSQL 的后台工作进程中执行任意 SQL 命令。与 dblink(会建立独立连接)不同,pg_background 的工作进程运行在数据库服务器内部,并且各自拥有独立事务

适用场景:

  • 后台维护(VACUUM、ANALYZE、REINDEX)
  • 异步审计日志
  • 长时间运行的 ETL 管道
  • 独立通知投递
  • 并行查询模式

快速开始(V2 API)

CREATE EXTENSION pg_background;

-- 启动后台任务
SELECT * FROM pg_background_launch_v2(
  'SELECT count(*) FROM large_table'
) AS handle;
--   pid  |      cookie
-- -------+-------------------
--  12345 | 1234567890123456

-- 获取结果(一次性消费)
SELECT * FROM pg_background_result_v2(12345, 1234567890123456) AS (count BIGINT);

-- 即发即忘(不需要结果)
SELECT * FROM pg_background_submit_v2(
  'INSERT INTO audit_log (ts, event) VALUES (now(), ''system_check'')'
) AS handle;

V2 API 参考

函数返回值说明
pg_background_launch_v2(sql, queue_size)pg_background_handle启动工作进程,返回由 cookie 保护的句柄
pg_background_submit_v2(sql, queue_size)pg_background_handle即发即忘(不消费结果)
pg_background_result_v2(pid, cookie)SETOF record获取结果(一次性消费)
pg_background_detach_v2(pid, cookie)void停止跟踪工作进程(工作进程继续运行)
pg_background_cancel_v2(pid, cookie)void请求取消
pg_background_cancel_v2_grace(pid, cookie, grace_ms)void带宽限期取消
pg_background_wait_v2(pid, cookie)void阻塞等待工作进程完成
pg_background_wait_v2_timeout(pid, cookie, timeout_ms)bool带超时等待
pg_background_list_v2()SETOF record列出当前会话中已知的工作进程
pg_background_stats_v2()pg_background_stats会话统计信息(v1.8+)
pg_background_progress(pct, msg)void从工作进程中上报进度(v1.8+)
pg_background_get_progress_v2(pid, cookie)pg_background_progress获取工作进程进度(v1.8+)

取消与分离

操作停止执行移除跟踪
cancel_v2()是(尽力而为)
detach_v2()
  • 使用 cancel_v2()停止任务(终止执行,防止提交)
  • 使用 detach_v2()停止跟踪(释放簿记资源,工作进程继续运行)

工作进程生命周期

-- 取消运行中的任务
SELECT pg_background_cancel_v2(pid, cookie);

-- 等待完成
SELECT pg_background_wait_v2(pid, cookie);

-- 带超时等待(完成则返回 true)
SELECT pg_background_wait_v2_timeout(pid, cookie, 5000);

-- 列出活跃工作进程
SELECT * FROM pg_background_list_v2() AS (
  pid int4, cookie int8, launched_at timestamptz,
  user_id oid, queue_size int4, state text,
  sql_preview text, last_error text, consumed bool
);

工作进程状态:runningstoppedcancelederror

进度报告(v1.8+)

-- 在工作进程 SQL 内部调用
SELECT pg_background_progress(50, 'Halfway done');

-- 从启动方查看进度
SELECT * FROM pg_background_get_progress_v2(pid, cookie);

GUC 配置(v1.8+)

参数默认值说明
pg_background.max_workers16每个会话允许的最大并发工作进程数
pg_background.default_queue_size65536默认共享内存队列大小
pg_background.worker_timeout0工作进程超时时间(0 = 不限)

V1 API(遗留)

V1 API 保留用于向后兼容,但没有基于 cookie 的 PID 重用保护:

SELECT pg_background_launch('VACUUM VERBOSE my_table') AS pid \gset
SELECT * FROM pg_background_result(:pid) AS (result TEXT);
SELECT pg_background_detach(:pid);

生产环境建议使用 V2 API,因为它具备 cookie 级的 PID 重用保护。

安全模型

  • 扩展由超级用户安装,默认不授予 PUBLIC 权限
  • 会创建一个专用的 pg_background_worker NOLOGIN 角色
  • 辅助函数管理权限:grant_pg_background_privileges(role, include_v1)
  • 工作进程以启动用户身份执行,而不是超级用户

13 - pg_when

PostgreSQL 自然语言时间解析扩展

概览

扩展包名版本分类许可证语言
pg_when0.1.9TIMEMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
1120pg_when-

manually upgraded PGRX from 0.15.0 to 0.17.0 by Vonng

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.1.91817161514pg_when-
RPMPIGSTY0.1.91817161514pg_when_$v-
DEBPIGSTY0.1.91817161514postgresql-$v-pg-when-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
u24.x86_64
u24.aarch64
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9

构建

您可以使用 pig build 命令构建 pg_when 扩展的 RPM / DEB 包:

pig build pkg pg_when         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_when 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_when;          # 当前活跃 PG 版本安装
pig ext install -y pg_when -v 18  # PG 18
pig ext install -y pg_when -v 17  # PG 17
pig ext install -y pg_when -v 16  # PG 16
pig ext install -y pg_when -v 15  # PG 15
pig ext install -y pg_when -v 14  # PG 14
dnf install -y pg_when_18       # PG 18
dnf install -y pg_when_17       # PG 17
dnf install -y pg_when_16       # PG 16
dnf install -y pg_when_15       # PG 15
dnf install -y pg_when_14       # PG 14
apt install -y postgresql-18-pg-when   # PG 18
apt install -y postgresql-17-pg-when   # PG 17
apt install -y postgresql-16-pg-when   # PG 16
apt install -y postgresql-15-pg-when   # PG 15
apt install -y postgresql-14-pg-when   # PG 14

创建扩展

CREATE EXTENSION pg_when;

用法

来源: README项目仓库

pg-when 是一个 PostgreSQL 扩展,用于根据自然语言短语生成时间值。 它通过同一份解析结果提供多种返回格式:when_isseconds_atmillis_atmicros_atnanos_at

查询语法最多由三部分组成:

SELECT when_is('<date> at <time> in <timezone>');
SELECT when_is('<date>');
SELECT when_is('<time> in <timezone>');
SELECT when_is('<date> at <time>');

如果未指定时区,扩展默认使用 UTC。

支持的组件

<date> 可以是相对日期,也可以是精确日期。

README 中列出的相对日期示例包括:

  • today
  • yesterday
  • tomorrow
  • next week
  • last month
  • this friday
  • 5 days ago
  • in 2 years

精确日期可以写成以下格式:

  • YYYY-MM-DDYYYY/MM/DD
  • DD-MM-YYYYDD/MM/YYYY
  • Month D, YYYY
  • D Month YYYY

<time> 也可以是相对时间或精确时间。

相对时间示例包括:

  • noon
  • midnight
  • morning
  • evening
  • next hour
  • previous minute
  • this hour

精确时间可以用 12 小时制或 24 小时制表示,例如 8:30 pm15:45

时区既支持 IANA 名称,也支持 UTC 偏移量,例如 America/New_YorkUTC-08:00

示例

SELECT when_is('5 days ago at this hour in Asia/Tokyo');
SELECT when_is('next friday at 8:00 pm in America/New_York');
SELECT when_is('in 2 months at midnight in UTC-8');
SELECT when_is('last monday at 22:30');
SELECT when_is('December 31, 2026 at evening');

部署

上游 README 展示了 PostgreSQL 13 到 18 的 Docker 镜像。 这与本仓库中的包元数据一致。

14 - postgis

PostGIS 几何和地理空间扩展

概览

扩展包名版本分类许可证语言
postgis3.6.3GISGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1500postgis-
1501postgis_topologytopology
1502postgis_raster-
1503postgis_sfcgal-
1504postgis_tiger_geocodertiger
1505address_standardizer-
1506address_standardizer_data_us-
相关扩展pointcloud h3 pg_geohash geoip pg_polyline earthdistance ogr_fdw tzf
下游依赖documentdb h3_postgis mobilitydb pgrouting pointcloud_postgis postgis_raster postgis_sfcgal postgis_tiger_geocoder postgis_topology pg_eviltransform

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG3.6.31817161514postgis-
RPMPGDG3.6.31817161514postgis36_$v-
DEBPGDG3.6.31817161514postgresql-$v-postgis-3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

安装

您可以直接安装 postgis 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install postgis;          # 当前活跃 PG 版本安装
pig ext install -y postgis -v 18  # PG 18
pig ext install -y postgis -v 17  # PG 17
pig ext install -y postgis -v 16  # PG 16
pig ext install -y postgis -v 15  # PG 15
pig ext install -y postgis -v 14  # PG 14
dnf install -y postgis36_18       # PG 18
dnf install -y postgis36_17       # PG 17
dnf install -y postgis36_16       # PG 16
dnf install -y postgis36_15       # PG 15
dnf install -y postgis36_14       # PG 14
apt install -y postgresql-18-postgis-3   # PG 18
apt install -y postgresql-17-postgis-3   # PG 17
apt install -y postgresql-16-postgis-3   # PG 16
apt install -y postgresql-15-postgis-3   # PG 15
apt install -y postgresql-14-postgis-3   # PG 14

创建扩展

CREATE EXTENSION postgis;

用法

PostGIS:PostgreSQL 的空间与地理对象支持

PostGIS 为 PostgreSQL 添加了地理对象支持,将其变成一个空间数据库。它实现了 OGC 简单要素规范,并提供空间索引、空间函数和坐标变换功能。

文档

安装

CREATE EXTENSION postgis;

验证安装:

SELECT PostGIS_Full_Version();

核心数据类型

PostGIS 提供两种主要的空间类型:

类型描述坐标系
geometry平面(平地球)空间类型笛卡尔坐标,使用 SRID 指定投影
geography球面(圆地球)空间类型始终使用 WGS 84 经纬度(SRID 4326)

Geometry(几何类型)

geometry 类型在投影坐标系中工作。速度快且支持 PostGIS 的全部函数。最适合在单一投影坐标系内工作的场景(例如 UTM 分区、州平面坐标系)。

Geography(地理类型)

geography 类型在球体/椭球体上进行计算。距离和面积以米为单位返回。支持的函数较少,但在大面积范围内无需选择投影即可获得精确结果。

-- 地理类型列:距离以米为单位,始终使用 WGS 84
CREATE TABLE cities (
    name text PRIMARY KEY,
    location geography(Point, 4326)
);

INSERT INTO cities VALUES
    ('New York',  ST_GeogFromText('POINT(-74.006 40.7128)')),
    ('London',    ST_GeogFromText('POINT(-0.1278 51.5074)')),
    ('Tokyo',     ST_GeogFromText('POINT(139.6917 35.6895)'));

-- 以米为单位的距离(大圆距离)
SELECT a.name, b.name, ST_Distance(a.location, b.location) / 1000 AS distance_km
FROM cities a, cities b WHERE a.name < b.name;

创建空间表

空间列具有几何类型、维度(2D、3D、4D)和空间参考系统标识符(SRID)。

CREATE TABLE buildings (
    id serial PRIMARY KEY,
    name text,
    geom geometry(Polygon, 4326)
);

CREATE TABLE roads (
    id serial PRIMARY KEY,
    name text,
    geom geometry(LineString, 4326)
);

CREATE TABLE sensors (
    id serial PRIMARY KEY,
    label text,
    geom geometry(Point, 4326)
);

插入空间数据

从 WKT(Well-Known Text)格式导入:

INSERT INTO sensors (label, geom) VALUES
    ('S1', ST_GeomFromText('POINT(-73.985 40.748)', 4326)),
    ('S2', ST_GeomFromText('POINT(-73.979 40.754)', 4326));

使用构造函数:

INSERT INTO sensors (label, geom) VALUES
    ('S3', ST_SetSRID(ST_MakePoint(-73.990, 40.735), 4326));

从 GeoJSON 导入:

INSERT INTO buildings (name, geom) VALUES
    ('Plaza', ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[-73.98,40.74],[-73.97,40.74],[-73.97,40.75],[-73.98,40.75],[-73.98,40.74]]]}'));

空间索引

GiST 索引对空间查询性能至关重要。务必在空间列上创建索引:

CREATE INDEX idx_sensors_geom ON sensors USING GIST (geom);
CREATE INDEX idx_buildings_geom ON buildings USING GIST (geom);
CREATE INDEX idx_roads_geom ON roads USING GIST (geom);

空间索引支持边界框运算符(&&@~),并在 WHERE 子句中被 ST_DWithinST_IntersectsST_Contains 等空间函数自动使用。

对于超大数据集,可以考虑使用 BRIN 索引:

CREATE INDEX idx_sensors_geom_brin ON sensors USING BRIN (geom);

核心空间函数

创建几何对象

-- 从坐标创建点
SELECT ST_MakePoint(-73.985, 40.748);

-- 创建带 SRID 的点
SELECT ST_SetSRID(ST_MakePoint(-73.985, 40.748), 4326);

-- 从 WKT 创建
SELECT ST_GeomFromText('LINESTRING(0 0, 1 1, 2 1)', 4326);

-- 从 GeoJSON 创建
SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-73.985,40.748]}');

-- 从两个点创建线段
SELECT ST_MakeLine(
    ST_MakePoint(0, 0),
    ST_MakePoint(1, 1)
);

-- 从闭合线串创建多边形
SELECT ST_MakePolygon(
    ST_GeomFromText('LINESTRING(0 0, 1 0, 1 1, 0 1, 0 0)')
);

度量

-- 两个几何对象之间的距离(以 SRID 单位计)
SELECT ST_Distance(
    ST_GeomFromText('POINT(0 0)', 4326),
    ST_GeomFromText('POINT(1 1)', 4326)
);

-- 使用地理类型计算以米为单位的距离
SELECT ST_Distance(
    'SRID=4326;POINT(-73.985 40.748)'::geography,
    'SRID=4326;POINT(-0.1278 51.5074)'::geography
);

-- 面积(以 SRID 单位计,或地理类型以平方米计)
SELECT ST_Area(geom) FROM buildings;

-- 线串长度
SELECT ST_Length(geom) FROM roads;

-- 多边形周长
SELECT ST_Perimeter(geom) FROM buildings;

空间关系

-- A 是否包含 B?
SELECT ST_Contains(a.geom, b.geom) FROM buildings a, sensors b;

-- A 与 B 是否相交?
SELECT ST_Intersects(a.geom, b.geom) FROM buildings a, roads b;

-- B 是否在 A 的距离 D 以内?(索引友好)
SELECT ST_DWithin(a.geom, b.geom, 0.01) FROM sensors a, sensors b;

-- A 和 B 是否在距离 D 以内?(地理类型,单位为米)
SELECT ST_DWithin(a.location, b.location, 10000) FROM cities a, cities b;

-- A 是否与 B 接触?(共享边界但不共享内部)
SELECT ST_Touches(a.geom, b.geom) FROM buildings a, roads b;

-- A 是否穿越 B?
SELECT ST_Crosses(a.geom, b.geom) FROM roads a, roads b;

-- A 是否与 B 重叠?(同维度,不完全相同)
SELECT ST_Overlaps(a.geom, b.geom) FROM buildings a, buildings b;

几何处理

-- 缓冲区(按距离扩展几何对象)
SELECT ST_Buffer(geom, 0.001) FROM sensors;

-- 两个几何对象的交集
SELECT ST_Intersection(a.geom, b.geom) FROM buildings a, buildings b
WHERE ST_Intersects(a.geom, b.geom) AND a.id < b.id;

-- 几何对象的联合
SELECT ST_Union(geom) FROM buildings WHERE name LIKE 'Block%';

-- 凸包
SELECT ST_ConvexHull(ST_Collect(geom)) FROM sensors;

-- 简化几何对象(Douglas-Peucker 算法)
SELECT ST_Simplify(geom, 0.0001) FROM roads;

-- 质心
SELECT ST_Centroid(geom) FROM buildings;

-- 沃罗诺伊图
SELECT ST_VoronoiPolygons(ST_Collect(geom)) FROM sensors;

坐标变换

-- 从 WGS 84 (4326) 转换到 Web 墨卡托 (3857)
SELECT ST_Transform(geom, 3857) FROM sensors;

-- 转换到 UTM 分区以进行米制计算
SELECT ST_Area(ST_Transform(geom, 32618)) AS area_sqm FROM buildings;

-- 设置几何对象的 SRID(不会重新投影)
SELECT ST_SetSRID(geom, 4326) FROM sensors;

-- 获取当前 SRID
SELECT ST_SRID(geom) FROM sensors;

输出格式

-- 转为 GeoJSON
SELECT ST_AsGeoJSON(geom) FROM sensors;

-- 转为 WKT
SELECT ST_AsText(geom) FROM sensors;

-- 转为 KML
SELECT ST_AsKML(geom) FROM sensors;

-- 转为 SVG 路径
SELECT ST_AsSVG(geom) FROM buildings;

-- 转为 EWKT(包含 SRID)
SELECT ST_AsEWKT(geom) FROM sensors;

实际示例

查找附近的点

查找给定位置 500 米内的所有传感器:

SELECT label, ST_Distance(
    geom::geography,
    ST_SetSRID(ST_MakePoint(-73.985, 40.748), 4326)::geography
) AS distance_m
FROM sensors
WHERE ST_DWithin(
    geom::geography,
    ST_SetSRID(ST_MakePoint(-73.985, 40.748), 4326)::geography,
    500
)
ORDER BY distance_m;

空间连接

查找每个传感器所在的建筑物:

SELECT s.label, b.name
FROM sensors s
JOIN buildings b ON ST_Contains(b.geom, s.geom);

统计多边形内的点数

SELECT b.name, COUNT(s.id) AS sensor_count
FROM buildings b
LEFT JOIN sensors s ON ST_Contains(b.geom, s.geom)
GROUP BY b.name;

K 近邻查询

使用索引加速的 <-> 运算符查找距某点最近的 5 个传感器:

SELECT label, geom <-> ST_SetSRID(ST_MakePoint(-73.985, 40.748), 4326) AS dist
FROM sensors
ORDER BY geom <-> ST_SetSRID(ST_MakePoint(-73.985, 40.748), 4326)
LIMIT 5;

聚合为单个几何对象

-- 将所有传感器点收集为 MultiPoint
SELECT ST_Collect(geom) FROM sensors;

-- 计算最小外接圆
SELECT ST_MinimumBoundingCircle(ST_Collect(geom)) FROM sensors;

Geography 与 Geometry 对比

特性geometrygeography
坐标系任意投影坐标系仅 WGS 84
距离单位SRID 单位(度、米、英尺)
大面积精度需要正确的投影全球范围精确
函数支持完整(约 300 个函数)子集(约 40 个函数)
索引支持GiST、SP-GiST、BRINGiST
性能更快略慢

常见模式是使用 geography 存储数据以确保正确性,需要使用地理类型不支持的函数时再转换为 geometry

SELECT ST_Area(geom::geography) AS area_sqm FROM buildings;

15 - postgis_topology

PostGIS 拓扑空间类型和函数

概览

扩展包名版本分类许可证语言
postgis3.6.3GISGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1500postgis-
1501postgis_topologytopology
1502postgis_raster-
1503postgis_sfcgal-
1504postgis_tiger_geocodertiger
1505address_standardizer-
1506address_standardizer_data_us-
相关扩展postgis pgrouting pointcloud pointcloud_postgis h3 h3_postgis q3c ogr_fdw geoip

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG3.6.31817161514postgispostgis
RPMPGDG3.6.31817161514postgis36_$v-
DEBPGDG3.6.31817161514postgresql-$v-postgis-3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el8.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3

安装

您可以直接安装 postgis 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install postgis;          # 当前活跃 PG 版本安装
pig ext install -y postgis -v 18  # PG 18
pig ext install -y postgis -v 17  # PG 17
pig ext install -y postgis -v 16  # PG 16
pig ext install -y postgis -v 15  # PG 15
pig ext install -y postgis -v 14  # PG 14
dnf install -y postgis36_18       # PG 18
dnf install -y postgis36_17       # PG 17
dnf install -y postgis36_16       # PG 16
dnf install -y postgis36_15       # PG 15
dnf install -y postgis36_14       # PG 14
apt install -y postgresql-18-postgis-3   # PG 18
apt install -y postgresql-17-postgis-3   # PG 17
apt install -y postgresql-16-postgis-3   # PG 16
apt install -y postgresql-15-postgis-3   # PG 15
apt install -y postgresql-14-postgis-3   # PG 14

创建扩展

CREATE EXTENSION postgis_topology CASCADE;  -- 依赖: postgis

用法

PostGIS Topology:PostGIS 的拓扑数据模型支持

PostGIS Topology 为 PostgreSQL 实现了 SQL/MM 拓扑模型。它将空间数据表示为节点、边和面的图结构,确保共享边界只存储一次,并强制保证几何一致性。

安装

CREATE EXTENSION postgis_topology;

这将创建包含管理表和函数的 topology 模式。


创建拓扑

拓扑是一个具有指定 SRID 和捕捉容差的命名模式:

-- 创建名为 'city_topo' 的拓扑,SRID 4326,容差 0.00001 度
SELECT topology.CreateTopology('city_topo', 4326, 0.00001);

列出所有拓扑:

SELECT * FROM topology.topology;

构建拓扑基元

添加边

边是基本构建单元。节点会在边的端点处自动创建。

-- 添加孤立节点
SELECT topology.ST_AddIsoNode('city_topo', NULL, ST_Point(-73.98, 40.75));

-- 添加两点之间的边(如需要会自动创建节点)
SELECT topology.ST_AddEdgeModFace('city_topo',
    ST_MakeLine(ST_Point(-73.99, 40.74), ST_Point(-73.98, 40.74)));

SELECT topology.ST_AddEdgeModFace('city_topo',
    ST_MakeLine(ST_Point(-73.98, 40.74), ST_Point(-73.98, 40.75)));

SELECT topology.ST_AddEdgeModFace('city_topo',
    ST_MakeLine(ST_Point(-73.98, 40.75), ST_Point(-73.99, 40.75)));

SELECT topology.ST_AddEdgeModFace('city_topo',
    ST_MakeLine(ST_Point(-73.99, 40.75), ST_Point(-73.99, 40.74)));

查看基元

-- 列出节点
SELECT node_id, ST_AsText(geom) FROM city_topo.node;

-- 列出边
SELECT edge_id, ST_AsText(geom) FROM city_topo.edge_data;

-- 列出面(face_id 0 是全局面)
SELECT face_id, ST_AsText(mbr) FROM city_topo.face;

-- 获取面的几何形状
SELECT topology.ST_GetFaceGeometry('city_topo', 1);

拓扑几何(TopoGeometry)

拓扑几何是通过引用拓扑基元而非坐标来定义的空间对象。这确保了共享边界始终保持一致。

创建拓扑几何图层

-- 创建包含拓扑几何列的表
CREATE TABLE city_topo.blocks (
    id serial PRIMARY KEY,
    name text
);

-- 注册拓扑几何列(返回 layer_id)
SELECT topology.AddTopoGeometryColumn('city_topo', 'city_topo', 'blocks', 'topo', 'POLYGON');

赋值拓扑几何

-- 从常规几何创建拓扑几何(捕捉到已有拓扑)
INSERT INTO city_topo.blocks (name, topo) VALUES
    ('Block A', topology.toTopoGeom(
        ST_GeomFromText('POLYGON((-73.99 40.74,-73.98 40.74,-73.98 40.75,-73.99 40.75,-73.99 40.74))', 4326),
        'city_topo', 1));

-- 将拓扑几何转换回常规几何
SELECT name, topo::geometry FROM city_topo.blocks;

验证拓扑

-- 验证整个拓扑
SELECT * FROM topology.ValidateTopology('city_topo');

-- 检查拓扑错误
SELECT error FROM topology.ValidateTopology('city_topo')
WHERE error IS NOT NULL;

清理

-- 删除拓扑及其所有对象
SELECT topology.DropTopology('city_topo');

16 - postgis_raster

PostGIS 光栅类型和函数

概览

扩展包名版本分类许可证语言
postgis3.6.3GISGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1500postgis-
1501postgis_topologytopology
1502postgis_raster-
1503postgis_sfcgal-
1504postgis_tiger_geocodertiger
1505address_standardizer-
1506address_standardizer_data_us-
相关扩展postgis pointcloud_postgis pointcloud pgrouting h3 q3c ogr_fdw geoip pg_polyline
下游依赖h3_postgis

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG3.6.31817161514postgispostgis
RPMPGDG3.6.31817161514postgis36_$v-
DEBPGDG3.6.31817161514postgresql-$v-postgis-3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el8.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3

安装

您可以直接安装 postgis 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install postgis;          # 当前活跃 PG 版本安装
pig ext install -y postgis -v 18  # PG 18
pig ext install -y postgis -v 17  # PG 17
pig ext install -y postgis -v 16  # PG 16
pig ext install -y postgis -v 15  # PG 15
pig ext install -y postgis -v 14  # PG 14
dnf install -y postgis36_18       # PG 18
dnf install -y postgis36_17       # PG 17
dnf install -y postgis36_16       # PG 16
dnf install -y postgis36_15       # PG 15
dnf install -y postgis36_14       # PG 14
apt install -y postgresql-18-postgis-3   # PG 18
apt install -y postgresql-17-postgis-3   # PG 17
apt install -y postgresql-16-postgis-3   # PG 16
apt install -y postgresql-15-postgis-3   # PG 15
apt install -y postgresql-14-postgis-3   # PG 14

创建扩展

CREATE EXTENSION postgis_raster CASCADE;  -- 依赖: postgis

用法

PostGIS Raster:PostGIS 的栅格数据支持

PostGIS Raster 为 PostGIS 扩展了栅格(网格)数据支持,可直接在 PostgreSQL 中存储栅格数据。它支持在 SQL 中进行栅格分析、栅格/矢量交互和地图代数运算。

安装

CREATE EXTENSION postgis_raster;

加载栅格数据

raster2pgsql 命令行工具可将栅格文件(GeoTIFF 等)导入 PostgreSQL:

# 将 GeoTIFF 以 100x100 瓦片导入,创建空间索引,使用 COPY
raster2pgsql -s 4326 -t 100x100 -I -C -M elevation.tif public.dem | psql mydb

# 追加到已有表
raster2pgsql -s 4326 -t 100x100 -a more_data.tif public.dem | psql mydb

关键参数:

  • -s <srid> – 设置 SRID
  • -t <width>x<height> – 将栅格切分为瓦片
  • -I – 创建 GiST 空间索引
  • -C – 应用栅格约束
  • -M – 加载后执行 vacuum analyze

查询栅格数据

栅格元数据

-- 获取栅格尺寸和像素大小
SELECT rid,
    ST_Width(rast) AS width,
    ST_Height(rast) AS height,
    ST_ScaleX(rast) AS pixel_size_x,
    ST_ScaleY(rast) AS pixel_size_y,
    ST_NumBands(rast) AS bands,
    ST_SRID(rast) AS srid
FROM dem LIMIT 5;

像素值

-- 获取指定点的值
SELECT ST_Value(rast, ST_SetSRID(ST_MakePoint(-73.985, 40.748), 4326)) AS elevation
FROM dem
WHERE ST_Intersects(rast, ST_SetSRID(ST_MakePoint(-73.985, 40.748), 4326));

-- 获取列/行位置的值(波段 1)
SELECT ST_Value(rast, 1, 10, 20) FROM dem WHERE rid = 1;

波段统计

SELECT (ST_SummaryStats(rast)).*
FROM dem WHERE rid = 1;
-- 返回:count、sum、mean、stddev、min、max

栅格处理

按矢量几何裁剪栅格

-- 将栅格裁剪到多边形边界
SELECT ST_Clip(rast, geom) AS clipped_rast
FROM dem, boundaries
WHERE ST_Intersects(rast, geom);

地图代数

逐像素运算:

-- 单栅格地图代数:高程分类
SELECT ST_MapAlgebra(rast, 1, NULL,
    'CASE WHEN [rast] > 100 THEN 1 WHEN [rast] > 50 THEN 2 ELSE 3 END') AS classified
FROM dem;

-- 双栅格地图代数:两个 DEM 的差值
SELECT ST_MapAlgebra(a.rast, 1, b.rast, 1, '[rast1] - [rast2]') AS diff
FROM dem_old a, dem_new b
WHERE ST_Intersects(a.rast, b.rast);

栅格/矢量交互

-- 将栅格像素转换为矢量点
SELECT (ST_PixelAsPoints(rast)).*
FROM dem WHERE rid = 1;

-- 将栅格转换为多边形(每个唯一值一个)
SELECT (ST_DumpAsPolygons(rast)).*
FROM dem WHERE rid = 1;

-- 栅格与矢量相交并获取值
SELECT p.name, ST_Value(d.rast, p.geom) AS elevation
FROM dem d, points p
WHERE ST_Intersects(d.rast, p.geom);

重采样与重投影

-- 重采样为不同的像素大小
SELECT ST_Rescale(rast, 0.001, -0.001) FROM dem;

-- 重投影到不同的 SRID
SELECT ST_Transform(rast, 3857) FROM dem;

导出栅格

-- 导出为 GeoTIFF(二进制)
SELECT ST_AsTIFF(rast) FROM dem WHERE rid = 1;

-- 导出为 PNG
SELECT ST_AsPNG(rast) FROM dem WHERE rid = 1;

-- 导出为 JPEG
SELECT ST_AsJPEG(rast) FROM dem WHERE rid = 1;

17 - postgis_sfcgal

PostGIS SFCGAL 函数

概览

扩展包名版本分类许可证语言
postgis3.6.3GISGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1500postgis-
1501postgis_topologytopology
1502postgis_raster-
1503postgis_sfcgal-
1504postgis_tiger_geocodertiger
1505address_standardizer-
1506address_standardizer_data_us-
相关扩展postgis pgrouting pointcloud pointcloud_postgis h3 h3_postgis q3c ogr_fdw geoip

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG3.6.31817161514postgispostgis
RPMPGDG3.6.31817161514postgis36_$v-
DEBPGDG3.6.31817161514postgresql-$v-postgis-3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el8.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3

安装

您可以直接安装 postgis 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install postgis;          # 当前活跃 PG 版本安装
pig ext install -y postgis -v 18  # PG 18
pig ext install -y postgis -v 17  # PG 17
pig ext install -y postgis -v 16  # PG 16
pig ext install -y postgis -v 15  # PG 15
pig ext install -y postgis -v 14  # PG 14
dnf install -y postgis36_18       # PG 18
dnf install -y postgis36_17       # PG 17
dnf install -y postgis36_16       # PG 16
dnf install -y postgis36_15       # PG 15
dnf install -y postgis36_14       # PG 14
apt install -y postgresql-18-postgis-3   # PG 18
apt install -y postgresql-17-postgis-3   # PG 17
apt install -y postgresql-16-postgis-3   # PG 16
apt install -y postgresql-15-postgis-3   # PG 15
apt install -y postgresql-14-postgis-3   # PG 14

创建扩展

CREATE EXTENSION postgis_sfcgal CASCADE;  -- 依赖: postgis

用法

PostGIS SFCGAL:基于 SFCGAL 的三维几何与高级操作

PostGIS SFCGAL 通过封装 SFCGAL 库,提供高级的二维和三维空间操作。它增加了对三维几何运算、体积计算、拉伸、三角剖分等核心 PostGIS GEOS 后端不支持的功能。

安装

CREATE EXTENSION postgis_sfcgal;

三维操作

三维交集与差集

-- 两个实体的三维交集
SELECT ST_3DIntersection(
    ST_GeomFromText('POLYHEDRALSURFACE Z(((0 0 0,1 0 0,1 1 0,0 1 0,0 0 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)),((0 0 0,0 1 0,0 1 1,0 0 1,0 0 0)),((1 0 0,1 1 0,1 1 1,1 0 1,1 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((0 1 0,1 1 0,1 1 1,0 1 1,0 1 0)))'),
    ST_GeomFromText('POLYHEDRALSURFACE Z(((0.5 0.5 0.5,1.5 0.5 0.5,1.5 1.5 0.5,0.5 1.5 0.5,0.5 0.5 0.5)),((0.5 0.5 1.5,1.5 0.5 1.5,1.5 1.5 1.5,0.5 1.5 1.5,0.5 0.5 1.5)),((0.5 0.5 0.5,0.5 1.5 0.5,0.5 1.5 1.5,0.5 0.5 1.5,0.5 0.5 0.5)),((1.5 0.5 0.5,1.5 1.5 0.5,1.5 1.5 1.5,1.5 0.5 1.5,1.5 0.5 0.5)),((0.5 0.5 0.5,1.5 0.5 0.5,1.5 0.5 1.5,0.5 0.5 1.5,0.5 0.5 0.5)),((0.5 1.5 0.5,1.5 1.5 0.5,1.5 1.5 1.5,0.5 1.5 1.5,0.5 1.5 0.5)))')
);

-- 三维差集
SELECT ST_3DDifference(solid_a, solid_b) FROM solids;

-- 三维并集
SELECT ST_3DUnion(solid_a, solid_b) FROM solids;

三维度量

-- 曲面的三维面积
SELECT ST_3DArea(geom) FROM surfaces;

-- 实体的体积
SELECT ST_Volume(geom) FROM solids;

拉伸

-- 将二维多边形拉伸为三维实体
SELECT ST_Extrude(
    ST_GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
    0, 0, 10  -- dx, dy, dz
);

细分与三角剖分

-- 将多边形细分为三角形
SELECT ST_Tesselate(
    ST_GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))')
);

-- 约束 Delaunay 三角剖分
SELECT ST_ConstrainedDelaunayTriangles(
    ST_GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))')
);

其他函数

-- 多边形的直骨架
SELECT ST_StraightSkeleton(
    ST_GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))')
);

-- 近似中轴线
SELECT ST_ApproximateMedialAxis(
    ST_GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))')
);

-- 闵可夫斯基和
SELECT ST_MinkowskiSum(
    ST_GeomFromText('LINESTRING(0 0, 4 0)'),
    ST_GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))')
);

-- 检查曲面是否为平面
SELECT ST_IsPlanar(geom) FROM surfaces;

18 - postgis_tiger_geocoder

PostGIS tiger 地理编码器和反向地理编码器

概览

扩展包名版本分类许可证语言
postgis3.6.3GISGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1500postgis-
1501postgis_topologytopology
1502postgis_raster-
1503postgis_sfcgal-
1504postgis_tiger_geocodertiger
1505address_standardizer-
1506address_standardizer_data_us-
相关扩展postgis fuzzystrmatch pgrouting pointcloud pointcloud_postgis h3 h3_postgis q3c ogr_fdw geoip

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG3.6.31817161514postgispostgis, fuzzystrmatch
RPMPGDG3.6.31817161514postgis36_$v-
DEBPGDG3.6.31817161514postgresql-$v-postgis-3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el8.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3

安装

您可以直接安装 postgis 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install postgis;          # 当前活跃 PG 版本安装
pig ext install -y postgis -v 18  # PG 18
pig ext install -y postgis -v 17  # PG 17
pig ext install -y postgis -v 16  # PG 16
pig ext install -y postgis -v 15  # PG 15
pig ext install -y postgis -v 14  # PG 14
dnf install -y postgis36_18       # PG 18
dnf install -y postgis36_17       # PG 17
dnf install -y postgis36_16       # PG 16
dnf install -y postgis36_15       # PG 15
dnf install -y postgis36_14       # PG 14
apt install -y postgresql-18-postgis-3   # PG 18
apt install -y postgresql-17-postgis-3   # PG 17
apt install -y postgresql-16-postgis-3   # PG 16
apt install -y postgresql-15-postgis-3   # PG 15
apt install -y postgresql-14-postgis-3   # PG 14

创建扩展

CREATE EXTENSION postgis_tiger_geocoder CASCADE;  -- 依赖: postgis, fuzzystrmatch

用法

PostGIS TIGER Geocoder:基于美国人口普查 TIGER/Line 数据的 PostGIS 地理编码

PostGIS TIGER Geocoder 利用美国人口普查 TIGER/Line 数据提供地理编码和反向地理编码功能。它可以将地址字符串解析为标准化格式、查找地理坐标,以及将坐标反向解析为地址。

安装

CREATE EXTENSION postgis_tiger_geocoder CASCADE;

这将创建包含地理编码器表和函数的 tiger 模式。


加载 TIGER 数据

在进行地理编码之前,必须先加载所需州的 TIGER/Line 数据。该扩展提供了辅助函数来生成加载脚本:

-- 生成下载和加载某个州数据的脚本
-- (例如,马萨诸塞州 = 'MA')
SELECT loader_generate_script(ARRAY['MA'], 'sh');

这会生成一个使用 shp2pgsql 加载 TIGER 形状文件的 shell 脚本。运行生成的脚本可将地址范围、边、面等数据填充到 tiger_data 模式中。

加载完成后:

-- 安装缺失的索引以提升性能
SELECT install_missing_indexes();

-- 更新统计信息
ANALYZE tiger.addr;
ANALYZE tiger.edges;
ANALYZE tiger.faces;

地理编码

将美国地址字符串转换为地理坐标:

-- 基本地理编码
SELECT g.rating, ST_X(g.geomout) AS lon, ST_Y(g.geomout) AS lat,
       pprint_addy(g.addy) AS address
FROM geocode('1600 Pennsylvania Ave NW, Washington, DC 20500') AS g;

rating 表示匹配质量(越低越好,0 = 精确匹配)。

-- 限制返回结果数量的地理编码
SELECT g.rating, ST_AsText(g.geomout), pprint_addy(g.addy)
FROM geocode('100 Main St, Boston, MA', 3) AS g;

-- 从表中批量地理编码
SELECT a.id, g.rating, g.geomout, pprint_addy(g.addy)
FROM addresses a, LATERAL geocode(a.address_string, 1) AS g;

反向地理编码

将坐标转换回街道地址:

SELECT pprint_addy(r.addy[1]) AS address
FROM reverse_geocode(ST_SetSRID(ST_MakePoint(-77.0365, 38.8977), 4326)) AS r;

地址标准化

无需地理编码即可解析和标准化地址字符串:

SELECT *
FROM normalize_address('1600 Pennsylvania Avenue NW, Washington, DC 20500');

返回的组件包括:address(门牌号)、predirAbbrevstreetNamestreetTypeAbbrevpostdirAbbrevinternallocation(城市)、stateAbbrevzipparsed

-- 格式化输出标准化地址
SELECT pprint_addy(normalize_address('100 main street boston ma 02101'));

配置

tiger.geocode_settings 表控制地理编码器的行为:

-- 查看当前设置
SELECT * FROM tiger.geocode_settings;

-- 调整设置(例如,增加调试级别)
UPDATE tiger.geocode_settings SET val = 'true' WHERE name = 'debug_geocode_address';

19 - address_standardizer

地址标准化函数。

概览

扩展包名版本分类许可证语言
postgis3.6.3GISGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1500postgis-
1501postgis_topologytopology
1502postgis_raster-
1503postgis_sfcgal-
1504postgis_tiger_geocodertiger
1505address_standardizer-
1506address_standardizer_data_us-
相关扩展pgrouting pointcloud pointcloud_postgis h3 h3_postgis q3c ogr_fdw geoip

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG3.6.31817161514postgis-
RPMPGDG3.6.31817161514postgis36_$v-
DEBPGDG3.6.31817161514postgresql-$v-postgis-3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el8.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3

安装

您可以直接安装 postgis 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install postgis;          # 当前活跃 PG 版本安装
pig ext install -y postgis -v 18  # PG 18
pig ext install -y postgis -v 17  # PG 17
pig ext install -y postgis -v 16  # PG 16
pig ext install -y postgis -v 15  # PG 15
pig ext install -y postgis -v 14  # PG 14
dnf install -y postgis36_18       # PG 18
dnf install -y postgis36_17       # PG 17
dnf install -y postgis36_16       # PG 16
dnf install -y postgis36_15       # PG 15
dnf install -y postgis36_14       # PG 14
apt install -y postgresql-18-postgis-3   # PG 18
apt install -y postgresql-17-postgis-3   # PG 17
apt install -y postgresql-16-postgis-3   # PG 16
apt install -y postgresql-15-postgis-3   # PG 15
apt install -y postgresql-14-postgis-3   # PG 14

创建扩展

CREATE EXTENSION address_standardizer;

用法

Address Standardizer:PostGIS 的地址解析与标准化

Address Standardizer 是一个 PostGIS 扩展,使用可配置的词典、语法和规则表将单行地址字符串解析为结构化形式。它是 TIGER 地理编码器中内置 normalize_address 函数的更灵活替代方案。

安装

CREATE EXTENSION address_standardizer;

标准化地址

核心函数接收一个地址字符串和三个表引用(lex、gaz、rules):

SELECT *
FROM standardize_address(
    'us_lex',        -- 词典表
    'us_gaz',        -- 地名表
    'us_rules',      -- 规则表
    '1600 Pennsylvania Ave NW, Washington, DC 20500'
);

返回结果包含以下结构化字段:

字段描述
building建筑名称或标识
house_num门牌号
predir前缀方向(N、S、E、W)
qual限定符
pretype前缀类型
name街道名称
suftype后缀类型(St、Ave、Blvd)
sufdir后缀方向
ruralroute乡村路线
extra附加信息
city城市名
state
country国家
postcode邮政编码
box邮政信箱
unit单元/公寓号

词典、地名和规则表

标准化器由三个用户可配置的表驱动:

词典(lex) – 将输入词元映射为标准化形式和词元类别:

CREATE TABLE us_lex (
    id serial PRIMARY KEY,
    seq integer,
    word text,
    stdword text,
    token integer
);

地名表(gaz) – 将地名(城市、州)映射为标准形式:

CREATE TABLE us_gaz (
    id serial PRIMARY KEY,
    seq integer,
    word text,
    stdword text,
    token integer
);

规则(rules) – 定义地址解析的语法规则:

CREATE TABLE us_rules (
    id serial PRIMARY KEY,
    rule text
);

对于美国地址,address_standardizer_data_us 扩展提供了这些表的预置数据。

20 - address_standardizer_data_us

地址标准化函数:美国数据集示例

概览

扩展包名版本分类许可证语言
postgis3.6.3GISGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1500postgis-
1501postgis_topologytopology
1502postgis_raster-
1503postgis_sfcgal-
1504postgis_tiger_geocodertiger
1505address_standardizer-
1506address_standardizer_data_us-
相关扩展pgrouting pointcloud pointcloud_postgis h3 h3_postgis q3c ogr_fdw geoip

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG3.6.31817161514postgis-
RPMPGDG3.6.31817161514postgis36_$v-
DEBPGDG3.6.31817161514postgresql-$v-postgis-3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el8.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el9.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
el10.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d12.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
d13.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u22.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.x86_64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3
u24.aarch64PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3PGDG 3.6.3

安装

您可以直接安装 postgis 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install postgis;          # 当前活跃 PG 版本安装
pig ext install -y postgis -v 18  # PG 18
pig ext install -y postgis -v 17  # PG 17
pig ext install -y postgis -v 16  # PG 16
pig ext install -y postgis -v 15  # PG 15
pig ext install -y postgis -v 14  # PG 14
dnf install -y postgis36_18       # PG 18
dnf install -y postgis36_17       # PG 17
dnf install -y postgis36_16       # PG 16
dnf install -y postgis36_15       # PG 15
dnf install -y postgis36_14       # PG 14
apt install -y postgresql-18-postgis-3   # PG 18
apt install -y postgresql-17-postgis-3   # PG 17
apt install -y postgresql-16-postgis-3   # PG 16
apt install -y postgresql-15-postgis-3   # PG 15
apt install -y postgresql-14-postgis-3   # PG 14

创建扩展

CREATE EXTENSION address_standardizer_data_us;

用法

Address Standardizer Data US:address_standardizer 扩展的美国地址数据

此扩展为 address_standardizer 扩展提供预置的美国词典、地名和规则数据。它包含常见美国街道类型、方向缩写、州名以及解析美国地址所需的语法规则表。

安装

CREATE EXTENSION address_standardizer_data_us;

这将在 public 模式中创建预填充了美国地址数据的 us_lexus_gazus_rules 表。


与 address_standardizer 配合使用

安装后即可立即标准化美国地址:

SELECT *
FROM standardize_address(
    'us_lex', 'us_gaz', 'us_rules',
    '123 Main Street NW, Apt 4B, Springfield, IL 62704'
);

提供的数据涵盖常见的美国地址模式,包括:

  • 街道类型(Street、Avenue、Boulevard、Drive、Lane、Court 等)
  • 方向前缀和后缀(North、South、N、S、NW、SE 等)
  • 州名及其缩写
  • 单元标识符(Apt、Suite、Unit 等)
  • 公路标识符(US、State、County、Interstate 等)

21 - pgrouting

提供寻路能力

概览

扩展包名版本分类许可证语言
pgrouting4.0.1GISGPL-2.0C++
ID扩展名BinLibLoadCreateTrustReloc模式
1510pgrouting-
相关扩展plpgsql postgis postgis_topology mobilitydb pg_polyline postgis_raster postgis_sfcgal postgis_tiger_geocoder address_standardizer address_standardizer_data_us

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG4.0.11817161514pgroutingplpgsql, postgis
RPMPGDG4.0.11817161514pgrouting_$v-
DEBPGDG4.0.11817161514postgresql-$v-pgrouting-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
d12.aarch64
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
d13.x86_64
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
d13.aarch64
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
u22.x86_64
u22.aarch64
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
u24.x86_64
u24.aarch64
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1
PGDG 4.0.1

安装

您可以直接安装 pgrouting 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgrouting;          # 当前活跃 PG 版本安装
pig ext install -y pgrouting -v 18  # PG 18
pig ext install -y pgrouting -v 17  # PG 17
pig ext install -y pgrouting -v 16  # PG 16
pig ext install -y pgrouting -v 15  # PG 15
pig ext install -y pgrouting -v 14  # PG 14
dnf install -y pgrouting_18       # PG 18
dnf install -y pgrouting_17       # PG 17
dnf install -y pgrouting_16       # PG 16
dnf install -y pgrouting_15       # PG 15
dnf install -y pgrouting_14       # PG 14
apt install -y postgresql-18-pgrouting   # PG 18
apt install -y postgresql-17-pgrouting   # PG 17
apt install -y postgresql-16-pgrouting   # PG 16
apt install -y postgresql-15-pgrouting   # PG 15
apt install -y postgresql-14-pgrouting   # PG 14

创建扩展

CREATE EXTENSION pgrouting CASCADE;  -- 依赖: plpgsql, postgis

用法

pgRouting - 基于 PostgreSQL 的路径规划

pgRouting 扩展 PostGIS/PostgreSQL 地理空间数据库,提供地理空间路径规划和其他网络分析功能。

该库包含以下特性:

  • 全对最短路径(Floyd-Warshall、Johnson)
  • A* 算法(含双向变体)
  • Dijkstra 算法(代价、代价矩阵、行驶距离、K 条最短路径、经由路由、最近点)
  • 双向 Dijkstra
  • 旅行商问题(TSP)
  • 网络流(最大流、Boykov-Kolmogorov、Edmonds-Karp、预流推进)
  • 生成树(Kruskal、Prim 及其 BFS/DFS/行驶距离变体)
  • 图组件(连通分量、强连通分量、双连通分量、关节点、桥)
  • 转弯限制最短路径(TRSP)
  • WithPoints 路由(边上任意位置)
  • 图压缩与实用函数

快速开始

启用扩展(需要 PostGIS):

CREATE EXTENSION pgrouting CASCADE;

图的表示

pgRouting 使用返回边数据的 SQL 查询来表示图。标准边查询格式:

SELECT id, source, target, cost, reverse_cost FROM edges;
类型说明
idANY-INTEGER边标识符
sourceANY-INTEGER起始顶点标识符
targetANY-INTEGER终止顶点标识符
costANY-NUMERICAL权重(source 到 target);负值表示排除该边
reverse_costANY-NUMERICAL权重(target 到 source);默认 -1(不存在)

无几何体的简单示例

创建一个图并查找最短路径:

CREATE TABLE wiki (
  id SERIAL,
  source INTEGER,
  target INTEGER,
  cost INTEGER
);

INSERT INTO wiki (source, target, cost) VALUES
  (1, 2, 7),  (1, 3, 9), (1, 6, 14),
  (2, 3, 10), (2, 4, 15),
  (3, 6, 2),  (3, 4, 11),
  (4, 5, 6),
  (5, 6, 9);

SELECT * FROM pgr_dijkstra(
  'SELECT id, source, target, cost FROM wiki',
  1, 5, false);

函数族

Dijkstra - 最短路径

核心路由函数。支持一对一、一对多、多对一、多对多及组合签名。

pgr_dijkstra(Edges SQL, start_vid,  end_vid,  [directed])
pgr_dijkstra(Edges SQL, start_vid,  end_vids, [directed])
pgr_dijkstra(Edges SQL, start_vids, end_vid,  [directed])
pgr_dijkstra(Edges SQL, start_vids, end_vids, [directed])
pgr_dijkstra(Edges SQL, Combinations SQL,     [directed])

返回:(seq, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)

一对一:

SELECT * FROM pgr_dijkstra(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  6, 10, true);

一对多:

SELECT * FROM pgr_dijkstra(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  6, ARRAY[10, 17]);

多对多(无向):

SELECT * FROM pgr_dijkstra(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  ARRAY[6, 1], ARRAY[10, 17],
  directed => false);

组合:

SELECT * FROM pgr_dijkstra(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  'SELECT source, target FROM combinations',
  false);

Dijkstra 代价

仅返回聚合代价,不含路径详情:

pgr_dijkstraCost(Edges SQL, start_vid, end_vid, [directed])

返回:(start_vid, end_vid, agg_cost)

Dijkstra 代价矩阵

为一组顶点生成代价矩阵:

pgr_dijkstraCostMatrix(Edges SQL, vids, [directed])

Dijkstra 经由

按有序顶点序列规划路径:

pgr_dijkstraVia(Edges SQL, via_vertices, [directed, strict, U_turn_on_edge])

Dijkstra 最近点

查找距离一组目标最近的顶点:

pgr_dijkstraNear(Edges SQL, start_vid, end_vids, [directed])

A* - 最短路径

使用 A* 启发式算法。需要边查询中包含额外的坐标列(x1y1x2y2)。

pgr_aStar(Edges SQL, start_vid, end_vid, [directed, heuristic, factor, epsilon])
选项类型默认值说明
directedBOOLEANtrue图方向
heuristicINTEGER5距离启发式(0-5)
factorFLOAT1单位换算因子
epsilonFLOAT1近似因子
SELECT * FROM pgr_aStar(
  'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edges',
  6, 12,
  directed => true, heuristic => 2);

另有:pgr_aStarCostpgr_aStarCostMatrix

双向算法

双向变体从两端同时搜索:

  • pgr_bdDijkstrapgr_bdDijkstraCostpgr_bdDijkstraCostMatrix
  • pgr_bdAstarpgr_bdAstarCostpgr_bdAstarCostMatrix
SELECT * FROM pgr_bdDijkstra(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  6, 10);

K 条最短路径(Yen 算法)

查找两个顶点之间的 K 条最短路径:

pgr_KSP(Edges SQL, start_vid, end_vid, K, [directed, heap_paths])

返回:(seq, path_id, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)

SELECT * FROM pgr_KSP(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  6, 17, 2);

行驶距离

查找给定距离内可达的所有顶点:

pgr_drivingDistance(Edges SQL, start_vid, distance, [directed])
pgr_drivingDistance(Edges SQL, start_vids, distance, [directed, equicost])

返回:(seq, depth, start_vid, pred, node, edge, cost, agg_cost)

SELECT * FROM pgr_drivingDistance(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  11, 3.0);

旅行商问题

基于矩阵的 TSP:

pgr_TSP(Matrix SQL, [start_id, end_id])

返回:(seq, node, cost, agg_cost)

SELECT * FROM pgr_TSP(
  $$SELECT * FROM pgr_dijkstraCostMatrix(
    'SELECT id, source, target, cost, reverse_cost FROM edges',
    ARRAY[1, 3, 5, 6, 7, 8, 9, 10, 11, 15, 16, 17],
    directed => false)$$,
  start_id => 1);

欧几里得 TSP(直接使用坐标):

pgr_TSPeuclidean(Coordinates SQL, [start_id, end_id])

网络流

计算最大流及相关属性:

-- 最大流
pgr_maxFlow(Edges SQL, source, sink)

-- 特定算法
pgr_boykovKolmogorov(Edges SQL, source, sink)
pgr_edmondsKarp(Edges SQL, source, sink)
pgr_pushRelabel(Edges SQL, source, sink)

-- 边不相交路径
pgr_edgeDisjointPaths(Edges SQL, source, sink)

-- 最大基数匹配
pgr_maxCardinalityMatch(Edges SQL, [directed])

网络流的边 SQL 使用 capacityreverse_capacity 替代 cost/reverse_cost

生成树

Kruskal 算法:

pgr_kruskal(Edges SQL)         -- 最小生成树
pgr_kruskalBFS(Edges SQL, root_vid, [max_depth])
pgr_kruskalDFS(Edges SQL, root_vid, [max_depth])
pgr_kruskalDD(Edges SQL, root_vid, distance)

Prim 算法:

pgr_prim(Edges SQL)            -- 最小生成树
pgr_primBFS(Edges SQL, root_vid, [max_depth])
pgr_primDFS(Edges SQL, root_vid, [max_depth])
pgr_primDD(Edges SQL, root_vid, distance)

图组件

-- 连通分量(无向)
pgr_connectedComponents(Edges SQL)

-- 强连通分量(有向)
pgr_strongComponents(Edges SQL)

-- 双连通分量
pgr_biconnectedComponents(Edges SQL)

-- 关节点(割点)
pgr_articulationPoints(Edges SQL)

-- 桥(割边)
pgr_bridges(Edges SQL)

转弯限制最短路径(TRSP)

带禁止路径限制的路由:

pgr_trsp(Edges SQL, Restrictions SQL, start_vid, end_vid, [directed])
pgr_trspVia(Edges SQL, Restrictions SQL, via_vertices, [directed, strict, U_turn_on_edge])
pgr_trsp_withPoints(Edges SQL, Restrictions SQL, Points SQL, start_pid, end_pid, [options])

限制条件 SQL 格式:

类型说明
pathARRAY[ANY-INTEGER]禁止的边 ID 序列
costANY-NUMERICAL禁止路径的代价

WithPoints - 任意位置路由

在边上任意点(不仅是顶点)之间路由:

pgr_withPoints(Edges SQL, Points SQL, start_pid, end_pid, [options])
pgr_withPointsCost(Edges SQL, Points SQL, start_pid, end_pid, [options])
pgr_withPointsCostMatrix(Edges SQL, Points SQL, pids, [options])
pgr_withPointsKSP(Edges SQL, Points SQL, start_pid, end_pid, K, [options])
pgr_withPointsDD(Edges SQL, Points SQL, start_pid, distance, [options])

点 SQL 格式:

类型默认值说明
pidANY-INTEGER点标识符
edge_idANY-INTEGER最近的边
fractionANY-NUMERICAL在边上的位置(0-1)
sideCHARbr(右侧)、l(左侧)、b(两侧)

图压缩

通过压缩顶点简化图:

pgr_contraction(Edges SQL, contraction_order, [options])

实用函数

-- 从边数据中提取顶点
pgr_extractVertices(Edges SQL)

-- 查找点附近的边
pgr_findCloseEdges(Edges SQL, point, tolerance, [options])

-- 分离交叉几何体
pgr_separateCrossing(Edges SQL)

-- 分离相切几何体
pgr_separateTouching(Edges SQL)

-- 版本信息
pgr_version()
pgr_full_version()

使用几何体

构建路由拓扑

从空间边中提取顶点并构建拓扑:

-- 从边几何体中提取顶点
SELECT * INTO vertices
FROM pgr_extractVertices('SELECT id, geom FROM edges ORDER BY id');

-- 设置起始顶点
UPDATE edges AS e
SET source = v.id, x1 = x, y1 = y
FROM vertices AS v
WHERE ST_StartPoint(e.geom) = v.geom;

-- 设置终止顶点
UPDATE edges AS e
SET target = v.id, x2 = x, y2 = y
FROM vertices AS v
WHERE ST_EndPoint(e.geom) = v.geom;

基于几何体长度设置代价

UPDATE edges SET
  cost = sign(cost) * ST_Length(geom),
  reverse_cost = sign(reverse_cost) * ST_Length(geom);

获取路径几何体

将路由结果与边几何体结合:

SELECT seq, node, edge, cost, agg_cost, geom
FROM pgr_dijkstra(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  6, 10
) AS r
LEFT JOIN edges AS e ON r.edge = e.id;

性能优化

将查询限制在感兴趣的区域内,减少处理的边数:

SELECT * FROM pgr_dijkstra($$
  SELECT id, source, target, cost, reverse_cost
  FROM edges
  WHERE geom && (
    SELECT ST_Buffer(ST_Union(geom), 1)
    FROM edges WHERE source IN (7) OR target IN (8))$$,
  7, 8);

全对最短路径

用于计算所有顶点对之间的距离:

-- Floyd-Warshall(不需要边 ID)
pgr_floydWarshall(Edges SQL, [directed])

-- Johnson(不需要边 ID)
pgr_johnson(Edges SQL, [directed])

返回:(start_vid, end_vid, agg_cost)

SELECT * FROM pgr_floydWarshall(
  'SELECT id, source, target, cost, reverse_cost FROM edges');

22 - pointcloud

提供激光雷达点云数据类型支持

概览

扩展包名版本分类许可证语言
pointcloud1.2.5GISBSD 3-ClauseC
ID扩展名BinLibLoadCreateTrustReloc模式
1520pointcloud-
1521pointcloud_postgis-
相关扩展postgis postgis_raster postgis_topology postgis_sfcgal postgis_tiger_geocoder address_standardizer address_standardizer_data_us pgrouting
下游依赖pointcloud_postgis

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.2.51817161514pointcloud-
RPMPGDG1.2.51817161514pointcloud_$v-
DEBPGDG1.2.51817161514postgresql-$v-pointcloud-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
d12.aarch64
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
d13.x86_64
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
d13.aarch64
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
u22.x86_64
PGDG 1.2.5
u22.aarch64
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
u24.x86_64
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
u24.aarch64
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5
PGDG 1.2.5

安装

您可以直接安装 pointcloud 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pointcloud;          # 当前活跃 PG 版本安装
pig ext install -y pointcloud -v 18  # PG 18
pig ext install -y pointcloud -v 17  # PG 17
pig ext install -y pointcloud -v 16  # PG 16
pig ext install -y pointcloud -v 15  # PG 15
pig ext install -y pointcloud -v 14  # PG 14
dnf install -y pointcloud_18       # PG 18
dnf install -y pointcloud_17       # PG 17
dnf install -y pointcloud_16       # PG 16
dnf install -y pointcloud_15       # PG 15
dnf install -y pointcloud_14       # PG 14
apt install -y postgresql-18-pointcloud   # PG 18
apt install -y postgresql-17-pointcloud   # PG 17
apt install -y postgresql-16-pointcloud   # PG 16
apt install -y postgresql-15-pointcloud   # PG 15
apt install -y postgresql-14-pointcloud   # PG 14

创建扩展

CREATE EXTENSION pointcloud;

用法

pgpointcloud/pointcloud: 用于存储点云(LIDAR)数据的 PostgreSQL 扩展

文档

PostgreSQL Pointcloud 在 PostgreSQL 中存储点云(LIDAR)数据。它引入了两种新的数据类型:PcPoint 表示单个点,PcPatch 表示点的集合。数据通过 schema 文档来组织,描述每个点的维度和编码方式。

CREATE EXTENSION pointcloud;
-- 用于 PostGIS 集成:
CREATE EXTENSION pointcloud_postgis;

核心概念

Schema

PostgreSQL Pointcloud 使用"schema 文档"来描述特定 LIDAR 点的内容。每个点包含多个维度,每个维度可以是任意数据类型,并可应用缩放和/或偏移量来转换实际值与数据库存储值。schema 文档格式与 PDAL 库使用的格式相同。

以下是一个简单的 4 维 schema 文档:

INSERT INTO pointcloud_formats (pcid, srid, schema) VALUES (1, 4326,
'<?xml version="1.0" encoding="UTF-8"?>
<pc:PointCloudSchema xmlns:pc="http://pointcloud.org/schemas/PC/1.1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <pc:dimension>
    <pc:position>1</pc:position>
    <pc:size>4</pc:size>
    <pc:description>X 坐标,以长整数表示。需要使用头部的
                    缩放和偏移信息来确定双精度值。</pc:description>
    <pc:name>X</pc:name>
    <pc:interpretation>int32_t</pc:interpretation>
    <pc:scale>0.01</pc:scale>
  </pc:dimension>
  <pc:dimension>
    <pc:position>2</pc:position>
    <pc:size>4</pc:size>
    <pc:description>Y 坐标,以长整数表示。需要使用头部的
                    缩放和偏移信息来确定双精度值。</pc:description>
    <pc:name>Y</pc:name>
    <pc:interpretation>int32_t</pc:interpretation>
    <pc:scale>0.01</pc:scale>
  </pc:dimension>
  <pc:dimension>
    <pc:position>3</pc:position>
    <pc:size>4</pc:size>
    <pc:description>Z 坐标,以长整数表示。需要使用头部的
                    缩放和偏移信息来确定双精度值。</pc:description>
    <pc:name>Z</pc:name>
    <pc:interpretation>int32_t</pc:interpretation>
    <pc:scale>0.01</pc:scale>
  </pc:dimension>
  <pc:dimension>
    <pc:position>4</pc:position>
    <pc:size>2</pc:size>
    <pc:description>强度值是脉冲回波幅度的整数表示。
                    该值是可选的且与系统相关。但如果可用,
                    应始终包含在内。</pc:description>
    <pc:name>Intensity</pc:name>
    <pc:interpretation>uint16_t</pc:interpretation>
    <pc:scale>1</pc:scale>
  </pc:dimension>
  <pc:metadata>
    <Metadata name="compression">dimensional</Metadata>
  </pc:metadata>
</pc:PointCloudSchema>');

Schema 文档存储在 pointcloud_formats 表中,与 pcid(点云标识符)关联。每个对象只有一个 pcid,用于在 pointcloud_formats 中查找 schema。这类似于 PostGIS 中通过 srid 解析空间参考系统的方式。

点云对象

PcPoint:基本点云类型。每个点包含大量维度,但至少有 X 和 Y 坐标。可通过 PC_AsText(pcpoint) 渲染为 JSON 格式:

{
    "pcid" : 1,
      "pt" : [0.01, 0.02, 0.03, 4]
}

PcPatchPcPoint 的集合。LIDAR 数据不是存储数十亿条独立的点记录,而是表示为较少数量的 PcPatch 记录。Patch 通过 PC_AsText(pcpatch) 渲染:

{
    "pcid" : 1,
     "pts" : [
              [0.02, 0.03, 0.05, 6],
              [0.02, 0.03, 0.05, 8]
             ]
}

-- 需要上面的 schema 条目,使 pcid==1 存在。

-- 点表
CREATE TABLE points (
    id SERIAL PRIMARY KEY,
    pt PCPOINT(1)
);

-- Patch 表
CREATE TABLE patches (
    id SERIAL PRIMARY KEY,
    pa PCPATCH(1)
);

两个系统提供的表:

  • pointcloud_formats:保存所有 pcid 条目和 schema 文档
  • pointcloud_columns:显示所有包含点云对象的列的视图
SELECT * FROM pointcloud_columns;

 schema |    table    | column | pcid | srid |  type
--------+-------------+--------+------+------+---------
 public | points      | pt     |    1 | 4326 | pcpoint
 public | patches     | pa     |    1 | 4326 | pcpatch

压缩

压缩在 schema 文档的 <pc:metadata> 块中声明:

<pc:metadata>
  <Metadata name="compression">dimensional</Metadata>
</pc:metadata>

支持三种压缩方法:

  • None:使用 schema 文档中描述的类型和格式,以字节数组存储点和 patch。
  • Dimensional:将 patch 存储为维度数据数组的集合,并应用"适当的"压缩。适合较小的 patch 尺寸。
  • LAZ(LASZip):需要 Pointcloud 构建时支持 laz-perf。

如果未声明压缩方式,默认使用 none

维度压缩在内部使用三种方案:游程编码(低变异性)、公共位移除(窄位范围变异性)、以及基于 zlib 的原始 deflate 压缩。

函数:Schema

PC_SchemaGetNDims

PC_SchemaGetNDims(pcid integer) returns integer – 返回维度数量。

SELECT PC_SchemaGetNDims(1);
-- 18

PC_SchemaIsValid

PC_SchemaIsValid(xml text) returns boolean – 如果点云 schema 有效则返回 true。

SELECT PC_SchemaIsValid(schema) FROM pointcloud_formats LIMIT 1;
-- t

函数:PcPoint

PC_MakePoint

PC_MakePoint(pcid integer, vals float8[]) returns pcpoint – 从 pcid 和双精度数组构造新的 pcpoint。

SELECT PC_MakePoint(1, ARRAY[-127, 45, 124.0, 4.0]);

-- 010100000064CEFFFF94110000703000000400

插入测试值:

INSERT INTO points (pt)
SELECT PC_MakePoint(1, ARRAY[x,y,z,intensity])
FROM (
  SELECT
  -127+a/100.0 AS x,
    45+a/100.0 AS y,
         1.0*a AS z,
          a/10 AS intensity
  FROM generate_series(1,100) AS a
) AS values;

PC_AsText(点)

PC_AsText(p pcpoint) returns text – 返回点数据的 JSON 版本。

SELECT PC_AsText('010100000064CEFFFF94110000703000000400'::pcpoint);
-- {"pcid":1,"pt":[-127,45,124,4]}

PC_Get

PC_Get(pt pcpoint) returns float8[] – 返回所有维度值的数组。

SELECT PC_Get('010100000064CEFFFF94110000703000000400'::pcpoint);
-- {-127,45,124,4}

PC_Get(pt pcpoint, dimname text) returns numeric – 返回指定维度的值。

SELECT PC_Get('010100000064CEFFFF94110000703000000400'::pcpoint, 'Intensity');
-- 4

PC_MemSize(点)

PC_MemSize(pt pcpoint) returns int4 – 返回 pcpoint 的内存大小。

SELECT PC_MemSize(PC_MakePoint(1, ARRAY[-127, 45, 124.0, 4.0]));
-- 25

PC_PCId(点)

PC_PCId(p pcpoint) returns integer – 返回该点的 pcid schema 编号。

SELECT PC_PCId('010100000064CEFFFF94110000703000000400'::pcpoint);
-- 1

函数:PcPatch

PC_Patch

PC_Patch(pts pcpoint[]) returns pcpatch – 将 pcpoint 值聚合为 pcpatch 的聚合函数。

INSERT INTO patches (pa)
SELECT PC_Patch(pt) FROM points GROUP BY id/10;

PC_MakePatch

PC_MakePatch(pcid integer, vals float8[]) returns pcpatch – 从 pcid 和双精度数组构造新的 pcpatch(数组大小必须是维度数的倍数)。

SELECT PC_AsText(PC_MakePatch(1, ARRAY[-126.99,45.01,1,0, -126.98,45.02,2,0, -126.97,45.03,3,0]));

-- {"pcid":1,"pts":[
--  [-126.99,45.01,1,0],[-126.98,45.02,2,0],[-126.97,45.03,3,0]
-- ]}

PC_AsText(patch)

PC_AsText(p pcpatch) returns text – 返回 patch 数据的 JSON 版本。

SELECT PC_AsText(pa) FROM patches LIMIT 1;

-- {"pcid":1,"pts":[
--  [-126.99,45.01,1,0],[-126.98,45.02,2,0],[-126.97,45.03,3,0],
--  [-126.96,45.04,4,0],[-126.95,45.05,5,0],[-126.94,45.06,6,0],
--  [-126.93,45.07,7,0],[-126.92,45.08,8,0],[-126.91,45.09,9,0]
-- ]}

PC_Summary

PC_Summary(p pcpatch) returns text – 返回 patch 数据的 JSON 格式摘要。

SELECT PC_Summary(pa) FROM patches LIMIT 1;

-- {"pcid":1, "npts":9, "srid":4326, "compr":"dimensional",
--  "dims":[{"pos":0,"name":"X","size":4,"type":"int32_t","compr":"sigbits",
--           "stats":{"min":-126.99,"max":-126.91,"avg":-126.95}}, ...]}

PC_NumPoints

PC_NumPoints(p pcpatch) returns integer – 返回 patch 中的点数。

SELECT PC_NumPoints(pa) FROM patches LIMIT 1;
-- 9

PC_PCId(patch)

PC_PCId(p pcpatch) returns integer – 返回 patch 的 pcid schema 编号。

PC_MemSize(patch)

PC_MemSize(p pcpatch) returns int4 – 返回 pcpatch 的内存大小。

PC_Explode

PC_Explode(p pcpatch) returns SetOf[pcpoint] – 将 patch 转换为独立点记录的集合返回函数。

SELECT PC_AsText(PC_Explode(pa)), id
FROM patches WHERE id = 7;

              pc_astext               | id
--------------------------------------+----
 {"pcid":1,"pt":[-126.5,45.5,50,5]}   |  7
 {"pcid":1,"pt":[-126.49,45.51,51,5]} |  7
 {"pcid":1,"pt":[-126.48,45.52,52,5]} |  7
 ...

PC_PointN

PC_PointN(p pcpatch, n int4) returns pcpoint – 返回第 n 个点(从 1 开始)。负数 n 从末尾计数。

PC_Range

PC_Range(p pcpatch, start int4, n int4) returns pcpatch – 返回从第 start 个点开始包含 n 个点的 patch。

PC_Union

PC_Union(p pcpatch[]) returns pcpatch – 将多个 pcpatch 合并为单个 pcpatch 的聚合函数。

SELECT PC_NumPoints(PC_Union(pa)) FROM patches;
-- 100

PC_Intersects(patch-patch)

PC_Intersects(p1 pcpatch, p2 pcpatch) returns boolean – 如果 p1 的边界与 p2 的边界相交则返回 true。

PC_PatchAvg

PC_PatchAvg(p pcpatch, dimname text) returns numeric – 返回所有点中指定维度的平均值。

SELECT PC_PatchAvg(pa, 'intensity') FROM patches WHERE id = 7;
-- 5.0000000000000000

PC_PatchAvg(p pcpatch) returns pcpoint – 返回每个维度平均值的 PcPoint。

SELECT PC_AsText(PC_PatchAvg(pa)) FROM patches WHERE id = 7;
-- {"pcid":1,"pt":[-126.46,45.54,54.5,5]}

PC_PatchMin

PC_PatchMin(p pcpatch, dimname text) returns numeric – 返回指定维度的最小值。

PC_PatchMin(p pcpatch) returns pcpoint – 返回每个维度最小值的 PcPoint。

PC_PatchMax

PC_PatchMax(p pcpatch, dimname text) returns numeric – 返回指定维度的最大值。

PC_PatchMax(p pcpatch) returns pcpoint – 返回每个维度最大值的 PcPoint。

PC_FilterGreaterThan

PC_FilterGreaterThan(p pcpatch, dimname text, float8 value) returns pcpatch – 过滤值大于给定值的点。

SELECT PC_AsText(PC_FilterGreaterThan(pa, 'y', 45.57))
FROM patches WHERE id = 7;

-- {"pcid":1,"pts":[[-126.42,45.58,58,5],[-126.41,45.59,59,5]]}

PC_FilterLessThan

PC_FilterLessThan(p pcpatch, dimname text, float8 value) returns pcpatch – 过滤值小于给定值的点。

PC_FilterEquals

PC_FilterEquals(p pcpatch, dimname text, float8 value) returns pcpatch – 过滤值等于给定值的点。

PC_FilterBetween

PC_FilterBetween(p pcpatch, dimname text, float8 value1, float8 value2) returns pcpatch – 过滤值在 value1 和 value2 之间(不含)的点。

PC_Sort

PC_Sort(p pcpatch, dimnames text[]) returns pcpatch – 返回按给定维度字典排序的 patch 副本。

PC_IsSorted

PC_IsSorted(p pcpatch, dimnames text[], strict boolean default true) returns boolean – 检查 pcpatch 是否按字典顺序排序。strict 选项检查是否无重复。

PC_SetPCId

PC_SetPCId(p pcpatch, pcid int4, def float8 default 0.0) returns pcpatch – 设置 PcPatch 的 schema。对于新 schema 中有但旧 schema 中没有的维度,使用值 def(默认 0.0)。

PC_Transform

PC_Transform(p pcpatch, pcid int4, def float8 default 0.0) returns pcpatch – 返回基于目标 schema 转换数据的新 patch。与 PC_SetPCId 不同,如果解释方式、缩放或偏移不同,可能会改变 patch 数据。

PC_Compress

PC_Compress(p pcpatch, global_compression_scheme text, compression_config text) returns pcpatch – 使用手动指定的方案压缩 patch。

允许的全局压缩方案:autolazdimensional。对于 dimensional,配置是每个维度压缩方式的逗号分隔列表:autozlibsigbitsrle

PC_Uncompress

PC_Uncompress(p pcpatch) returns pcpatch – 返回未压缩版本(压缩类型 none)。必须作为查询中的最外层函数才能在线路上返回未压缩数据。

函数:WKB

PC_AsBinary(点)

PC_AsBinary(p pcpoint) returns bytea – 返回点的 OGC “well-known binary” 格式。

PC_EnvelopeAsBinary

PC_EnvelopeAsBinary(p pcpatch) returns bytea – 返回 patch 二维边界的 OGC WKB。

注意:PC_EnvelopePC_EnvelopeAsBinary 的已弃用别名。

PC_BoundingDiagonalAsBinary

PC_BoundingDiagonalAsBinary(p pcpatch) returns bytea – 返回 patch 边界对角线的 OGC WKB。

函数:PostGIS 集成

pointcloud_postgis 扩展添加了将 Pointcloud 与 PostGIS 配合使用的函数,可将 PcPointPcPatch 转换为 Geometry 并进行空间过滤。

CREATE EXTENSION postgis;
CREATE EXTENSION pointcloud;
CREATE EXTENSION pointcloud_postgis;

Geometry 转换

Geometry(pcpoint) returns geometry / pcpoint::geometry – 将 PcPoint 转换为 PostGIS geometry,映射 x/y/z/m。

SELECT ST_AsText(PC_MakePoint(1, ARRAY[-127, 45, 124.0, 4.0])::geometry);
-- POINT Z (-127 45 124)

PC_EnvelopeGeometry

PC_EnvelopeGeometry(pcpatch) returns geometry – 返回 2D 边界的 PostGIS 二维多边形。

SELECT ST_AsText(PC_EnvelopeGeometry(pa)) FROM patches LIMIT 1;
-- POLYGON((-126.99 45.01,-126.99 45.09,-126.91 45.09,-126.91 45.01,-126.99 45.01))

适合创建索引:

CREATE INDEX ON patches USING GIST(PC_EnvelopeGeometry(patch));

PC_BoundingDiagonalGeometry

PC_BoundingDiagonalGeometry(pcpatch) returns geometry – 返回边界对角线的 LineString(根据可用维度为 2D/Z/M/ZM)。

SELECT ST_AsText(PC_BoundingDiagonalGeometry(pa)) FROM patches;
-- LINESTRING Z (-126.99 45.01 1,-126.91 45.09 9)

适合创建 N 维索引:

CREATE INDEX ON patches USING GIST(PC_BoundingDiagonalGeometry(patch) gist_geometry_ops_nd);

PC_Intersection

PC_Intersection(pcpatch, geometry) returns pcpatch – 返回仅包含与几何体相交的点的 PcPatch。

SELECT PC_AsText(PC_Explode(PC_Intersection(
      pa,
      'SRID=4326;POLYGON((-126.451 45.552, -126.42 47.55, -126.40 45.552, -126.451 45.552))'::geometry
)))
FROM patches WHERE id = 7;

             pc_astext
--------------------------------------
 {"pcid":1,"pt":[-126.44,45.56,56,5]}
 {"pcid":1,"pt":[-126.43,45.57,57,5]}
 {"pcid":1,"pt":[-126.42,45.58,58,5]}
 {"pcid":1,"pt":[-126.41,45.59,59,5]}

PC_Intersects(patch-geometry)

PC_Intersects(p pcpatch, g geometry) returns boolean / PC_Intersects(g geometry, p pcpatch) returns boolean – 如果 patch 边界与几何体相交则返回 true。

SELECT PC_Intersects('SRID=4326;POINT(-126.451 45.552)'::geometry, pa)
FROM patches WHERE id = 7;
-- t

函数:工具

PC_Version / PC_Lib_Version / PC_Script_Version

SELECT PC_Version();           -- 1.2.5
SELECT PC_Lib_Version();       -- 1.2.5 2346cc2
SELECT PC_Script_Version();    -- 1.2.5
SELECT PC_Full_Version();
-- POINTCLOUD="1.2.5 2346cc2" PGSQL="170" LIBXML2="2.14.3 LAZPERF enabled=false

PC_Lazperf_Enabled

PC_Lazperf_Enabled() returns boolean – 如果 LAZperf 压缩支持可用则返回 true。

使用 PDAL 加载数据

PDAL 用于将 LIDAR 文件加载到 PostgreSQL Pointcloud 中。PDAL 管线是声明 reader、filter 和 writer 的 JSON 文件。

加载 LAS 文件的示例管线:

{
  "pipeline":[
    {
      "type":"readers.las",
      "filename":"/home/lidar/st-helens-small.las",
      "spatialreference":"EPSG:26910"
    },
    {
      "type":"filters.chipper",
      "capacity":400
    },
    {
      "type":"writers.pgpointcloud",
      "connection":"host='localhost' dbname='pc' user='lidar' password='lidar' port='5432'",
      "table":"sthsm",
      "compression":"dimensional",
      "srid":"26910"
    }
  ]
}

执行:

pdal pipeline --input pipelinefile.json

filters.chipper 将无序点分组为紧凑的 patch,以便高效存储。

PDAL Writer 选项

  • connection:PostgreSQL 连接字符串
  • table:写入 patch 的目标表
  • schema:创建表的 schema(可选)
  • column:patch 列名(默认:pa
  • compression:patch 压缩格式(默认:dimensional
  • overwrite:替换已有表(默认:true
  • srid:空间参考 ID(默认:4326
  • pcid:使用已有的 PCID(可选)
  • pre_sql / post_sql:管线前/后执行的 SQL(可选)

PDAL Reader 选项

  • connection:PostgreSQL 连接字符串
  • table:读取 patch 的源表
  • schema:读取的 schema(可选)
  • column:读取的列名(默认:pa
  • where:约束查询的 SQL where 子句(可选)
  • spatialreference:覆盖数据库 SRID(可选)

读取并导出的示例管线:

{
  "pipeline":[
    {
      "type":"readers.pgpointcloud",
      "connection":"host='localhost' dbname='pc' user='lidar' password='lidar' port='5432'",
      "table":"sthsm",
      "column":"pa",
      "spatialreference":"EPSG:26910",
      "where":"PC_Intersects(pa, ST_MakeEnvelope(560037.36, 5114846.45, 562667.31, 5118943.24, 26910))"
    },
    {
      "type":"writers.text",
      "filename":"/home/lidar/st-helens-small-out.txt"
    }
  ]
}

23 - pointcloud_postgis

将激光雷达点云与PostGIS几何类型相集成

概览

扩展包名版本分类许可证语言
pointcloud1.2.5GISBSD 3-ClauseC
ID扩展名BinLibLoadCreateTrustReloc模式
1520pointcloud-
1521pointcloud_postgis-
相关扩展postgis pointcloud postgis_raster postgis_topology postgis_sfcgal postgis_tiger_geocoder address_standardizer address_standardizer_data_us pgrouting h3

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.2.51817161514pointcloudpostgis, pointcloud
RPMPGDG1.2.51817161514pointcloud_$v-
DEBPGDG1.2.51817161514postgresql-$v-pointcloud-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
el8.aarch64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
el9.x86_64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
el9.aarch64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
el10.x86_64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
el10.aarch64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
d12.x86_64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
d12.aarch64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
d13.x86_64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
d13.aarch64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
u22.x86_64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
u22.aarch64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
u24.x86_64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5
u24.aarch64PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5PGDG 1.2.5

安装

您可以直接安装 pointcloud 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pointcloud;          # 当前活跃 PG 版本安装
pig ext install -y pointcloud -v 18  # PG 18
pig ext install -y pointcloud -v 17  # PG 17
pig ext install -y pointcloud -v 16  # PG 16
pig ext install -y pointcloud -v 15  # PG 15
pig ext install -y pointcloud -v 14  # PG 14
dnf install -y pointcloud_18       # PG 18
dnf install -y pointcloud_17       # PG 17
dnf install -y pointcloud_16       # PG 16
dnf install -y pointcloud_15       # PG 15
dnf install -y pointcloud_14       # PG 14
apt install -y postgresql-18-pointcloud   # PG 18
apt install -y postgresql-17-pointcloud   # PG 17
apt install -y postgresql-16-pointcloud   # PG 16
apt install -y postgresql-15-pointcloud   # PG 15
apt install -y postgresql-14-pointcloud   # PG 14

创建扩展

CREATE EXTENSION pointcloud_postgis CASCADE;  -- 依赖: postgis, pointcloud

用法

pointcloud_postgis: pgPointcloud 的 PostGIS 集成

pointcloud_postgis 是将 pgPointcloud 扩展与 PostGIS 集成的桥接扩展。它实现了点云几何类型与 PostGIS 几何类型之间的转换。

CREATE EXTENSION pointcloud_postgis;

该扩展需要同时安装 pointcloudpostgis。它添加了在 pcpoint/pcpatch 类型与 PostGIS geometry 类型之间转换的函数,使得可以使用 PostGIS 运算符和函数对点云数据进行空间查询。

24 - h3

H3六边形层级索引支持

概览

扩展包名版本分类许可证语言
pg_h34.2.3GISApache-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1530h3-
1531h3_postgis-
相关扩展postgis q3c pg_geohash postgis_topology postgis_raster postgis_sfcgal postgis_tiger_geocoder address_standardizer
下游依赖h3_postgis

pgdg missing el8.x86.pg17 and el8.x86.pg18

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG4.2.31817161514pg_h3-
RPMPGDG4.2.31817161514h3-pg_$v-
DEBPGDG4.2.31817161514postgresql-$v-h3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG MISSPGDG MISS
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

安装

您可以直接安装 pg_h3 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_h3;          # 当前活跃 PG 版本安装
pig ext install -y pg_h3 -v 18  # PG 18
pig ext install -y pg_h3 -v 17  # PG 17
pig ext install -y pg_h3 -v 16  # PG 16
pig ext install -y pg_h3 -v 15  # PG 15
pig ext install -y pg_h3 -v 14  # PG 14
dnf install -y h3-pg_18       # PG 18
dnf install -y h3-pg_17       # PG 17
dnf install -y h3-pg_16       # PG 16
dnf install -y h3-pg_15       # PG 15
dnf install -y h3-pg_14       # PG 14
apt install -y postgresql-18-h3   # PG 18
apt install -y postgresql-17-h3   # PG 17
apt install -y postgresql-16-h3   # PG 16
apt install -y postgresql-15-h3   # PG 15
apt install -y postgresql-14-h3   # PG 14

创建扩展

CREATE EXTENSION h3;

用法

h3-pg: Uber 的 H3 六边形层次地理空间索引系统的 PostgreSQL 绑定

该扩展为 H3 核心库(Uber 的六边形层次地理空间索引系统)提供 PostgreSQL 绑定。完整 API 参考请参见 H3 文档

通常,所有函数都从 H3 的 camelCase 重命名为 SQL 的 snake_case,并加上 h3_ 前缀。

CREATE EXTENSION h3;

SELECT h3_latlng_to_cell(POINT('37.3615593,-122.0553238'), 5);
  h3_latlng_to_cell
-------------------
 85e35e73fffffff

基础类型

h3index 类型是一个无符号 64 位整数,表示任何 H3 对象(六边形、五边形、有向边等),以 16 字符的十六进制字符串显示,如 '8928308280fffff'

索引函数

这些函数用于查找包含指定坐标的 H3 索引,以及获取 H3 索引的中心和边界。

-- 在指定分辨率(0-15)索引一个位置
SELECT h3_latlng_to_cell(POINT('37.3615593,-122.0553238'), 5);

-- 查找索引的质心
SELECT h3_cell_to_latlng('85283473fffffff'::h3index);

-- 查找索引的边界多边形
SELECT h3_cell_to_boundary('85283473fffffff'::h3index);

使用 SET h3.extend_antimeridian TO true 可在跨越 180 度经线时扩展坐标。

索引检查函数

-- 获取索引的分辨率(0-15)
SELECT h3_get_resolution('85283473fffffff'::h3index);

-- 获取基础单元格编号
SELECT h3_get_base_cell_number('85283473fffffff'::h3index);

-- 验证 H3 索引
SELECT h3_is_valid_cell('85283473fffffff'::h3index);

-- 检查索引是否为五边形
SELECT h3_is_pentagon('85283473fffffff'::h3index);

-- 检查分辨率是否为 Class III 方向
SELECT h3_is_res_class_iii('85283473fffffff'::h3index);

-- 查找索引相交的所有二十面体面
SELECT h3_get_icosahedron_faces('85283473fffffff'::h3index);

网格遍历函数

网格遍历可以查找起始单元格附近的单元格,以及确定从一个单元格到另一个单元格的遍历路径。

-- 获取距起点 k 步以内的所有索引
SELECT h3_grid_disk('85283473fffffff'::h3index, 2);

-- 带距离的索引
SELECT * FROM h3_grid_disk_distances('85283473fffffff'::h3index, 2);

-- 距离为 k 的空心六边形环
SELECT h3_grid_ring_unsafe('85283473fffffff'::h3index, 1);

-- 两个单元格之间的索引路径(含端点)
SELECT h3_grid_path_cells('85283473fffffff'::h3index, '8528342bfffffff'::h3index);

-- 两个索引之间的网格距离
SELECT h3_grid_distance('85283473fffffff'::h3index, '8528342bfffffff'::h3index);

-- 局部 IJ 坐标
SELECT h3_cell_to_local_ij('85283473fffffff'::h3index, '8528342bfffffff'::h3index);
SELECT h3_local_ij_to_cell('85283473fffffff'::h3index, POINT(0,0));

层次网格函数

在 H3 网格系统中的不同分辨率之间移动,生成父级(更粗)或子级(更细)单元格。

-- 获取更粗分辨率的父单元格
SELECT h3_cell_to_parent('85283473fffffff'::h3index, 3);

-- 获取更细分辨率的所有子单元格
SELECT h3_cell_to_children('85283473fffffff'::h3index, 7);

-- 获取更细分辨率的中心子单元格
SELECT h3_cell_to_center_child('85283473fffffff'::h3index, 7);

-- 压缩单元格数组
SELECT h3_compact_cells(ARRAY['85283473fffffff'::h3index, '85283477fffffff'::h3index]);

-- 解压到目标分辨率
SELECT h3_uncompact_cells(ARRAY['85283473fffffff'::h3index], 7);

-- 获取子单元格在父单元格子列表中的位置
SELECT h3_cell_to_child_pos('872834700ffffff'::h3index, 5);

-- 获取指定位置的子单元格
SELECT h3_child_pos_to_cell(0, '85283473fffffff'::h3index, 7);

区域函数

在 H3 索引和多边形区域之间互转。

-- 用指定分辨率的六边形填充多边形
SELECT h3_polygon_to_cells(
    '((37.7,-122.5),(37.8,-122.5),(37.8,-122.4),(37.7,-122.4))'::polygon,
    NULL::polygon[],
    5
);

-- 获取一组六边形的轮廓多边形
SELECT * FROM h3_cells_to_multi_polygon(
    ARRAY['85283473fffffff'::h3index, '85283477fffffff'::h3index]
);

单向边函数

编码从一个单元格到相邻单元格的有向边。

-- 检查两个单元格是否相邻
SELECT h3_are_neighbor_cells('85283473fffffff'::h3index, '85283477fffffff'::h3index);

-- 获取相邻单元格之间的有向边
SELECT h3_cells_to_directed_edge('85283473fffffff'::h3index, '85283477fffffff'::h3index);

-- 验证边
SELECT h3_is_valid_directed_edge(edge) FROM ...;

-- 从边获取起点和终点
SELECT h3_get_directed_edge_origin(edge);
SELECT h3_get_directed_edge_destination(edge);

-- 以记录形式获取两端
SELECT * FROM h3_directed_edge_to_cells(edge);

-- 从一个单元格出发的所有边
SELECT h3_origin_to_directed_edges('85283473fffffff'::h3index);

-- 边界坐标
SELECT h3_directed_edge_to_boundary(edge);

顶点函数

-- 获取单元格的单个顶点
SELECT h3_cell_to_vertex('85283473fffffff'::h3index, 0);

-- 获取单元格的所有顶点
SELECT h3_cell_to_vertexes('85283473fffffff'::h3index);

-- 获取顶点的地理坐标
SELECT h3_vertex_to_latlng(vertex);

-- 验证顶点
SELECT h3_is_valid_vertex(vertex);

杂项函数

-- 两点之间的大圆距离(km、m 或 rads)
SELECT h3_great_circle_distance(POINT(37.7,-122.5), POINT(40.7,-74.0), 'km');

-- 指定分辨率的六边形平均面积
SELECT h3_get_hexagon_area_avg(5, 'km^2');

-- 特定单元格的精确面积
SELECT h3_cell_area('85283473fffffff'::h3index, 'km^2');

-- 指定分辨率的平均边长
SELECT h3_get_hexagon_edge_length_avg(5, 'km');

-- 精确边长
SELECT h3_edge_length(edge, 'km');

-- 指定分辨率的唯一单元格数
SELECT h3_get_num_cells(5);

-- 全部 122 个分辨率 0 的单元格
SELECT h3_get_res_0_cells();

-- 指定分辨率的所有五边形
SELECT h3_get_pentagons(5);

运算符

-- 网格距离运算符
SELECT '85283473fffffff'::h3index <-> '8528342bfffffff'::h3index;

-- B-tree 等于/不等于
SELECT a = b, a <> b FROM ...;

-- R-tree 空间运算符
SELECT a && b  -- 相交
SELECT a @> b  -- 包含
SELECT a <@ b  -- 被包含

SP-GiST 索引(实验性)

CREATE INDEX spgist_idx ON h3_data USING spgist(hex h3index_ops_experimental);

类型转换

-- H3 索引与 bigint 互转
SELECT '85283473fffffff'::h3index::bigint;
SELECT 599686042433355775::bigint::h3index;

-- H3 索引转 point
SELECT '85283473fffffff'::h3index::point;

PostGIS 集成

传递给 h3-pg PostGIS 函数的 GEOMETRY 数据应使用 SRID 4326。使用其他 SRID(如 3857)可能导致错误或无效数据。

PostGIS 集成需要伴随扩展 h3_postgis

CREATE EXTENSION h3_postgis CASCADE;

-- 对 PostGIS 几何体建立指定分辨率的索引
SELECT h3_latlng_to_cell(geom, 9) FROM points;

-- 将 H3 单元格转换为 PostGIS geometry/geography
SELECT h3_cell_to_geometry('85283473fffffff'::h3index);
SELECT h3_cell_to_geography('85283473fffffff'::h3index);

-- 单元格边界转 PostGIS 几何体(在反子午线处分割)
SELECT h3_cell_to_boundary_geometry('85283473fffffff'::h3index);

-- 用 H3 单元格填充 PostGIS 多边形
SELECT h3_polygon_to_cells(geom, 7) FROM polygons;

-- 将 H3 单元格转回 PostGIS 多多边形
SELECT h3_cells_to_multi_polygon_geometry(ARRAY['85283473fffffff'::h3index]);

-- PostGIS 索引运算符
SELECT geom @ 9 FROM points;  -- geometry @ resolution

栅格处理

对于连续栅格数据(温度、高程等),汇总 H3 单元格内的像素值:

SELECT
    (summary).h3 AS h3,
    (h3_raster_summary_stats_agg((summary).stats)).*
FROM (
    SELECT h3_raster_summary(rast, 8) AS summary
    FROM rasters
) t
GROUP BY 1;

对于离散/分类栅格数据(土地覆盖、土地利用),按 H3 单元格聚合分类统计:

SELECT
    h3,
    jsonb_object_agg(
        concat('class_', val::text),
        h3_raster_class_summary_item_to_jsonb(item)
        ORDER BY val
    ) AS summary
FROM (
    SELECT h3, val, h3_raster_class_summary_item_agg(summary) AS item
    FROM rasters, h3_raster_class_summary(rast, 8)
    GROUP BY 1, 2
) t
GROUP BY 1;

栅格汇总方法:h3_raster_summary(自动选择)、h3_raster_summary_clip(按单元格几何体裁剪)、h3_raster_summary_centroids(按像素质心分组)、h3_raster_summary_subpixel(适用于亚像素 H3 单元格)。分类汇总也有相同的变体。

25 - h3_postgis

H3与PostGIS集成的扩展插件

概览

扩展包名版本分类许可证语言
pg_h34.2.3GISApache-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1530h3-
1531h3_postgis-
相关扩展h3 postgis postgis_raster mobilitydb postgis_topology postgis_sfcgal postgis_tiger_geocoder address_standardizer address_standardizer_data_us pgrouting pointcloud

pgdg missing el8.x86.pg17 and el8.x86.pg18

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG4.2.31817161514pg_h3h3, postgis, postgis_raster
RPMPGDG4.2.31817161514h3-pg_$v-
DEBPGDG4.2.31817161514postgresql-$v-h3-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG MISSPGDG MISSPGDG 4.1.3PGDG 4.1.3PGDG 4.1.3
el8.aarch64PGDG 4.2.3PGDG 4.1.3PGDG 4.1.3PGDG 4.1.3PGDG 4.1.3
el9.x86_64PGDG 4.2.3PGDG 4.1.3PGDG 4.1.3PGDG 4.1.3PGDG 4.1.3
el9.aarch64PGDG 4.2.3PGDG 4.1.3PGDG 4.1.3PGDG 4.1.3PGDG 4.1.3
el10.x86_64PGDG 4.2.3PGDG 4.2.2PGDG 4.2.2PGDG 4.2.2PGDG 4.2.2
el10.aarch64PGDG 4.2.3PGDG 4.2.2PGDG 4.2.2PGDG 4.2.2PGDG 4.2.2
d12.x86_64PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3
d12.aarch64PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3
d13.x86_64PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3
d13.aarch64PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3
u22.x86_64PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3
u22.aarch64PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3
u24.x86_64PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3
u24.aarch64PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3PGDG 4.2.3

安装

您可以直接安装 pg_h3 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_h3;          # 当前活跃 PG 版本安装
pig ext install -y pg_h3 -v 18  # PG 18
pig ext install -y pg_h3 -v 17  # PG 17
pig ext install -y pg_h3 -v 16  # PG 16
pig ext install -y pg_h3 -v 15  # PG 15
pig ext install -y pg_h3 -v 14  # PG 14
dnf install -y h3-pg_18       # PG 18
dnf install -y h3-pg_17       # PG 17
dnf install -y h3-pg_16       # PG 16
dnf install -y h3-pg_15       # PG 15
dnf install -y h3-pg_14       # PG 14
apt install -y postgresql-18-h3   # PG 18
apt install -y postgresql-17-h3   # PG 17
apt install -y postgresql-16-h3   # PG 16
apt install -y postgresql-15-h3   # PG 15
apt install -y postgresql-14-h3   # PG 14

创建扩展

CREATE EXTENSION h3_postgis CASCADE;  -- 依赖: h3, postgis, postgis_raster

用法

h3_postgis: H3 的 PostGIS 集成

h3_postgis 是将 H3 六边形层次空间索引与 PostGIS 集成的桥接扩展。它实现了 H3 索引与 PostGIS 几何类型之间的转换。

CREATE EXTENSION h3_postgis CASCADE;

该扩展需要同时安装 h3postgis。它提供了在 H3 单元格索引与 PostGIS 几何体之间转换的函数,使得可以将 H3 的六边形网格系统与 PostGIS 的空间能力结合使用。

主要函数

-- 将 PostGIS 点转换为 H3 单元格索引
SELECT h3_latlng_to_cell(ST_MakePoint(-73.985, 40.748)::point, 9);

-- 获取 H3 单元格边界的 PostGIS 几何体
SELECT h3_cell_to_boundary_geometry('892a1008003ffff'::h3index);

-- 将 H3 单元格转换为 PostGIS 多边形用于可视化
SELECT h3_cell_to_geometry('892a1008003ffff'::h3index);

26 - q3c

Q3C天空索引插件

概览

扩展包名版本分类许可证语言
q3c2.0.2GISGPL-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1540q3c-
相关扩展h3 pg_geohash earthdistance pg_sphere postgis postgis_topology postgis_raster postgis_sfcgal

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG2.0.21817161514q3c-
RPMPGDG2.0.21817161514q3c_$v-
DEBPGDG2.0.21817161514postgresql-$v-q3c-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PGDG 2.0.2
PGDG 2.0.2
PGDG 2.0.2
PGDG 2.0.2
PGDG 2.0.2
d13.x86_64
d13.aarch64
PGDG 2.0.2
PGDG 2.0.2
PGDG 2.0.2
PGDG 2.0.2
PGDG 2.0.2
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

构建

您可以使用 pig build 命令构建 q3c 扩展的 RPM 包:

pig build pkg q3c         # 构建 RPM 包

安装

您可以直接安装 q3c 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install q3c;          # 当前活跃 PG 版本安装
pig ext install -y q3c -v 18  # PG 18
pig ext install -y q3c -v 17  # PG 17
pig ext install -y q3c -v 16  # PG 16
pig ext install -y q3c -v 15  # PG 15
pig ext install -y q3c -v 14  # PG 14
dnf install -y q3c_18       # PG 18
dnf install -y q3c_17       # PG 17
dnf install -y q3c_16       # PG 16
dnf install -y q3c_15       # PG 15
dnf install -y q3c_14       # PG 14
apt install -y postgresql-18-q3c   # PG 18
apt install -y postgresql-17-q3c   # PG 17
apt install -y postgresql-16-q3c   # PG 16
apt install -y postgresql-15-q3c   # PG 15
apt install -y postgresql-14-q3c   # PG 14

创建扩展

CREATE EXTENSION q3c;

用法

来源:segasai/q3c | ADASS 论文 | ASCL

Q3C(Quad Tree Cube)是一个用于天文星表快速天球索引的 PostgreSQL 扩展。它能够对球面坐标(赤经和赤纬)进行高效的空间查询,包括锥形搜索、椭圆搜索、多边形查询、位置交叉匹配和最近邻查找。

所有角度(ra、dec、距离)单位为,自行单位为毫角秒/年,历元单位为(如 2000.5、2010.5)。所有 Q3C 函数名以 q3c_ 为前缀。

表准备

要使用 Q3C,在包含 radec 列(单位为度)的表上创建空间索引:

CREATE INDEX ON mytable (q3c_ang2ipix(ra, dec));

可选择按索引对表进行聚簇,以确保大数据集上更快的查询:

CLUSTER mytable_q3c_ang2ipix_idx ON mytable;

或在建索引前重新排列表:

CREATE TABLE mytable1 AS SELECT * FROM mytable ORDER BY q3c_ang2ipix(ra, dec);

建索引后,分析表:

ANALYZE mytable;

函数

  • q3c_ang2ipix(ra, dec) – 返回给定 ra 和 dec 对应的 ipix 值(64 位整数像素标识符)

  • q3c_dist(ra1, dec1, ra2, dec2) – 返回两点之间的距离(度)

  • q3c_dist_pm(ra1, dec1, pmra1, pmdec1, cosdec_flag, epoch1, ra2, dec2, epoch2) – 返回考虑自行的两点距离(度)。cosdec_flag(0 或 1)指示自行是否包含 cos(dec) 项(1)或不包含(0)

  • q3c_join(ra1, dec1, ra2, dec2, radius) – 如果 (ra1, dec1) 在 (ra2, dec2) 的 radius 球面距离内则返回 true。需要在 q3c_ang2ipix(ra2, dec2) 上创建索引

  • q3c_join_pm(ra1, dec1, pmra1, pmdec1, cosdec_flag, epoch1, ra2, dec2, epoch2, max_delta_epoch, radius) – 类似 q3c_join 但考虑自行。max_delta_epoch 是两个表之间可能的最大历元差

  • q3c_ellipse_join(ra1, dec1, ra2, dec2, major, ratio, pa) – 类似 q3c_join,但 (ra1, dec1) 必须在以半长轴 major、轴比 ratio 和位置角 pa(从北向东)定义的椭圆内

  • q3c_radial_query(ra, dec, center_ra, center_dec, radius) – 如果 (ra, dec) 在 (center_ra, center_dec) 的 radius 度范围内则返回 true。锥形搜索的主要函数。需要在 q3c_ang2ipix(ra, dec) 上建索引

  • q3c_ellipse_query(ra, dec, center_ra, center_dec, maj_ax, axis_ratio, PA) – 如果 (ra, dec) 在以 (center_ra, center_dec) 为中心、由半长轴、轴比和位置角定义的椭圆内则返回 true

  • q3c_poly_query(ra, dec, poly) – 如果 (ra, dec) 在以 RA/DEC 值数组或 PostgreSQL polygon 类型指定的球面多边形内则返回 true。使用索引

  • q3c_ipix2ang(ipix) – 返回给定 ipix 对应的 (ra, dec) 两元素数组

  • q3c_pixarea(ipix, bits) – 返回给定 ipix 在 bits 指定的像素化级别对应的球面面积(1 最小,30 是立方体面)

  • q3c_ipixcenter(ra, dec, bits) – 返回覆盖指定 (ra, dec) 的特定像素深度的像素中心 ipix 值

  • q3c_in_poly(ra, dec, poly) – 返回点是否在多边形内。使用 q3c 索引

  • q3c_version() – 返回安装的 Q3C 版本

示例

锥形搜索

查询 (ra, dec) = (11, 12) 附近 0.1 度内的所有天体:

SELECT * FROM mytable WHERE q3c_radial_query(ra, dec, 11, 12, 0.1);

表的列名必须在前,搜索位置在后,否则索引不会被使用。

使用 q3c_join 的替代锥形搜索(对小表可能更快):

SELECT * FROM mytable WHERE q3c_join(11, 12, ra, dec, 0.1);

椭圆搜索

搜索以 (10, 20) 为中心、半长轴 1 度、轴比 0.5、位置角 10 度的椭圆内的天体:

SELECT * FROM mytable WHERE q3c_ellipse_query(ra, dec, 10, 20, 1, 0.5, 10);

多边形搜索

查询顶点为 (0,0)、(2,0)、(2,1)、(0,1) 的球面多边形内的天体:

SELECT * FROM mytable WHERE
    q3c_poly_query(ra, dec, ARRAY[0, 0, 2, 0, 2, 1, 0, 1]);

使用 PostgreSQL polygon 类型:

SELECT * FROM mytable WHERE
    q3c_poly_query(ra, dec, '((0, 0), (2, 0), (2, 1), (0, 1))'::polygon);

位置交叉匹配

在 0.001 度范围内交叉匹配 table1table2。索引需存在于 table2q3c_ang2ipix(ra, dec) 上:

SELECT * FROM table1 AS a, table2 AS b WHERE
    q3c_join(a.ra, a.dec, b.ra, b.dec, 0.001);

索引表的 ra/dec 列必须是第 3 和第 4 个参数。这会返回匹配距离内的所有配对,而不仅是最近邻。

使用逐对象误差半径:

SELECT * FROM table1 AS a, table2 AS b WHERE
    q3c_join(a.ra, a.dec, b.ra, b.dec, a.err);

椭圆交叉匹配

使用椭圆误差区域进行交叉匹配(如在星系椭圆体内匹配):

SELECT * FROM table1 AS a, table2 AS b WHERE
    q3c_ellipse_join(a.ra, a.dec, b.ra, b.dec, a.maj_ax, a.axis_ratio, a.PA);

含自行的交叉匹配

考虑自行修正的交叉匹配。假设 table1pmrapmdec(毫角秒/年)和 epoch 列,pmra 包含 cos(dec) 因子,最大历元差为 30 年:

SELECT * FROM table1 AS a, table2 AS b WHERE
    q3c_join_pm(a.ra, a.dec, a.pmra, a.pmdec, 1,
    a.epoch, b.ra, b.dec, b.epoch, 30, 0.001);

最近邻(未匹配返回 NULL)

为每行返回最近邻,1 角秒内无匹配则返回 NULL:

SELECT t.*, ss.* FROM mytable AS t
LEFT JOIN LATERAL (
    SELECT s.*
    FROM sdssdr9.phototag AS s
    WHERE q3c_join(t.ra, t.dec, s.ra, s.dec, 1./3600)
    ORDER BY q3c_dist(t.ra, t.dec, s.ra, s.dec) ASC
    LIMIT 1
) AS ss ON true;

最近邻(仅匹配项)

仅返回有邻居的天体:

SELECT t.*, ss.* FROM mytable AS t,
LATERAL (
    SELECT s.*
    FROM sdssdr9.phototag AS s
    WHERE q3c_join(t.ra, t.dec, s.ra, s.dec, 1./3600)
    ORDER BY q3c_dist(t.ra, t.dec, s.ra, s.dec) ASC
    LIMIT 1
) AS ss;

最近邻(CTE 变体)

使用带有对象 ID 列的 CTE(需要在 ID 列上建索引):

WITH x AS MATERIALIZED (
    SELECT *, (
        SELECT objid FROM sdssdr9.phototag AS p
        WHERE q3c_join(m.ra, m.dec, p.ra, p.dec, 1./3600)
        ORDER BY q3c_dist(m.ra, m.dec, p.ra, p.dec) ASC
        LIMIT 1
    ) AS match_objid
    FROM mytable AS m
)
SELECT * FROM x, sdssdr9.phototag AS s WHERE x.match_objid = s.objid;

密度估计

使用像素化深度 25 估计天体密度:

SELECT (q3c_ipix2ang(i))[1] AS ra,
       (q3c_ipix2ang(i))[2] AS dec,
       c,
       q3c_pixarea(i, 25) AS area
FROM (
    SELECT q3c_ipixcenter(ra, dec, 25) AS i, count(*) AS c
    FROM mytable
    GROUP BY i
) AS x;

注意:Q3C 的像素面积不均匀(与 HEALPIX 不同)。

限制

  • 不支持查询直径大于约 25 度的超大多边形
  • 不支持超过 100 个顶点的多边形

性能提示

  • 确保 Q3C 函数中的参数顺序正确(如 q3c_radial_query(ra, dec, 120, 3, 1) 而非 q3c_radial_query(120, 3, ra, dec, 1)
  • 使用 EXPLAIN 验证查询计划使用了 Q3C 索引的位图扫描
  • 如果规划器选择了不佳的计划,尝试:SET enable_mergejoin TO off; SET enable_seqscan TO off; SET enable_hashjoin TO off;
  • 按 Q3C 索引聚簇表以获得最佳性能
  • q3c_join() 与额外的过滤条件结合使用时,使用 MATERIALIZED CTE 避免计划问题:
WITH x AS MATERIALIZED (SELECT * FROM t1 WHERE t1.mag < 1),
     y AS (SELECT *, t2.mag AS t2mag FROM x, t2 WHERE q3c_join(x.ra, x.dec, t2.ra, t2.dec, 1./3600))
SELECT * FROM y WHERE t2mag > 33;

27 - ogr_fdw

GIS 数据外部数据源包装器

概览

扩展包名版本分类许可证语言
ogr_fdw1.1.7GISMITC
ID扩展名BinLibLoadCreateTrustReloc模式
1550ogr_fdw-
相关扩展postgis file_fdw postgres_fdw postgis_topology postgis_raster postgis_sfcgal postgis_tiger_geocoder address_standardizer

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.1.71817161514ogr_fdw-
RPMPGDG1.1.71817161514ogr_fdw_$v-
DEBPGDG1.1.71817161514postgresql-$v-ogr-fdw-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
d12.aarch64
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
d13.x86_64
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
d13.aarch64
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
u22.x86_64
u22.aarch64
PGDG 1.1.7
u24.x86_64
u24.aarch64
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7
PGDG 1.1.7

安装

您可以直接安装 ogr_fdw 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install ogr_fdw;          # 当前活跃 PG 版本安装
pig ext install -y ogr_fdw -v 18  # PG 18
pig ext install -y ogr_fdw -v 17  # PG 17
pig ext install -y ogr_fdw -v 16  # PG 16
pig ext install -y ogr_fdw -v 15  # PG 15
pig ext install -y ogr_fdw -v 14  # PG 14
dnf install -y ogr_fdw_18       # PG 18
dnf install -y ogr_fdw_17       # PG 17
dnf install -y ogr_fdw_16       # PG 16
dnf install -y ogr_fdw_15       # PG 15
dnf install -y ogr_fdw_14       # PG 14
apt install -y postgresql-18-ogr-fdw   # PG 18
apt install -y postgresql-17-ogr-fdw   # PG 17
apt install -y postgresql-16-ogr-fdw   # PG 16
apt install -y postgresql-15-ogr-fdw   # PG 15
apt install -y postgresql-14-ogr-fdw   # PG 14

创建扩展

CREATE EXTENSION ogr_fdw;

用法

ogr_fdw: PostgreSQL 的 OGR 外部数据包装器

OGR 是 GDAL 空间数据访问库的矢量部分。它允许通过简单的 C API 访问大量 GIS 数据格式。由于 OGR 暴露了简单的表结构,而 PostgreSQL 外部数据包装器允许访问表结构,两者的契合非常完美。

快速开始

CREATE EXTENSION postgis;
CREATE EXTENSION ogr_fdw;

使用 ogr_fdw_info 工具读取 OGR 数据源并输出服务器/表定义:

ogr_fdw_info -s /tmp/test -l pt_two
CREATE SERVER "myserver"
  FOREIGN DATA WRAPPER ogr_fdw
  OPTIONS (
    datasource '/tmp/test',
    format 'ESRI Shapefile' );

CREATE FOREIGN TABLE "pt_two" (
  fid integer,
  "geom" geometry(Point, 4326),
  "name" varchar,
  "age" integer,
  "height" real,
  "birthdate" date )
  SERVER "myserver"
  OPTIONS (layer 'pt_two');

SELECT * FROM pt_two;

支持过滤下推——包括简单谓词和边界框过滤(&&):

SET client_min_messages = debug1;

SELECT name, age, height
FROM pt_two
WHERE height < 5.7
AND geom && ST_MakeEnvelope(0, 0, 1, 1);
DEBUG:  OGR SQL: (height < 5.7)
DEBUG:  OGR spatial filter (0 0, 1 1)

限制

  • 需要 PostgreSQL 11 或更高版本
  • 仅有限的非空间查询限制会下推到 OGR(仅 ><<=>==
  • 仅边界框过滤(&&)会下推到空间过滤
  • OGR 连接每次查询都会创建(无连接池)
  • 每次都会检索所有列

示例

WFS(Web 要素服务)

CREATE SERVER geoserver
  FOREIGN DATA WRAPPER ogr_fdw
  OPTIONS (
    datasource 'WFS:https://demo.geo-solutions.it/geoserver/wfs',
    format 'WFS' );

CREATE FOREIGN TABLE topp_states (
  fid bigint,
  the_geom Geometry(MultiSurface,4326),
  gml_id varchar,
  state_name varchar,
  state_fips varchar,
  state_abbr varchar,
  land_km double precision,
  persons double precision )
  SERVER "geoserver"
  OPTIONS (layer 'topp:states');

文件地理数据库

CREATE SERVER fgdbtest
  FOREIGN DATA WRAPPER ogr_fdw
  OPTIONS (
    datasource '/tmp/Querying.gdb',
    format 'OpenFileGDB' );

CREATE FOREIGN TABLE cities (
  fid integer,
  geom geometry(Point, 4326),
  city_name varchar,
  state_name varchar,
  elevation integer,
  pop1990 integer )
  SERVER fgdbtest
  OPTIONS (layer 'Cities');

高级功能

可写表

如果 OGR 驱动支持,你可以插入/更新/删除记录。可写表需要在表定义中包含 fid 列。

ALTER SERVER myserver
  OPTIONS (ADD updateable 'true');

列名映射

将远程列名映射到本地列名:

CREATE FOREIGN TABLE typetest_fdw_mapped (
  fid bigint,
  supertime time OPTIONS (column_name 'clock'),
  thebestname varchar OPTIONS (column_name 'name') )
  SERVER wraparound
  OPTIONS (layer 'typetest');

自动表导入

使用 IMPORT FOREIGN SCHEMA 自动创建外部表定义:

CREATE SCHEMA fgdball;

-- 导入所有表
IMPORT FOREIGN SCHEMA ogr_all
  FROM SERVER fgdbtest
  INTO fgdball;

-- 导入指定表
IMPORT FOREIGN SCHEMA ogr_all
  LIMIT TO(cities)
  FROM SERVER fgdbtest
  INTO fgdball;

GDAL 选项

通过配置和打开选项控制驱动行为:

CREATE SERVER myserver_latin1
  FOREIGN DATA WRAPPER ogr_fdw
  OPTIONS (
    datasource '/tmp/test',
    format 'ESRI Shapefile',
    config_options 'SHAPE_ENCODING=LATIN1' );

多个配置选项可以作为空格分隔的列表传递。

28 - geoip

IP 地理位置扩展(围绕 MaxMind GeoLite 数据集的包装器)

概览

扩展包名版本分类许可证语言
geoip0.3.0GISBSD 2-ClauseSQL
ID扩展名BinLibLoadCreateTrustReloc模式
1560geoipgeoip
相关扩展ip4r postgis tzf country postgis_topology postgis_raster postgis_sfcgal postgis_tiger_geocoder address_standardizer

no pg17 on el9, no legacy branch on el8

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED0.3.01817161514geoipip4r
RPMPIGSTY0.3.01817161514geoip_$v-
DEBPIGSTY0.3.01817161514postgresql-$v-geoip-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
u22.x86_64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
u22.aarch64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
u24.x86_64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
u24.aarch64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0

构建

您可以使用 pig build 命令构建 geoip 扩展的 RPM / DEB 包:

pig build pkg geoip         # 构建 RPM / DEB 包

安装

您可以直接安装 geoip 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install geoip;          # 当前活跃 PG 版本安装
pig ext install -y geoip -v 18  # PG 18
pig ext install -y geoip -v 17  # PG 17
pig ext install -y geoip -v 16  # PG 16
pig ext install -y geoip -v 15  # PG 15
pig ext install -y geoip -v 14  # PG 14
dnf install -y geoip_18       # PG 18
dnf install -y geoip_17       # PG 17
dnf install -y geoip_16       # PG 16
dnf install -y geoip_15       # PG 15
dnf install -y geoip_14       # PG 14
apt install -y postgresql-18-geoip   # PG 18
apt install -y postgresql-17-geoip   # PG 17
apt install -y postgresql-16-geoip   # PG 16
apt install -y postgresql-15-geoip   # PG 15
apt install -y postgresql-14-geoip   # PG 14

创建扩展

CREATE EXTENSION geoip CASCADE;  -- 依赖: ip4r

用法

geoip: 基于 IP 的 PostgreSQL 地理定位

该扩展提供基于 IP 的地理定位——你提供一个 IPv4 或 IPv6 地址,扩展会查找国家、城市、GPS 坐标、ASN 等信息。它需要 ip4r 扩展和来自 MaxMind 的 GeoLite2 数据。

CREATE EXTENSION ip4r;
CREATE EXTENSION geoip;

函数

函数说明
geoip_country_code(ip4|ip6)返回国家代码(2 字符)
geoip_country(ip4|ip6)返回所有国家信息(代码、名称、网络)
geoip_city_location(ip4|ip6)仅返回位置 ID(INT)
geoip_city(ip4|ip6)返回所有城市信息(GPS、邮编等)
geoip_asn(ip4|ip6)返回 ASN 名称和 IP 范围

示例

SELECT geoip_country_code('78.45.133.255'::ip4);
-- CZ

SELECT * FROM geoip.geoip_city('78.45.133.255'::ip4);
--  geoname_id | country_iso_code | city_name | postal_code | ...
-- ------------+------------------+-----------+-------------+----
--     3066399 | CZ               | Sardice   | 696 13      | ...

SELECT * FROM geoip.geoip_country('78.45.133.255'::ip4);
--     network     | country_iso_code | country_name
-- ----------------+------------------+--------------
--  78.45.128.0/17 | CZ               | Czechia

SELECT * FROM geoip.geoip_asn('78.45.133.255'::ip4);
--    network    | asn_number |      asn_name
-- --------------+------------+---------------------
--  78.44.0.0/15 |       6830 | Liberty Global B.V.

加载数据

该扩展需要来自 MaxMind 的 GeoLite2 CSV 数据。从 MaxMind GeoLite2 下载 City、Country 和 ASN 数据集的 CSV 格式,然后加载:

cat GeoLite2-Country-Locations-en.csv | \
  psql $DBNAME -c 'COPY geoip.geoip_country_locations FROM stdin WITH (FORMAT CSV, HEADER)'

cat GeoLite2-Country-Blocks-IPv4.csv | \
  psql $DBNAME -c 'COPY geoip.geoip_country_blocks FROM stdin WITH (FORMAT CSV, HEADER)'

cat GeoLite2-Country-Blocks-IPv6.csv | \
  psql $DBNAME -c 'COPY geoip.geoip_country_blocks FROM stdin WITH (FORMAT CSV, HEADER)'

cat GeoLite2-City-Locations-en.csv | \
  psql $DBNAME -c 'COPY geoip.geoip_city_locations FROM stdin WITH (FORMAT CSV, HEADER)'

cat GeoLite2-City-Blocks-IPv4.csv | \
  psql $DBNAME -c 'COPY geoip.geoip_city_blocks FROM stdin WITH (FORMAT CSV, HEADER)'

cat GeoLite2-City-Blocks-IPv6.csv | \
  psql $DBNAME -c 'COPY geoip.geoip_city_blocks FROM stdin WITH (FORMAT CSV, HEADER)'

cat GeoLite2-ASN-Blocks-IPv4.csv | \
  psql $DBNAME -c 'COPY geoip.geoip_asn_blocks FROM stdin WITH (FORMAT CSV, HEADER)'

cat GeoLite2-ASN-Blocks-IPv6.csv | \
  psql $DBNAME -c 'COPY geoip.geoip_asn_blocks FROM stdin WITH (FORMAT CSV, HEADER)'

“locations” 文件有多种语言版本——选择适合你的即可。

29 - pg_polyline

Google快速Polyline编码解码扩展

概览

扩展包名版本分类许可证语言
pg_polyline0.0.1GISMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
1570pg_polyline-
相关扩展postgis pgrouting pg_geohash postgis_topology postgis_raster postgis_sfcgal postgis_tiger_geocoder address_standardizer

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.11817161514pg_polyline-
RPMPIGSTY0.0.11817161514pg_polyline_$v-
DEBPIGSTY0.0.11817161514postgresql-$v-pg-polyline-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d13.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u22.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u22.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u24.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u24.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1

构建

您可以使用 pig build 命令构建 pg_polyline 扩展的 RPM / DEB 包:

pig build pkg pg_polyline         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_polyline 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_polyline;          # 当前活跃 PG 版本安装
pig ext install -y pg_polyline -v 18  # PG 18
pig ext install -y pg_polyline -v 17  # PG 17
pig ext install -y pg_polyline -v 16  # PG 16
pig ext install -y pg_polyline -v 15  # PG 15
pig ext install -y pg_polyline -v 14  # PG 14
dnf install -y pg_polyline_18       # PG 18
dnf install -y pg_polyline_17       # PG 17
dnf install -y pg_polyline_16       # PG 16
dnf install -y pg_polyline_15       # PG 15
dnf install -y pg_polyline_14       # PG 14
apt install -y postgresql-18-pg-polyline   # PG 18
apt install -y postgresql-17-pg-polyline   # PG 17
apt install -y postgresql-16-pg-polyline   # PG 16
apt install -y postgresql-15-pg-polyline   # PG 15
apt install -y postgresql-14-pg-polyline   # PG 14

创建扩展

CREATE EXTENSION pg_polyline;

用法

pg_polyline: PostgreSQL 的 Google 编码折线编解码

快速的 Google 编码折线编码与解码 PostgreSQL 扩展。基于 pgrx 构建。

CREATE EXTENSION pg_polyline;

-- 将点数组编码为折线字符串
SELECT polyline_encode(
  ARRAY[point(-120.2, 38.5), point(-120.95, 40.7), point(-126.453, 43.252)], 6
);
--          polyline_encode
-- ----------------------------------
--  _izlhA~rlgdF_{geC~ywl@_kwzCn`{nI

-- 将折线字符串解码回点数组
SELECT polyline_decode('_ibE_seK_seK_seK', 6);
--       polyline_decode
-- ---------------------------
--  {"(0.2,0.1)","(0.4,0.3)"}

第二个参数是精度(小数位数)。

30 - pg_eviltransform

基于PostGIS ST_Transform 的 BD09/GCJ02 坐标转换扩展

概览

扩展包名版本分类许可证语言
pg_eviltransform0.0.2GISMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
1580pg_eviltransformeviltransform_internal
相关扩展postgis postgis pgrouting pg_geohash h3 q3c earthdistance tzf geoip

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.21817161514pg_eviltransformpostgis
RPMPIGSTY0.0.21817161514pg_eviltransform_$vpostgis36_$v
DEBPIGSTY0.0.21817161514postgresql-$v-eviltransformpostgresql-$v-postgis
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
d12.x86_64
d12.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
d13.x86_64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
d13.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u22.x86_64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u22.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u24.x86_64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u24.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2

构建

您可以使用 pig build 命令构建 pg_eviltransform 扩展的 RPM / DEB 包:

pig build pkg pg_eviltransform         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_eviltransform 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_eviltransform;          # 当前活跃 PG 版本安装
pig ext install -y pg_eviltransform -v 18  # PG 18
pig ext install -y pg_eviltransform -v 17  # PG 17
pig ext install -y pg_eviltransform -v 16  # PG 16
pig ext install -y pg_eviltransform -v 15  # PG 15
pig ext install -y pg_eviltransform -v 14  # PG 14
dnf install -y pg_eviltransform_18       # PG 18
dnf install -y pg_eviltransform_17       # PG 17
dnf install -y pg_eviltransform_16       # PG 16
dnf install -y pg_eviltransform_15       # PG 15
dnf install -y pg_eviltransform_14       # PG 14
apt install -y postgresql-18-eviltransform   # PG 18
apt install -y postgresql-17-eviltransform   # PG 17
apt install -y postgresql-16-eviltransform   # PG 16
apt install -y postgresql-15-eviltransform   # PG 15
apt install -y postgresql-14-eviltransform   # PG 14

创建扩展

CREATE EXTENSION pg_eviltransform CASCADE;  -- 依赖: postgis

用法

pg_eviltransform: WGS84、GCJ02 和 BD09 之间的坐标转换

pg_eviltransform 为 PostGIS 的 ST_Transform 扩展了 BD09/GCJ02 中国坐标系支持。它暴露了 ST_EvilTransform 函数,与 ST_Transform 具有相同的重载接口。

自定义 SRID:

  • 990001:GCJ02(火星坐标系)
  • 990002:BD09(百度坐标系)

函数

ST_EvilTransform(geometry, to_srid integer)
ST_EvilTransform(geometry, to_proj text)
ST_EvilTransform(geometry, from_proj text, to_srid integer)
ST_EvilTransform(geometry, from_proj text, to_proj text)

如果双方都不涉及自定义坐标系,则直接委托给 ST_Transform。如果涉及 BD09/GCJ02,会在需要时通过 WGS84(4326)进行中转。

示例

-- WGS84 转 GCJ02(使用文本字面量)
SELECT ST_EvilTransform(ST_SetSRID('POINT(120 30)'::geometry, 4326), 'GCJ02');

-- WGS84 转 BD09(使用文本字面量)
SELECT ST_EvilTransform(ST_SetSRID('POINT(120 30)'::geometry, 4326), 'BD09');

-- WGS84 转 GCJ02(使用数字 SRID)
SELECT ST_EvilTransform(ST_SetSRID('POINT(120 30)'::geometry, 4326), 990001);

-- BD09 转 Web Mercator
SELECT ST_EvilTransform(
  ST_SetSRID('POINT(120.011070620552 30.0038830555128)'::geometry, 990002), 3857
);

-- from_proj / to_proj 重载
SELECT ST_EvilTransform('POINT(120 30)'::geometry, 'EPSG:4326', 'GCJ02');

性能

在 PG18 上处理 200,000 行数据时,ST_EvilTransform 比基于正则表达式的 SQL 方法快约 30-45 倍。

31 - pg_geohash

使用GeoHash处理空间坐标的函数包

概览

扩展包名版本分类许可证语言
pg_geohash1.0GISMITC
ID扩展名BinLibLoadCreateTrustReloc模式
1590pg_geohash-
相关扩展postgis h3 q3c pg_polyline postgis_topology postgis_raster postgis_sfcgal postgis_tiger_geocoder

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514pg_geohash-
RPMPIGSTY1.01817161514pg_geohash_$v-
DEBPIGSTY1.01817161514postgresql-$v-pg-geohash-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 pg_geohash 扩展的 RPM / DEB 包:

pig build pkg pg_geohash         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_geohash 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_geohash;          # 当前活跃 PG 版本安装
pig ext install -y pg_geohash -v 18  # PG 18
pig ext install -y pg_geohash -v 17  # PG 17
pig ext install -y pg_geohash -v 16  # PG 16
pig ext install -y pg_geohash -v 15  # PG 15
pig ext install -y pg_geohash -v 14  # PG 14
dnf install -y pg_geohash_18       # PG 18
dnf install -y pg_geohash_17       # PG 17
dnf install -y pg_geohash_16       # PG 16
dnf install -y pg_geohash_15       # PG 15
dnf install -y pg_geohash_14       # PG 14
apt install -y postgresql-18-pg-geohash   # PG 18
apt install -y postgresql-17-pg-geohash   # PG 17
apt install -y postgresql-16-pg-geohash   # PG 16
apt install -y postgresql-15-pg-geohash   # PG 15
apt install -y postgresql-14-pg-geohash   # PG 14

创建扩展

CREATE EXTENSION pg_geohash;

用法

pg_geohash: PostgreSQL 的 Geohash 函数

基于 C 实现的 PostgreSQL Geohash 函数(同时支持 HAWQ 和 Greenplum)。基于 libgeohash C 库。

Geohash 背景知识:维基百科:Geohash

函数

将经纬度编码为指定精度的 geohash 字符串:

SELECT LAT_LON_TO_GEOHASH_WITH_LEN(latitude, longitude, 5) AS geohash;

将经纬度编码为全精度的 geohash:

SELECT LAT_LON_TO_GEOHASH(latitude, longitude) AS geohash;

将 geohash 解码回经纬度:

SELECT GEOHASH_TO_LAT_LON('dp3w7') AS lat_lon;

示例

使用 5 字符精度(约 2.4km x 4.9km 网格)计算基于 geohash 的聚合:

SELECT LAT_LON_TO_GEOHASH_WITH_LEN(latitude, longitude, 5) AS geohash,
       COUNT(*)
FROM crimes
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10;
 geohash | count
---------+-------
 dp3w7   | 72404
 dp3tt   | 70713
 dp3tw   | 63642
 dp3wm   | 62332
 dp3wk   | 56467

从 geohash 恢复坐标:

SELECT location,
       GEOHASH_TO_LAT_LON(LAT_LON_TO_GEOHASH(latitude, longitude))
FROM crimes
LIMIT 5;

32 - pghydro

PostgreSQL/PostGIS 排水网络分析核心扩展

概览

扩展包名版本分类许可证语言
pghydro6.6GISGPL-2.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1600pghydropghydro
1601pgh_rasterpgh_raster
1602pgh_hgmpgh_hgm
1603pgh_outputpgh_output
1604pgh_output_en_aupgh_output_en_au
1605pgh_output_pt_brpgh_output_pt_br
1606pgh_consistencypgh_consistency
相关扩展plpgsql postgis

Lead row; package also ships pgh_raster, pgh_hgm, pgh_output, pgh_output_en_au, pgh_output_pt_br, and pgh_consistency.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY6.61817161514pghydroplpgsql, postgis
RPMPIGSTY6.61817161514pghydro_$vpostgis36_$v
DEBPIGSTY6.61817161514postgresql-$v-pghydropostgresql-$v-postgis-3
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
u22.x86_64
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
u22.aarch64
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
u24.x86_64
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
u24.aarch64
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6
PIGSTY 6.6

构建

您可以使用 pig build 命令构建 pghydro 扩展的 RPM / DEB 包:

pig build pkg pghydro         # 构建 RPM / DEB 包

安装

您可以直接安装 pghydro 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pghydro;          # 当前活跃 PG 版本安装
pig ext install -y pghydro -v 18  # PG 18
pig ext install -y pghydro -v 17  # PG 17
pig ext install -y pghydro -v 16  # PG 16
pig ext install -y pghydro -v 15  # PG 15
pig ext install -y pghydro -v 14  # PG 14
dnf install -y pghydro_18       # PG 18
dnf install -y pghydro_17       # PG 17
dnf install -y pghydro_16       # PG 16
dnf install -y pghydro_15       # PG 15
dnf install -y pghydro_14       # PG 14
apt install -y postgresql-18-pghydro   # PG 18
apt install -y postgresql-17-pghydro   # PG 17
apt install -y postgresql-16-pghydro   # PG 16
apt install -y postgresql-15-pghydro   # PG 15
apt install -y postgresql-14-pghydro   # PG 14

创建扩展

CREATE EXTENSION pghydro CASCADE;  -- 依赖: plpgsql, postgis

用法

来源: GitHub 仓库, README, releases PgHydro 套件的主扩展。

PgHydro 在 PostGIS 和 PostgreSQL 之上提供排水网络分析与水资源决策支持。该项目覆盖河网建模、流向分析、Otto Pfafstetter 流域编码、上游与下游河段选择、距河口距离计算、上游汇水面积分析、河流等级以及流域层级等能力。

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION pghydro;
CREATE EXTENSION pgh_raster;
CREATE EXTENSION pgh_hgm;
CREATE EXTENSION pgh_consistency;
CREATE EXTENSION pgh_output;

组件

  • pghydro 是核心的排水网络分析扩展。
  • pgh_raster 使用从数字高程模型派生的水文产品。
  • pgh_hgmpghydropgh_raster 结合起来进行水文地貌分析。
  • pgh_output 提供报表对象。
  • pgh_consistency 增加 Pfafstetter 一致性检查。

环境要求

  • PostgreSQL 9.1 或更高版本。
  • PostGIS 3.x。
  • PostGIS Raster。

说明

  • README 表示 master 分支跟踪最新的小版本 6.6。
  • CSV 中的主行对应核心 pghydro 包,但该仓库在同一发布树中还提供配套扩展。

33 - pgh_raster

PgHydro 栅格水文分析扩展

概览

扩展包名版本分类许可证语言
pghydro6.6GISGPL-2.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1600pghydropghydro
1601pgh_rasterpgh_raster
1602pgh_hgmpgh_hgm
1603pgh_outputpgh_output
1604pgh_output_en_aupgh_output_en_au
1605pgh_output_pt_brpgh_output_pt_br
1606pgh_consistencypgh_consistency
相关扩展plpgsql postgis postgis_raster pghydro

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY6.61817161514pghydroplpgsql, postgis, postgis_raster, pghydro
RPMPIGSTY6.61817161514pghydro_$vpostgis36_$v
DEBPIGSTY6.61817161514postgresql-$v-pghydropostgresql-$v-postgis-3
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el8.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6

构建

您可以使用 pig build 命令构建 pghydro 扩展的 RPM / DEB 包:

pig build pkg pghydro         # 构建 RPM / DEB 包

安装

您可以直接安装 pghydro 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pghydro;          # 当前活跃 PG 版本安装
pig ext install -y pghydro -v 18  # PG 18
pig ext install -y pghydro -v 17  # PG 17
pig ext install -y pghydro -v 16  # PG 16
pig ext install -y pghydro -v 15  # PG 15
pig ext install -y pghydro -v 14  # PG 14
dnf install -y pghydro_18       # PG 18
dnf install -y pghydro_17       # PG 17
dnf install -y pghydro_16       # PG 16
dnf install -y pghydro_15       # PG 15
dnf install -y pghydro_14       # PG 14
apt install -y postgresql-18-pghydro   # PG 18
apt install -y postgresql-17-pghydro   # PG 17
apt install -y postgresql-16-pghydro   # PG 16
apt install -y postgresql-15-pghydro   # PG 15
apt install -y postgresql-14-pghydro   # PG 14

创建扩展

CREATE EXTENSION pgh_raster CASCADE;  -- 依赖: plpgsql, postgis, postgis_raster, pghydro

34 - pgh_hgm

PgHydro 水文地貌分析扩展

概览

扩展包名版本分类许可证语言
pghydro2.2.6GISGPL-2.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1600pghydropghydro
1601pgh_rasterpgh_raster
1602pgh_hgmpgh_hgm
1603pgh_outputpgh_output
1604pgh_output_en_aupgh_output_en_au
1605pgh_output_pt_brpgh_output_pt_br
1606pgh_consistencypgh_consistency
相关扩展plpgsql postgis postgis_raster pghydro pgh_raster

Extension version is 2.2.6, shipped inside pghydro package version 6.6.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.2.61817161514pghydroplpgsql, postgis, postgis_raster, pghydro, pgh_raster
RPMPIGSTY6.61817161514pghydro_$vpostgis36_$v
DEBPIGSTY6.61817161514postgresql-$v-pghydropostgresql-$v-postgis-3
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el8.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6

构建

您可以使用 pig build 命令构建 pghydro 扩展的 RPM / DEB 包:

pig build pkg pghydro         # 构建 RPM / DEB 包

安装

您可以直接安装 pghydro 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pghydro;          # 当前活跃 PG 版本安装
pig ext install -y pghydro -v 18  # PG 18
pig ext install -y pghydro -v 17  # PG 17
pig ext install -y pghydro -v 16  # PG 16
pig ext install -y pghydro -v 15  # PG 15
pig ext install -y pghydro -v 14  # PG 14
dnf install -y pghydro_18       # PG 18
dnf install -y pghydro_17       # PG 17
dnf install -y pghydro_16       # PG 16
dnf install -y pghydro_15       # PG 15
dnf install -y pghydro_14       # PG 14
apt install -y postgresql-18-pghydro   # PG 18
apt install -y postgresql-17-pghydro   # PG 17
apt install -y postgresql-16-pghydro   # PG 16
apt install -y postgresql-15-pghydro   # PG 15
apt install -y postgresql-14-pghydro   # PG 14

创建扩展

CREATE EXTENSION pgh_hgm CASCADE;  -- 依赖: plpgsql, postgis, postgis_raster, pghydro, pgh_raster

35 - pgh_output

PgHydro 输出与报表扩展

概览

扩展包名版本分类许可证语言
pghydro6.6GISGPL-2.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1600pghydropghydro
1601pgh_rasterpgh_raster
1602pgh_hgmpgh_hgm
1603pgh_outputpgh_output
1604pgh_output_en_aupgh_output_en_au
1605pgh_output_pt_brpgh_output_pt_br
1606pgh_consistencypgh_consistency
相关扩展plpgsql postgis pghydro

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY6.61817161514pghydroplpgsql, postgis, pghydro
RPMPIGSTY6.61817161514pghydro_$vpostgis36_$v
DEBPIGSTY6.61817161514postgresql-$v-pghydropostgresql-$v-postgis-3
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el8.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6

构建

您可以使用 pig build 命令构建 pghydro 扩展的 RPM / DEB 包:

pig build pkg pghydro         # 构建 RPM / DEB 包

安装

您可以直接安装 pghydro 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pghydro;          # 当前活跃 PG 版本安装
pig ext install -y pghydro -v 18  # PG 18
pig ext install -y pghydro -v 17  # PG 17
pig ext install -y pghydro -v 16  # PG 16
pig ext install -y pghydro -v 15  # PG 15
pig ext install -y pghydro -v 14  # PG 14
dnf install -y pghydro_18       # PG 18
dnf install -y pghydro_17       # PG 17
dnf install -y pghydro_16       # PG 16
dnf install -y pghydro_15       # PG 15
dnf install -y pghydro_14       # PG 14
apt install -y postgresql-18-pghydro   # PG 18
apt install -y postgresql-17-pghydro   # PG 17
apt install -y postgresql-16-pghydro   # PG 16
apt install -y postgresql-15-pghydro   # PG 15
apt install -y postgresql-14-pghydro   # PG 14

创建扩展

CREATE EXTENSION pgh_output CASCADE;  -- 依赖: plpgsql, postgis, pghydro

36 - pgh_output_en_au

PgHydro 澳式英语输出扩展

概览

扩展包名版本分类许可证语言
pghydro6.6GISGPL-2.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1600pghydropghydro
1601pgh_rasterpgh_raster
1602pgh_hgmpgh_hgm
1603pgh_outputpgh_output
1604pgh_output_en_aupgh_output_en_au
1605pgh_output_pt_brpgh_output_pt_br
1606pgh_consistencypgh_consistency
相关扩展plpgsql postgis pghydro

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY6.61817161514pghydroplpgsql, postgis, pghydro
RPMPIGSTY6.61817161514pghydro_$vpostgis36_$v
DEBPIGSTY6.61817161514postgresql-$v-pghydropostgresql-$v-postgis-3
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el8.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6

构建

您可以使用 pig build 命令构建 pghydro 扩展的 RPM / DEB 包:

pig build pkg pghydro         # 构建 RPM / DEB 包

安装

您可以直接安装 pghydro 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pghydro;          # 当前活跃 PG 版本安装
pig ext install -y pghydro -v 18  # PG 18
pig ext install -y pghydro -v 17  # PG 17
pig ext install -y pghydro -v 16  # PG 16
pig ext install -y pghydro -v 15  # PG 15
pig ext install -y pghydro -v 14  # PG 14
dnf install -y pghydro_18       # PG 18
dnf install -y pghydro_17       # PG 17
dnf install -y pghydro_16       # PG 16
dnf install -y pghydro_15       # PG 15
dnf install -y pghydro_14       # PG 14
apt install -y postgresql-18-pghydro   # PG 18
apt install -y postgresql-17-pghydro   # PG 17
apt install -y postgresql-16-pghydro   # PG 16
apt install -y postgresql-15-pghydro   # PG 15
apt install -y postgresql-14-pghydro   # PG 14

创建扩展

CREATE EXTENSION pgh_output_en_au CASCADE;  -- 依赖: plpgsql, postgis, pghydro

37 - pgh_output_pt_br

PgHydro 巴西葡语输出扩展

概览

扩展包名版本分类许可证语言
pghydro6.6GISGPL-2.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1600pghydropghydro
1601pgh_rasterpgh_raster
1602pgh_hgmpgh_hgm
1603pgh_outputpgh_output
1604pgh_output_en_aupgh_output_en_au
1605pgh_output_pt_brpgh_output_pt_br
1606pgh_consistencypgh_consistency
相关扩展plpgsql postgis pghydro

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY6.61817161514pghydroplpgsql, postgis, pghydro
RPMPIGSTY6.61817161514pghydro_$vpostgis36_$v
DEBPIGSTY6.61817161514postgresql-$v-pghydropostgresql-$v-postgis-3
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el8.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6

构建

您可以使用 pig build 命令构建 pghydro 扩展的 RPM / DEB 包:

pig build pkg pghydro         # 构建 RPM / DEB 包

安装

您可以直接安装 pghydro 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pghydro;          # 当前活跃 PG 版本安装
pig ext install -y pghydro -v 18  # PG 18
pig ext install -y pghydro -v 17  # PG 17
pig ext install -y pghydro -v 16  # PG 16
pig ext install -y pghydro -v 15  # PG 15
pig ext install -y pghydro -v 14  # PG 14
dnf install -y pghydro_18       # PG 18
dnf install -y pghydro_17       # PG 17
dnf install -y pghydro_16       # PG 16
dnf install -y pghydro_15       # PG 15
dnf install -y pghydro_14       # PG 14
apt install -y postgresql-18-pghydro   # PG 18
apt install -y postgresql-17-pghydro   # PG 17
apt install -y postgresql-16-pghydro   # PG 16
apt install -y postgresql-15-pghydro   # PG 15
apt install -y postgresql-14-pghydro   # PG 14

创建扩展

CREATE EXTENSION pgh_output_pt_br CASCADE;  -- 依赖: plpgsql, postgis, pghydro

38 - pgh_consistency

PgHydro Pfafstetter 一致性检查扩展

概览

扩展包名版本分类许可证语言
pghydro6.6GISGPL-2.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1600pghydropghydro
1601pgh_rasterpgh_raster
1602pgh_hgmpgh_hgm
1603pgh_outputpgh_output
1604pgh_output_en_aupgh_output_en_au
1605pgh_output_pt_brpgh_output_pt_br
1606pgh_consistencypgh_consistency
相关扩展plpgsql postgis pghydro

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY6.61817161514pghydroplpgsql, postgis, pghydro
RPMPIGSTY6.61817161514pghydro_$vpostgis36_$v
DEBPIGSTY6.61817161514postgresql-$v-pghydropostgresql-$v-postgis-3
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el8.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el9.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
el10.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d12.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
d13.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u22.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.x86_64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6
u24.aarch64PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6PIGSTY 6.6

构建

您可以使用 pig build 命令构建 pghydro 扩展的 RPM / DEB 包:

pig build pkg pghydro         # 构建 RPM / DEB 包

安装

您可以直接安装 pghydro 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pghydro;          # 当前活跃 PG 版本安装
pig ext install -y pghydro -v 18  # PG 18
pig ext install -y pghydro -v 17  # PG 17
pig ext install -y pghydro -v 16  # PG 16
pig ext install -y pghydro -v 15  # PG 15
pig ext install -y pghydro -v 14  # PG 14
dnf install -y pghydro_18       # PG 18
dnf install -y pghydro_17       # PG 17
dnf install -y pghydro_16       # PG 16
dnf install -y pghydro_15       # PG 15
dnf install -y pghydro_14       # PG 14
apt install -y postgresql-18-pghydro   # PG 18
apt install -y postgresql-17-pghydro   # PG 17
apt install -y postgresql-16-pghydro   # PG 16
apt install -y postgresql-15-pghydro   # PG 15
apt install -y postgresql-14-pghydro   # PG 14

创建扩展

CREATE EXTENSION pgh_consistency CASCADE;  -- 依赖: plpgsql, postgis, pghydro

39 - mobilitydb

MobilityDB地理空间投影数据管理分析平台

概览

扩展包名版本分类许可证语言
mobilitydb1.3.0GISGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1650mobilitydb-
1651mobilitydb_datagen-
相关扩展postgis pgrouting h3_postgis timescaledb postgis_topology postgis_raster postgis_sfcgal postgis_tiger_geocoder address_standardizer
下游依赖mobilitydb_datagen

need another schema

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.3.01817161514mobilitydbpostgis
DEBPGDG1.3.01817161514postgresql-$v-mobilitydb-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el8.aarch64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el9.x86_64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el9.aarch64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el10.x86_64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el10.aarch64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64PGDG MISS
u22.aarch64PGDG MISS
PGDG 1.2.0
PGDG 1.2.0
PGDG 1.2.0
PGDG 1.2.0
u24.x86_64
u24.aarch64

安装

您可以直接安装 mobilitydb 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install mobilitydb;          # 当前活跃 PG 版本安装
pig ext install -y mobilitydb -v 18  # PG 18
pig ext install -y mobilitydb -v 17  # PG 17
pig ext install -y mobilitydb -v 16  # PG 16
pig ext install -y mobilitydb -v 15  # PG 15
pig ext install -y mobilitydb -v 14  # PG 14
apt install -y postgresql-18-mobilitydb   # PG 18
apt install -y postgresql-17-mobilitydb   # PG 17
apt install -y postgresql-16-mobilitydb   # PG 16
apt install -y postgresql-15-mobilitydb   # PG 15
apt install -y postgresql-14-mobilitydb   # PG 14

创建扩展

CREATE EXTENSION mobilitydb CASCADE;  -- 依赖: postgis

用法

mobilitydb: PostgreSQL 的时态与时空数据管理扩展

MobilityDB 通过时态和时空数据类型扩展了 PostgreSQL 和 PostGIS,实现了移动对象数据(如车辆轨迹、传感器读数和时变属性)的高效存储、索引和查询。

核心文档:

快速开始

MobilityDB 依赖 PostGIS。需要同时启用两个扩展:

CREATE EXTENSION PostGIS;
CREATE EXTENSION MobilityDB;

时态类型

MobilityDB 提供基础类型的时态变体:

时态类型基础类型描述
tboolboolean时变布尔值
tintinteger时变整数
tfloatfloat时变浮点数
ttexttext时变文本
tgeompointgeometry(Point)时变几何点
tgeogpointgeography(Point)时变地理点

时态子类型

每种时态类型根据值随时间变化的方式可用不同子类型表示:

子类型描述示例
瞬时值(Instant)单个时间戳上的单个值'25.5@2025-01-01 08:00'
序列(Sequence)时间区间上的连续值'[25.5@08:00, 28.1@09:00, 30.0@10:00]'
序列集(SequenceSet)不重叠序列的集合'{[25.5@08:00, 28.1@09:00], [30.0@11:00, 31.2@12:00]}'

序列使用方括号表示包含 [ 或排除 ( 的边界,与 PostgreSQL 范围类型一致。

创建时态值

瞬时值:

SELECT tfloat '25.5@2025-06-01 08:00:00+00';
SELECT tgeompoint 'SRID=4326;Point(2.3522 48.8566)@2025-06-01 08:00:00+00';

序列值(连续插值):

SELECT tfloat '[20.0@2025-06-01 08:00, 25.5@2025-06-01 09:00, 22.0@2025-06-01 10:00]';

离散序列(阶梯插值):

SELECT tint 'Interp=Step;[10@2025-06-01 08:00, 20@2025-06-01 09:00, 15@2025-06-01 10:00]';

序列集值:

SELECT tfloat '{[20.0@08:00, 25.5@09:00], [22.0@11:00, 28.0@12:00]}';

通过组件构造:

SELECT tgeompoint_inst(ST_Point(2.3522, 48.8566, 4326), '2025-06-01 08:00+00');
SELECT tgeompoint_seq(ARRAY[
    tgeompoint_inst(ST_Point(2.3522, 48.8566, 4326), '2025-06-01 08:00+00'),
    tgeompoint_inst(ST_Point(2.2945, 48.8584, 4326), '2025-06-01 08:30+00'),
    tgeompoint_inst(ST_Point(2.3364, 48.8606, 4326), '2025-06-01 09:00+00')
]);

时态操作

获取特定时间的值:

SELECT valueAtTimestamp(temp, '2025-06-01 08:30:00+00')
FROM (SELECT tfloat '[20.0@08:00, 30.0@09:00]' AS temp) t;
-- 返回 25.0(线性插值)

限制到特定时间段:

SELECT atTime(trip, tstzspan '[2025-06-01 08:00, 2025-06-01 09:00]')
FROM trips;

获取时态值的时间跨度:

SELECT duration(trip), startTimestamp(trip), endTimestamp(trip)
FROM trips;

时态比较:

-- 温度超过 30 度的时间段
SELECT atValue(temperature, true)
FROM (SELECT tfloat '[20@08:00, 35@09:00, 25@10:00]' #> 30.0 AS temperature) t;

时空操作

轨迹:将空间路径提取为几何体:

SELECT ST_AsText(trajectory(trip))
FROM trips
WHERE vehicle_id = 42;

速度计算:

-- 速度以每秒为单位(地理点为 m/s)
SELECT speed(trip)
FROM trips
WHERE vehicle_id = 42;

轨迹长度:

SELECT length(trip)
FROM trips
WHERE vehicle_id = 42;

时空边界框(stbox):

-- 获取时空边界框
SELECT stbox(trip)
FROM trips;

-- 构造用于查询的 stbox
SELECT stbox(
    ST_MakeEnvelope(2.2, 48.8, 2.4, 48.9, 4326),
    tstzspan '[2025-06-01, 2025-06-02]'
);

空间限制:获取特定区域内的值:

-- 行程中位于某多边形内的部分
SELECT atGeometry(trip, ST_Buffer(ST_Point(2.35, 48.86, 4326), 0.01))
FROM trips;

两个时态点之间的距离:

SELECT distance(t1.trip, t2.trip)
FROM trips t1, trips t2
WHERE t1.vehicle_id = 1 AND t2.vehicle_id = 2;

最近接近距离和时间:

SELECT nearestApproachDistance(t1.trip, t2.trip),
       nearestApproachInstant(t1.trip, t2.trip)
FROM trips t1, trips t2
WHERE t1.vehicle_id = 1 AND t2.vehicle_id = 2;

索引

MobilityDB 支持 GiST 和 SP-GiST 索引,用于高效的时态和时空查询。

SP-GiST 索引用于时态类型(时间维度):

CREATE INDEX ON measurements USING spgist(temperature);

GiST 索引用于时空类型(空间 + 时间):

CREATE INDEX ON trips USING gist(trip);

这些索引可以加速边界框查询、时态重叠检查和时空相交操作:

-- 使用 GiST 索引进行时空过滤
SELECT vehicle_id
FROM trips
WHERE trip && stbox(
    ST_MakeEnvelope(2.2, 48.8, 2.4, 48.9, 4326),
    tstzspan '[2025-06-01, 2025-06-02]'
);

示例:车辆追踪

存储和查询车辆 GPS 轨迹的完整示例:

CREATE TABLE vehicles (
    vehicle_id  INT PRIMARY KEY,
    plate       TEXT,
    type        TEXT
);

CREATE TABLE trips (
    trip_id     BIGSERIAL PRIMARY KEY,
    vehicle_id  INT REFERENCES vehicles(vehicle_id),
    trip        tgeompoint,
    trip_date   DATE
);

CREATE INDEX ON trips USING gist(trip);

-- 将行程插入为一系列 GPS 点
INSERT INTO trips (vehicle_id, trip, trip_date) VALUES (
    1,
    tgeompoint_seq(ARRAY[
        tgeompoint_inst(ST_Point(2.3522, 48.8566, 4326), '2025-06-01 08:00+00'),
        tgeompoint_inst(ST_Point(2.2945, 48.8584, 4326), '2025-06-01 08:15+00'),
        tgeompoint_inst(ST_Point(2.3364, 48.8606, 4326), '2025-06-01 08:30+00'),
        tgeompoint_inst(ST_Point(2.3488, 48.8534, 4326), '2025-06-01 08:45+00')
    ]),
    '2025-06-01'
);

-- 车辆 1 在 08:20 的位置?
SELECT valueAtTimestamp(trip, '2025-06-01 08:20+00')
FROM trips WHERE vehicle_id = 1 AND trip_date = '2025-06-01';

-- 平均速度是多少?
SELECT twAvg(speed(trip))
FROM trips WHERE vehicle_id = 1 AND trip_date = '2025-06-01';

-- 总行驶距离
SELECT length(trip)
FROM trips WHERE vehicle_id = 1 AND trip_date = '2025-06-01';

-- 获取完整轨迹作为 LineString
SELECT ST_AsGeoJSON(trajectory(trip))
FROM trips WHERE vehicle_id = 1 AND trip_date = '2025-06-01';

示例:时空相交查询

查找在指定时间窗口内经过特定区域的所有行程:

-- 定义感兴趣区域:以埃菲尔铁塔为中心的圆形区域
WITH area AS (
    SELECT ST_Buffer(ST_Point(2.2945, 48.8584, 4326)::geography, 500)::geometry AS geom
)
SELECT t.vehicle_id,
       t.trip_date,
       atGeometry(t.trip, a.geom) AS trip_in_area,
       length(atGeometry(t.trip, a.geom)) AS distance_in_area
FROM trips t, area a
WHERE t.trip && stbox(
    a.geom,
    tstzspan '[2025-06-01 07:00+00, 2025-06-01 10:00+00]'
)
  AND eIntersects(t.trip, a.geom)
ORDER BY t.trip_date;

聚合函数

MobilityDB 提供时态聚合函数:

-- 时态浮点数的时间加权平均
SELECT twAvg(temperature) FROM sensor_data WHERE sensor_id = 1;

-- 将多个时态点合并为一个
SELECT tUnion(trip) FROM trips WHERE vehicle_id = 1 AND trip_date = '2025-06-01';

-- 在每个时间戳上计算一组时态点的质心
SELECT tCentroid(trip) FROM trips WHERE trip_date = '2025-06-01';

40 - mobilitydb_datagen

MobilityDB随机数据生成函数

概览

扩展包名版本分类许可证语言
mobilitydb1.3.0GISGPL-3.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1650mobilitydb-
1651mobilitydb_datagen-
相关扩展mobilitydb mobilitydb postgis timescaledb pgrouting

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.3.01817161514mobilitydbmobilitydb
DEBPGDG1.3.01817161514postgresql-$v-mobilitydb-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el8.aarch64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el9.x86_64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el9.aarch64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el10.x86_64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
el10.aarch64PGDG MISSPGDG MISSPGDG MISSPGDG MISSPGDG MISS
d12.x86_64PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0
d12.aarch64PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0
d13.x86_64PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0
d13.aarch64PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0
u22.x86_64PGDG MISSPGDG 1.2.0PGDG 1.2.0PGDG 1.2.0PGDG 1.2.0
u22.aarch64PGDG MISSPGDG 1.2.0PGDG 1.2.0PGDG 1.2.0PGDG 1.2.0
u24.x86_64PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0
u24.aarch64PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0PGDG 1.3.0

安装

您可以直接安装 mobilitydb 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install mobilitydb;          # 当前活跃 PG 版本安装
pig ext install -y mobilitydb -v 18  # PG 18
pig ext install -y mobilitydb -v 17  # PG 17
pig ext install -y mobilitydb -v 16  # PG 16
pig ext install -y mobilitydb -v 15  # PG 15
pig ext install -y mobilitydb -v 14  # PG 14
apt install -y postgresql-18-mobilitydb   # PG 18
apt install -y postgresql-17-mobilitydb   # PG 17
apt install -y postgresql-16-mobilitydb   # PG 16
apt install -y postgresql-15-mobilitydb   # PG 15
apt install -y postgresql-14-mobilitydb   # PG 14

创建扩展

CREATE EXTENSION mobilitydb_datagen CASCADE;  -- 依赖: mobilitydb

用法

mobilitydb_datagen: MobilityDB 的合成移动数据生成器

MobilityDB DataGen 提供用于生成合成移动数据的函数,用于测试和基准测试 MobilityDB 工作负载。它可以创建随机的时态值,包括行程、轨迹和时变测量数据。

生成随机时态值

-- 在时间跨度内生成随机时态浮点数
SELECT random_tfloat(
    '2025-06-01 00:00+00', '2025-06-02 00:00+00',  -- 时间跨度
    0.0, 100.0,                                      -- 值范围
    10                                               -- 瞬时值数量
);

-- 生成随机时态几何点(轨迹)
SELECT random_tgeompoint(
    '2025-06-01 08:00+00', '2025-06-01 18:00+00',   -- 时间跨度
    ST_MakeEnvelope(2.2, 48.8, 2.4, 48.9, 4326),    -- 空间范围
    20                                               -- 瞬时值数量
);

生成测试数据集

批量创建测试数据用于行程查询基准测试:

INSERT INTO trips (vehicle_id, trip, trip_date)
SELECT
    i,
    random_tgeompoint(
        '2025-06-01 08:00+00', '2025-06-01 18:00+00',
        ST_MakeEnvelope(2.2, 48.8, 2.5, 48.9, 4326),
        50
    ),
    '2025-06-01'
FROM generate_series(1, 1000) AS i;

41 - tzf

快速根据GPS经纬度坐标查找时区

概览

扩展包名版本分类许可证语言
pg_tzf0.2.4GISMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
1680tzf-
相关扩展postgis geoip pg_cron postgis_topology postgis_raster postgis_sfcgal postgis_tiger_geocoder address_standardizer

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.2.41817161514pg_tzf-
RPMPIGSTY0.2.41817161514pg_tzf_$v-
DEBPIGSTY0.2.41817161514postgresql-$v-tzf-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
PIGSTY 0.2.4
PIGSTY 0.2.4
PIGSTY 0.2.4
PIGSTY 0.2.4
PIGSTY 0.2.4
u24.x86_64
u24.aarch64
PIGSTY 0.2.4
PIGSTY 0.2.4
PIGSTY 0.2.4
PIGSTY 0.2.4
PIGSTY 0.2.4

构建

您可以使用 pig build 命令构建 pg_tzf 扩展的 RPM / DEB 包:

pig build pkg pg_tzf         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_tzf 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_tzf;          # 当前活跃 PG 版本安装
pig ext install -y pg_tzf -v 18  # PG 18
pig ext install -y pg_tzf -v 17  # PG 17
pig ext install -y pg_tzf -v 16  # PG 16
pig ext install -y pg_tzf -v 15  # PG 15
pig ext install -y pg_tzf -v 14  # PG 14
dnf install -y pg_tzf_18       # PG 18
dnf install -y pg_tzf_17       # PG 17
dnf install -y pg_tzf_16       # PG 16
dnf install -y pg_tzf_15       # PG 15
dnf install -y pg_tzf_14       # PG 14
apt install -y postgresql-18-tzf   # PG 18
apt install -y postgresql-17-tzf   # PG 17
apt install -y postgresql-16-tzf   # PG 16
apt install -y postgresql-15-tzf   # PG 15
apt install -y postgresql-14-tzf   # PG 14

创建扩展

CREATE EXTENSION tzf;

用法

tzf: PostgreSQL 快速时区查找

根据坐标查找时区名称。基于 tzf-rs 构建,使用来自 timezone-boundary-builder 的时区边界数据。

CREATE EXTENSION tzf;

函数

根据坐标(经度、纬度)查找时区:

SELECT tzf_tzname(116.3883, 39.9289) AS timezone;
-- Asia/Shanghai

批量查找坐标的时区:

SELECT unnest(
  tzf_tzname_batch(
    ARRAY[-74.0060, -118.2437, 139.6917],
    ARRAY[40.7128, 34.0522, 35.6895]
  )
) AS timezones;
-- America/New_York
-- America/Los_Angeles
-- Asia/Tokyo

根据点查找时区:

SELECT tzf_tzname_point(point(-74.0060, 40.7128)) AS timezone;
-- America/New_York

批量查找点的时区:

SELECT unnest(
  tzf_tzname_batch_points(
    ARRAY[
      point(-74.0060, 40.7128),
      point(-118.2437, 34.0522),
      point(139.6917, 35.6895)
    ]
  )
) AS timezones;
-- America/New_York
-- America/Los_Angeles
-- Asia/Tokyo

性能

函数TPS备注
tzf_tzname~17,700单坐标查找
tzf_tzname_point~17,600单点查找
tzf_tzname_batch~511000 个一批 ≈ ~51,000 TPS
tzf_tzname_batch_points~321000 个一批 ≈ ~32,000 TPS

42 - earthdistance

计算地球表面上的大圆距离

概览

扩展包名版本分类许可证语言
earthdistance1.2GISPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
1690earthdistance-
相关扩展cube postgis q3c pg_sphere postgis_topology postgis_raster postgis_sfcgal postgis_tiger_geocoder address_standardizer

版本

PG18PG17PG16PG15PG14
1.21.21.21.21.2

安装

提示:这是 PostgreSQL 内核自带的 contrib 扩展

CREATE EXTENSION earthdistance;

用法

earthdistance: 地球表面大圆距离计算

earthdistance 模块提供两种计算地球表面大圆距离的方法。假设地球为完美球体(需要更高精度请使用 PostGIS)。

CREATE EXTENSION earthdistance CASCADE; -- 需要 cube

基于 Cube 的地球距离

数据以 cube 存储,使用 3 个坐标表示距地球中心的 x、y、z 距离。提供了基于 cube 类型的 earth 域。

函数

函数说明
earth()float8返回假定的地球半径
sec_to_gc(float8)float8将直线(割线)距离转换为大圆距离
gc_to_sec(float8)float8将大圆距离转换为直线(割线)距离
ll_to_earth(float8, float8)earth根据经纬度(度)返回位置
latitude(earth)float8返回纬度(度)
longitude(earth)float8返回经度(度)
earth_distance(earth, earth)float8返回两点之间的大圆距离
earth_box(earth, float8)cube返回用于 cube @> 运算符索引搜索的框

示例

-- 纽约到伦敦的距离(米)
SELECT earth_distance(
  ll_to_earth(40.7128, -74.0060),
  ll_to_earth(51.5074, -0.1278)
);

-- 查找某位置 1000 米范围内的所有点(可使用索引)
SELECT *
FROM places
WHERE earth_box(ll_to_earth(40.7128, -74.0060), 1000) @> ll_to_earth(lat, lon);

基于 Point 的地球距离

将地球位置表示为 point 类型值,其中第一个分量是经度,第二个是纬度(度)。

运算符

运算符说明
point <@> pointfloat8两点之间的法定英里距离

示例

-- 法定英里距离
SELECT point(-74.0060, 40.7128) <@> point(-0.1278, 51.5074);

注意:单位固定为法定英里。基于 point 的方法在极点和 ±180° 经线附近有边界条件问题;基于 cube 的表示方式避免了这些不连续性。

43 - vector

向量数据类型和 ivfflat / hnsw 访问方法

概览

扩展包名版本分类许可证语言
pgvector0.8.2RAGPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
1800vector-
相关扩展pg_bestmatch pg_summarize pg_tiktoken pg4ml pgml pg_similarity smlar pg_search
下游依赖documentdb vchord vectorize vectorscale

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG0.8.21817161514pgvector-
RPMPGDG0.8.21817161514pgvector_$v-
DEBPGDG0.8.21817161514postgresql-$v-pgvector-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

构建

您可以使用 pig build 命令构建 pgvector 扩展的 RPM 包:

pig build pkg pgvector         # 构建 RPM 包

安装

您可以直接安装 pgvector 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgvector;          # 当前活跃 PG 版本安装
pig ext install -y pgvector -v 18  # PG 18
pig ext install -y pgvector -v 17  # PG 17
pig ext install -y pgvector -v 16  # PG 16
pig ext install -y pgvector -v 15  # PG 15
pig ext install -y pgvector -v 14  # PG 14
dnf install -y pgvector_18       # PG 18
dnf install -y pgvector_17       # PG 17
dnf install -y pgvector_16       # PG 16
dnf install -y pgvector_15       # PG 15
dnf install -y pgvector_14       # PG 14
apt install -y postgresql-18-pgvector   # PG 18
apt install -y postgresql-17-pgvector   # PG 17
apt install -y postgresql-16-pgvector   # PG 16
apt install -y postgresql-15-pgvector   # PG 15
apt install -y postgresql-14-pgvector   # PG 14

创建扩展

CREATE EXTENSION vector;

用法

适用于 PostgreSQL 的开源向量相似性搜索扩展。将向量与其他数据存储在一起,支持:

  • 精确与近似最近邻搜索
  • 单精度、半精度、二进制和稀疏向量
  • L2 距离、内积、余弦距离、L1 距离、汉明距离和 Jaccard 距离
  • 任何具有 PostgreSQL 客户端的编程语言

此外还具备 ACID 合规性、时间点恢复(PITR)、JOIN 以及 PostgreSQL 的所有其他优秀特性

快速上手

启用扩展(在每个需要使用该扩展的数据库中执行一次)

CREATE EXTENSION vector;

创建一个 3 维向量列

CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));

插入向量

INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');

按 L2 距离获取最近邻

SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;

还支持内积(<#>)、余弦距离(<=>)和 L1 距离(<+>

注意:<#> 返回的是负内积,因为 PostgreSQL 的索引扫描仅支持 ASC 排序的操作符


存储

创建一个带有向量列的新表

CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));

或者向已有表添加向量列

ALTER TABLE items ADD COLUMN embedding vector(3);

还支持半精度二进制稀疏向量

插入向量

INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');

或使用 COPY 批量导入向量(示例

COPY items (embedding) FROM STDIN WITH (FORMAT BINARY);

更新插入(Upsert)向量

INSERT INTO items (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]')
    ON CONFLICT (id) DO UPDATE SET embedding = EXCLUDED.embedding;

更新向量

UPDATE items SET embedding = '[1,2,3]' WHERE id = 1;

删除向量

DELETE FROM items WHERE id = 1;

查询

获取某个向量的最近邻

SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;

支持的距离函数:

  • <-> - L2 距离
  • <#> - (负)内积
  • <=> - 余弦距离
  • <+> - L1 距离
  • <~> - 汉明距离(二进制向量)
  • <%> - Jaccard 距离(二进制向量)

获取某行的最近邻

SELECT * FROM items WHERE id != 1 ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;

获取指定距离范围内的行

SELECT * FROM items WHERE embedding <-> '[3,1,2]' < 5;

注意:配合 ORDER BYLIMIT 使用才能利用索引

距离计算

获取距离值

SELECT embedding <-> '[3,1,2]' AS distance FROM items;

对于内积,需要乘以 -1(因为 <#> 返回的是负内积)

SELECT (embedding <#> '[3,1,2]') * -1 AS inner_product FROM items;

对于余弦相似度,使用 1 减去余弦距离

SELECT 1 - (embedding <=> '[3,1,2]') AS cosine_similarity FROM items;

聚合

计算向量平均值

SELECT AVG(embedding) FROM items;

按分组计算向量平均值

SELECT category_id, AVG(embedding) FROM items GROUP BY category_id;

索引

默认情况下,pgvector 执行精确最近邻搜索,提供完美的召回率。

可以添加索引来使用近似最近邻搜索,以牺牲部分召回率换取速度提升。与普通索引不同,添加近似索引后查询结果可能会有所变化。

支持的索引类型:

HNSW

HNSW 索引会创建一个多层图结构。相比 IVFFlat,它具有更好的查询性能(在速度与召回率的权衡上),但构建时间更长且占用更多内存。此外,由于没有像 IVFFlat 那样的训练步骤,HNSW 索引可以在表中没有数据时就创建。

为所需的每种距离函数添加索引。

L2 距离

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);

注意:halfvec 类型使用 halfvec_l2_opssparsevec 类型使用 sparsevec_l2_ops(其他距离函数同理)

内积

CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);

余弦距离

CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);

L1 距离

CREATE INDEX ON items USING hnsw (embedding vector_l1_ops);

汉明距离

CREATE INDEX ON items USING hnsw (embedding bit_hamming_ops);

Jaccard 距离

CREATE INDEX ON items USING hnsw (embedding bit_jaccard_ops);

支持的类型:

  • vector - 最多 2,000 维
  • halfvec - 最多 4,000 维
  • bit - 最多 64,000 维
  • sparsevec - 最多 1,000 个非零元素

索引选项

指定 HNSW 参数

  • m - 每层的最大连接数(默认 16)
  • ef_construction - 构建图时动态候选列表的大小(默认 64)
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);

ef_construction 值越大,召回率越高,但索引构建时间和插入耗时也会相应增加。

查询选项

指定搜索时动态候选列表的大小(默认 40)

SET hnsw.ef_search = 100;

该值越大,召回率越高,但查询速度会相应下降。

在事务中使用 SET LOCAL 可以仅对单次查询生效

BEGIN;
SET LOCAL hnsw.ef_search = 100;
SELECT ...
COMMIT;

索引构建时间

当图结构能完全放入 maintenance_work_mem 时,索引构建速度会显著提升

SET maintenance_work_mem = '8GB';

当图结构无法再放入内存时,会显示如下提示

NOTICE:  hnsw graph no longer fits into maintenance_work_mem after 100000 tuples
DETAIL:  Building will take significantly more time.
HINT:  Increase maintenance_work_mem to speed up builds.

注意:不要将 maintenance_work_mem 设置得过高以至于耗尽服务器内存

与其他索引类型一样,在加载完初始数据之后再创建索引会更快

还可以通过增加并行工作进程数来加速索引创建(默认 2 个)

SET max_parallel_maintenance_workers = 7; -- 加上 leader 进程

如果工作进程数较多,可能需要同时增大 max_parallel_workers(默认 8)

索引选项对构建时间也有显著影响(除非召回率偏低,否则使用默认值即可)

索引构建进度

查看索引构建进度

SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;

HNSW 的构建阶段:

  1. initializing
  2. loading tuples

IVFFlat

IVFFlat 索引将向量划分到多个列表中,然后搜索与查询向量最接近的那些列表的子集。相比 HNSW,它构建速度更快且占用内存更少,但查询性能较低(在速度与召回率的权衡上)。

实现良好召回率的三个关键:

  1. 在表中已有一定数据之后再创建索引
  2. 选择合适的列表数量——对于不超过 100 万行的数据,可从 rows / 1000 开始;超过 100 万行的数据则使用 sqrt(rows)
  3. 查询时指定合适的探针数(值越高召回率越好,值越低速度越快)——可从 sqrt(lists) 开始

为所需的每种距离函数添加索引。

L2 距离

CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);

注意:halfvec 类型使用 halfvec_l2_ops(其他距离函数同理)

内积

CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops) WITH (lists = 100);

余弦距离

CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

汉明距离

CREATE INDEX ON items USING ivfflat (embedding bit_hamming_ops) WITH (lists = 100);

支持的类型:

  • vector - 最多 2,000 维
  • halfvec - 最多 4,000 维
  • bit - 最多 64,000 维

查询选项

指定探针数(默认 1)

SET ivfflat.probes = 10;

该值越大,召回率越高,但速度会相应下降。可以将其设置为列表总数以实现精确最近邻搜索(此时查询规划器将不会使用索引)

在事务中使用 SET LOCAL 可以仅对单次查询生效

BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT ...
COMMIT;

索引构建时间

对于大表,可以通过增加并行工作进程数来加速索引创建(默认 2 个)

SET max_parallel_maintenance_workers = 7; -- 加上 leader 进程

如果工作进程数较多,可能还需要同时增大 max_parallel_workers(默认 8)

索引构建进度

查看索引构建进度

SELECT phase, round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;

IVFFlat 的构建阶段:

  1. initializing
  2. performing k-means
  3. assigning tuples
  4. loading tuples

注意:% 仅在 loading tuples 阶段显示

过滤

有多种方式可以对带有 WHERE 子句的最近邻查询建立索引。

SELECT * FROM items WHERE category_id = 123 ORDER BY embedding <-> '[3,1,2]' LIMIT 5;

首先可以在过滤列上创建索引。在很多场景下,这可以提供快速的精确最近邻搜索。PostgreSQL 为此提供了多种索引类型:B-tree(默认)、hash、GiST、SP-GiST、GIN 和 BRIN。

CREATE INDEX ON items (category_id);

对于多列过滤,可以考虑使用多列索引

CREATE INDEX ON items (location_id, category_id);

精确索引适用于匹配行数占比较低的条件。否则,近似索引可能效果更好。

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);

使用近似索引时,过滤是在索引扫描之后应用的。如果某个条件匹配 10% 的行,在 HNSW 默认 hnsw.ef_search 为 40 的情况下,平均只有 4 行会匹配。要获取更多行,请增大 hnsw.ef_search

SET hnsw.ef_search = 200;

从 0.8.0 版本开始,可以启用迭代索引扫描,在需要时自动扫描索引的更多部分。

SET hnsw.iterative_scan = strict_order;

如果只按少数几个不同的值过滤,可以考虑使用部分索引

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WHERE (category_id = 123);

如果按大量不同的值过滤,可以考虑使用分区表

CREATE TABLE items (embedding vector(3), category_id int) PARTITION BY LIST(category_id);

迭代索引扫描

使用近似索引时,带有过滤条件的查询可能返回较少的结果,因为过滤是在索引扫描之后应用的。从 0.8.0 版本开始,可以启用迭代索引扫描,它会自动扫描索引的更多部分,直到找到足够的结果(或达到 hnsw.max_scan_tuplesivfflat.max_probes 的限制)。

迭代扫描可以使用严格排序或宽松排序。

严格排序确保结果按距离精确排序

SET hnsw.iterative_scan = strict_order;

宽松排序允许结果在距离排序上略有偏差,但能提供更好的召回率

SET hnsw.iterative_scan = relaxed_order;
# or
SET ivfflat.iterative_scan = relaxed_order;

使用宽松排序时,可以通过物化 CTE 来获得严格排序

WITH relaxed_results AS MATERIALIZED (
    SELECT id, embedding <-> '[1,2,3]' AS distance FROM items WHERE category_id = 123 ORDER BY distance LIMIT 5
) SELECT * FROM relaxed_results ORDER BY distance + 0;

注意:PostgreSQL 17+ 需要 + 0

对于按距离过滤的查询,请使用物化 CTE 并将距离过滤条件放在 CTE 外部以获得最佳性能(这是由于 PostgreSQL 执行器的当前行为所致)

WITH nearest_results AS MATERIALIZED (
    SELECT id, embedding <-> '[1,2,3]' AS distance FROM items ORDER BY distance LIMIT 5
) SELECT * FROM nearest_results WHERE distance < 5 ORDER BY distance;

注意:其他过滤条件请放在 CTE 内部

迭代扫描选项

由于扫描近似索引的大部分内容开销很大,因此提供了控制扫描何时终止的选项。

HNSW

指定最大访问元组数(默认 20,000)

SET hnsw.max_scan_tuples = 20000;

注意:该值为近似值,不影响初始扫描

指定最大可用内存量,以 work_mem 的倍数表示(默认 1)

SET hnsw.scan_mem_multiplier = 2;

注意:如果增大 hnsw.max_scan_tuples 未能改善召回率,可尝试增大此值

IVFFlat

指定最大探针数

SET ivfflat.max_probes = 100;

注意:如果该值低于 ivfflat.probes,则使用 ivfflat.probes 的值


向量类型

半精度向量

使用 halfvec 类型存储半精度向量

CREATE TABLE items (id bigserial PRIMARY KEY, embedding halfvec(3));

半精度索引

以半精度对向量建立索引,可以获得更小的索引体积

CREATE INDEX ON items USING hnsw ((embedding::halfvec(3)) halfvec_l2_ops);

获取最近邻

SELECT * FROM items ORDER BY embedding::halfvec(3) <-> '[1,2,3]' LIMIT 5;

二进制向量

使用 bit 类型存储二进制向量(示例

CREATE TABLE items (id bigserial PRIMARY KEY, embedding bit(3));
INSERT INTO items (embedding) VALUES ('000'), ('111');

按汉明距离获取最近邻

SELECT * FROM items ORDER BY embedding <~> '101' LIMIT 5;

还支持 Jaccard 距离(<%>

二进制量化

使用表达式索引进行二进制量化

CREATE INDEX ON items USING hnsw ((binary_quantize(embedding)::bit(3)) bit_hamming_ops);

按汉明距离获取最近邻

SELECT * FROM items ORDER BY binary_quantize(embedding)::bit(3) <~> binary_quantize('[1,-2,3]') LIMIT 5;

使用原始向量重新排序以提高召回率

SELECT * FROM (
    SELECT * FROM items ORDER BY binary_quantize(embedding)::bit(3) <~> binary_quantize('[1,-2,3]') LIMIT 20
) ORDER BY embedding <=> '[1,-2,3]' LIMIT 5;

稀疏向量

使用 sparsevec 类型存储稀疏向量

CREATE TABLE items (id bigserial PRIMARY KEY, embedding sparsevec(5));

插入向量

INSERT INTO items (embedding) VALUES ('{1:1,3:2,5:3}/5'), ('{1:4,3:5,5:6}/5');

格式为 {索引1:值1,索引2:值2}/维度数,索引从 1 开始,与 SQL 数组一致

按 L2 距离获取最近邻

SELECT * FROM items ORDER BY embedding <-> '{1:3,3:1,5:2}/5' LIMIT 5;

混合搜索

结合 PostgreSQL 的全文搜索实现混合搜索。

SELECT id, content FROM items, plainto_tsquery('hello search') query
    WHERE textsearch @@ query ORDER BY ts_rank_cd(textsearch, query) DESC LIMIT 5;

可以使用倒数排名融合(RRF)交叉编码器来合并结果。

子向量索引

使用表达式索引对子向量建立索引

CREATE INDEX ON items USING hnsw ((subvector(embedding, 1, 3)::vector(3)) vector_cosine_ops);

按余弦距离获取最近邻

SELECT * FROM items ORDER BY subvector(embedding, 1, 3)::vector(3) <=> subvector('[1,2,3,4,5]'::vector, 1, 3) LIMIT 5;

使用完整向量重新排序以提高召回率

SELECT * FROM (
    SELECT * FROM items ORDER BY subvector(embedding, 1, 3)::vector(3) <=> subvector('[1,2,3,4,5]'::vector, 1, 3) LIMIT 20
) ORDER BY embedding <=> '[1,2,3,4,5]' LIMIT 5;

性能

调优

使用 PgTune 等工具来设置 PostgreSQL 服务器参数的初始值。例如,shared_buffers 通常应设置为服务器内存的 25%。可以通过以下命令查找配置文件路径:

SHOW config_file;

查看各项参数设置:

SHOW shared_buffers;

修改后需要重启 PostgreSQL 才能生效。

数据加载

使用 COPY 批量加载数据(示例)。

COPY items (embedding) FROM STDIN WITH (FORMAT BINARY);

为获得最佳性能,建议在加载完初始数据之后再创建索引。

索引

关于索引构建时间,参见 HNSWIVFFlat

在生产环境中,请使用并发方式创建索引以避免阻塞写操作。

CREATE INDEX CONCURRENTLY ...

查询

使用 EXPLAIN (ANALYZE, BUFFERS) 调试查询性能。

EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;

精确搜索

对于没有索引的查询,可以增大 max_parallel_workers_per_gather 来加速。

SET max_parallel_workers_per_gather = 4;

如果向量已归一化为单位长度(如 OpenAI embeddings),使用内积可获得最佳性能。

SELECT * FROM items ORDER BY embedding <#> '[3,1,2]' LIMIT 5;

近似搜索

对于使用 IVFFlat 索引的查询,可以增加倒排列表数量来加速(会牺牲部分召回率)。

CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 1000);

清理(VACUUM)

HNSW 索引的 VACUUM 操作可能耗时较长。可以先重建索引来加速。

REINDEX INDEX CONCURRENTLY index_name;
VACUUM table_name;

监控

使用 pg_stat_statements 监控性能(需确保已将其添加到 shared_preload_libraries)。

CREATE EXTENSION pg_stat_statements;

查询最耗时的 SQL:

SELECT query, calls, ROUND((total_plan_time + total_exec_time) / calls) AS avg_time_ms,
    ROUND((total_plan_time + total_exec_time) / 60000) AS total_time_min
    FROM pg_stat_statements ORDER BY total_plan_time + total_exec_time DESC LIMIT 20;

通过对比近似搜索与精确搜索的结果来监控召回率。

BEGIN;
SET LOCAL enable_indexscan = off; -- 使用精确搜索
SELECT ...
COMMIT;

扩展

pgvector 的扩展方式与 PostgreSQL 相同。

纵向扩展:增加单个实例的内存、CPU 和存储容量。使用现有工具进行参数调优性能监控

横向扩展:使用只读副本,或使用 Citus 等方案进行分片(示例)。


语言支持

可以从任何具有 PostgreSQL 客户端的编程语言中使用 pgvector。甚至可以在一种语言中生成和存储向量,在另一种语言中进行查询。

语言库 / 示例
Adapgvector-ada
Algolpgvector-algol
Cpgvector-c
C++pgvector-cpp
C#, F#, Visual Basicpgvector-dotnet
COBOLpgvector-cobol
Crystalpgvector-crystal
Dpgvector-d
Dartpgvector-dart
Elixirpgvector-elixir
Erlangpgvector-erlang
Fortranpgvector-fortran
Gleampgvector-gleam
Gopgvector-go
Haskellpgvector-haskell
Java, Kotlin, Groovy, Scalapgvector-java
JavaScript, TypeScriptpgvector-node
JuliaPgvector.jl
Lisppgvector-lisp
Luapgvector-lua
Nimpgvector-nim
OCamlpgvector-ocaml
Pascalpgvector-pascal
Perlpgvector-perl
PHPpgvector-php
Prologpgvector-prolog
Pythonpgvector-python
Rpgvector-r
Racketpgvector-racket
Rakupgvector-raku
Rubypgvector-ruby, Neighbor
Rustpgvector-rust
Swiftpgvector-swift
Tclpgvector-tcl
Zigpgvector-zig

常见问题

单张表最多能存储多少向量?

PostgreSQL 中非分区表默认上限为 32 TB。分区表可以有数千个该大小的分区。

是否支持复制?

是的,pgvector 使用预写式日志(WAL),支持流复制和时间点恢复(PITR)。

如果我想对超过 2,000 维的向量建立索引怎么办?

可以使用半精度向量半精度索引来索引最多 4,000 维的向量,或使用二进制量化来索引最多 64,000 维的向量。其他方案包括子向量索引(需要模型支持)或降维

能否在同一列中存储不同维度的向量?

可以使用 vector 作为类型(而非 vector(n))。

CREATE TABLE embeddings (model_id bigint, item_id bigint, embedding vector, PRIMARY KEY (model_id, item_id));

但只能对维度相同的行创建索引(使用表达式索引部分索引):

CREATE INDEX ON embeddings USING hnsw ((embedding::vector(3)) vector_l2_ops) WHERE (model_id = 123);

查询方式:

SELECT * FROM embeddings WHERE model_id = 123 ORDER BY embedding::vector(3) <-> '[3,1,2]' LIMIT 5;

能否以更高精度存储向量?

可以使用 double precision[]numeric[] 类型来存储更高精度的向量。

CREATE TABLE items (id bigserial PRIMARY KEY, embedding double precision[]);

-- PostgreSQL 数组使用 {} 而非 []
INSERT INTO items (embedding) VALUES ('{1,2,3}'), ('{4,5,6}');

可以选择添加检查约束,确保数据可以转换为 vector 类型并具有预期的维度。

ALTER TABLE items ADD CHECK (vector_dims(embedding::vector) = 3);

使用表达式索引建立索引(以较低精度):

CREATE INDEX ON items USING hnsw ((embedding::vector(3)) vector_l2_ops);

查询方式:

SELECT * FROM items ORDER BY embedding::vector(3) <-> '[3,1,2]' LIMIT 5;

索引是否需要完全放入内存?

不需要,但与其他索引类型一样,索引能放入内存时性能通常更好。可以通过以下命令查看索引大小:

SELECT pg_size_pretty(pg_relation_size('index_name'));

故障排查

为什么查询没有使用索引?

查询需要同时包含 ORDER BYLIMIT,且 ORDER BY 必须直接使用距离操作符的结果(不能是表达式),并且必须为升序排列。

-- 使用索引
ORDER BY embedding <=> '[3,1,2]' LIMIT 5;

-- 不使用索引
ORDER BY 1 - (embedding <=> '[3,1,2]') DESC LIMIT 5;

可以通过以下方式引导查询规划器使用索引:

BEGIN;
SET LOCAL enable_seqscan = off;
SELECT ...
COMMIT;

另外,如果表很小,全表扫描可能反而更快。

为什么查询没有使用并行表扫描?

查询规划器在成本估算中不考虑行外存储(TOAST),这可能导致串行扫描看起来成本更低。可以通过以下方式降低并行扫描的成本估算:

BEGIN;
SET LOCAL min_parallel_table_scan_size = 1;
SET LOCAL parallel_setup_cost = 1;
SELECT ...
COMMIT;

或者选择以内联方式存储向量:

ALTER TABLE items ALTER COLUMN embedding SET STORAGE PLAIN;

为什么添加 HNSW 索引后查询结果变少了?

结果数量受动态候选列表大小(hnsw.ef_search)的限制,默认值为 40。由于死元组或查询中的过滤条件,结果可能会更少。启用迭代索引扫描有助于解决此问题。

另外请注意,NULL 向量不会被索引(余弦距离的零向量也不会被索引)。

为什么添加 IVFFlat 索引后查询结果变少了?

很可能是在数据量相对于列表数量不足时就创建了索引。请先删除索引,等表中有更多数据后再重新创建。

DROP INDEX index_name;

结果数量也可能受探针数(ivfflat.probes)的限制。启用迭代索引扫描可以解决此问题。

另外请注意,NULL 向量不会被索引(余弦距离的零向量也不会被索引)。


参考

Vector 类型

每个向量占用 4 * 维度数 + 8 字节的存储空间。每个元素为单精度浮点数(类似于 PostgreSQL 中的 real 类型),所有元素必须为有限值(不允许 NaNInfinity-Infinity)。向量最多支持 16,000 维。

Vector 操作符

操作符描述引入版本
+逐元素加法
-逐元素减法
*逐元素乘法0.5.0
||拼接0.7.0
<->欧氏距离
<#>负内积
<=>余弦距离
<+>曼哈顿距离0.7.0

Vector 函数

函数描述引入版本
binary_quantize(vector) → bit二进制量化0.7.0
cosine_distance(vector, vector) → double precision余弦距离
inner_product(vector, vector) → double precision内积
l1_distance(vector, vector) → double precision曼哈顿距离0.5.0
l2_distance(vector, vector) → double precision欧氏距离
l2_normalize(vector) → vector欧氏范数归一化0.7.0
subvector(vector, integer, integer) → vector子向量0.7.0
vector_dims(vector) → integer维度数
vector_norm(vector) → double precision欧氏范数

Vector 聚合函数

函数描述引入版本
avg(vector) → vector平均值
sum(vector) → vector求和0.5.0

Halfvec 类型

每个半精度向量占用 2 * 维度数 + 8 字节的存储空间。每个元素为半精度浮点数,所有元素必须为有限值(不允许 NaNInfinity-Infinity)。半精度向量最多支持 16,000 维。

Halfvec 操作符

操作符描述引入版本
+逐元素加法0.7.0
-逐元素减法0.7.0
*逐元素乘法0.7.0
||拼接0.7.0
<->欧氏距离0.7.0
<#>负内积0.7.0
<=>余弦距离0.7.0
<+>曼哈顿距离0.7.0

Halfvec 函数

函数描述引入版本
binary_quantize(halfvec) → bit二进制量化0.7.0
cosine_distance(halfvec, halfvec) → double precision余弦距离0.7.0
inner_product(halfvec, halfvec) → double precision内积0.7.0
l1_distance(halfvec, halfvec) → double precision曼哈顿距离0.7.0
l2_distance(halfvec, halfvec) → double precision欧氏距离0.7.0
l2_norm(halfvec) → double precision欧氏范数0.7.0
l2_normalize(halfvec) → halfvec欧氏范数归一化0.7.0
subvector(halfvec, integer, integer) → halfvec子向量0.7.0
vector_dims(halfvec) → integer维度数0.7.0

Halfvec 聚合函数

函数描述引入版本
avg(halfvec) → halfvec平均值0.7.0
sum(halfvec) → halfvec求和0.7.0

Bit 类型

每个位向量占用 维度数 / 8 + 8 字节的存储空间。更多信息参见 PostgreSQL 文档

Bit 操作符

操作符描述引入版本
<~>汉明距离0.7.0
<%>Jaccard 距离0.7.0

Bit 函数

函数描述引入版本
hamming_distance(bit, bit) → double precision汉明距离0.7.0
jaccard_distance(bit, bit) → double precisionJaccard 距离0.7.0

Sparsevec 类型

每个稀疏向量占用 8 * 非零元素数 + 16 字节的存储空间。每个元素为单精度浮点数,所有元素必须为有限值(不允许 NaNInfinity-Infinity)。稀疏向量最多支持 16,000 个非零元素。

Sparsevec 操作符

操作符描述引入版本
<->欧氏距离0.7.0
<#>负内积0.7.0
<=>余弦距离0.7.0
<+>曼哈顿距离0.7.0

Sparsevec 函数

函数描述引入版本
cosine_distance(sparsevec, sparsevec) → double precision余弦距离0.7.0
inner_product(sparsevec, sparsevec) → double precision内积0.7.0
l1_distance(sparsevec, sparsevec) → double precision曼哈顿距离0.7.0
l2_distance(sparsevec, sparsevec) → double precision欧氏距离0.7.0
l2_norm(sparsevec) → double precision欧氏范数0.7.0
l2_normalize(sparsevec) → sparsevec欧氏范数归一化0.7.0

安装

Linux 与 Mac

编译安装扩展(支持 PostgreSQL 13+)

cd /tmp
git clone --branch v0.8.2 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install # 可能需要 sudo

如果遇到问题,请参阅安装说明

也可以通过 DockerHomebrewPGXNAPTYumpkgAPKconda-forge 安装,Postgres.app 和许多托管服务商已预装此扩展。此外还有 GitHub Actions 的使用说明。

Windows

确保已安装 Visual Studio 中的 C++ 支持,并以管理员身份运行 x64 Native Tools Command Prompt for VS [版本]。然后使用 nmake 编译:

set "PGROOT=C:\Program Files\PostgreSQL\18"
cd %TEMP%
git clone --branch v0.8.2 https://github.com/pgvector/pgvector.git
cd pgvector
nmake /F Makefile.win
nmake /F Makefile.win install

如果遇到问题,请参阅安装说明

也可以通过 Dockerconda-forge 安装。

安装说明 - Linux 与 Mac

PostgreSQL 路径

如果机器上有多个 PostgreSQL 安装,请通过以下方式指定 pg_config 的路径:

export PG_CONFIG=/Library/PostgreSQL/18/bin/pg_config

然后重新执行安装步骤(如需要,在 make 前先执行 make clean)。如果 make install 需要 sudo,请使用:

sudo --preserve-env=PG_CONFIG make install

Mac 上常见的路径包括:

  • EDB 安装器 - /Library/PostgreSQL/18/bin/pg_config
  • Homebrew (arm64) - /opt/homebrew/opt/postgresql@18/bin/pg_config
  • Homebrew (x86-64) - /usr/local/opt/postgresql@18/bin/pg_config

注意:请将 18 替换为实际的 PostgreSQL 服务器版本

缺少头文件

如果编译报错 fatal error: postgres.h: No such file or directory,请确保服务器上已安装 PostgreSQL 开发文件。

对于 Ubuntu 和 Debian,使用:

sudo apt install postgresql-server-dev-18

注意:请将 18 替换为实际的 PostgreSQL 服务器版本

缺少 SDK

如果在 Mac 上编译失败且输出包含 warning: no such sysroot directory,说明 PostgreSQL 安装指向了一个已不存在的路径。

pg_config --cppflags

重新安装 PostgreSQL 即可修复此问题。

可移植性

默认情况下,pgvector 在某些平台上会使用 -march=native 编译以获得最佳性能。但如果要在其他机器上运行编译好的扩展,这可能导致 Illegal instruction 错误。

要以可移植方式编译,请使用:

make OPTFLAGS=""

安装说明 - Windows

缺少头文件

如果编译报错 Cannot open include file: 'postgres.h': No such file or directory,请确保 PGROOT 设置正确。

架构不匹配

如果编译报错 error C2196: case value '4' already used,请确保使用的是 x64 Native Tools Command Prompt。然后执行 nmake /F Makefile.win clean 并重新执行安装步骤。

缺少符号

如果在 PostgreSQL 17.0-17.2 版本上链接失败并提示 unresolved external symbol float_to_shortest_decimal_bufn,请升级到 PostgreSQL 17.3+。

权限问题

如果安装失败并提示 Access is denied,请以管理员身份重新执行安装步骤。

其他安装方式

Docker

获取 Docker 镜像

docker pull pgvector/pgvector:pg18-trixie

该镜像在 PostgreSQL 镜像的基础上添加了 pgvector(请将 18 替换为实际的 PostgreSQL 服务器版本,使用方式相同)。

也可以手动构建镜像:

git clone --branch v0.8.2 https://github.com/pgvector/pgvector.git
cd pgvector
docker build --pull --build-arg PG_MAJOR=18 -t myuser/pgvector .

如果增大了 maintenance_work_mem,请确保 --shm-size 至少为该值,以避免并行 HNSW 索引构建时出错。

docker run --shm-size=1g ...

Homebrew

对于 Homebrew 安装的 PostgreSQL,可以使用:

brew install pgvector

注意:仅适用于 postgresql@18postgresql@17

PGXN

PostgreSQL 扩展网络安装:

pgxn install vector

APT

Debian 和 Ubuntu 软件包可从 PostgreSQL APT 仓库获取。按照配置说明操作后执行:

sudo apt install postgresql-18-pgvector

注意:请将 18 替换为实际的 PostgreSQL 服务器版本

Yum

RPM 软件包可从 PostgreSQL Yum 仓库获取。按照对应发行版的配置说明操作后执行:

sudo yum install pgvector_18
# 或
sudo dnf install pgvector_18

注意:请将 18 替换为实际的 PostgreSQL 服务器版本

pkg

安装 FreeBSD 软件包:

pkg install postgresql17-pgvector

或通过 port 安装:

cd /usr/ports/databases/pgvector
make install

APK

安装 Alpine 软件包:

apk add postgresql-pgvector

conda-forge

对于 Conda 安装的 PostgreSQL,从 conda-forge 安装:

conda install -c conda-forge pgvector

该方式由 @mmcauliffe 社区维护

Postgres.app

下载 Postgres 15+ 的最新版本

托管 PostgreSQL

pgvector 可在这些服务商上使用。

升级

安装最新版本(使用与初始安装相同的方式)。然后在每个需要升级的数据库中执行:

ALTER EXTENSION vector UPDATE;

可以通过以下命令查看当前数据库中的版本:

SELECT extversion FROM pg_extension WHERE extname = 'vector';

44 - vchord

使用Rust重写的高性能向量扩展

概览

扩展包名版本分类许可证语言
vchord1.1.1RAGAGPL-3.0Rust
ID扩展名BinLibLoadCreateTrustReloc模式
1810vchord-
相关扩展vector vectorscale vectorize vchord_bm25 pg_tiktoken pgml pg_bestmatch pg_similarity smlar

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.1.11817161514vchordvector
RPMPIGSTY1.1.11817161514vchord_$vpgvector_$v
DEBPIGSTY1.1.11817161514postgresql-$v-vchordpostgresql-$v-pgvector
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u22.x86_64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u22.aarch64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u24.x86_64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u24.aarch64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1

构建

您可以使用 pig build 命令构建 vchord 扩展的 RPM / DEB 包:

pig build pkg vchord         # 构建 RPM / DEB 包

安装

您可以直接安装 vchord 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install vchord;          # 当前活跃 PG 版本安装
pig ext install -y vchord -v 18  # PG 18
pig ext install -y vchord -v 17  # PG 17
pig ext install -y vchord -v 16  # PG 16
pig ext install -y vchord -v 15  # PG 15
pig ext install -y vchord -v 14  # PG 14
dnf install -y vchord_18       # PG 18
dnf install -y vchord_17       # PG 17
dnf install -y vchord_16       # PG 16
dnf install -y vchord_15       # PG 15
dnf install -y vchord_14       # PG 14
apt install -y postgresql-18-vchord   # PG 18
apt install -y postgresql-17-vchord   # PG 17
apt install -y postgresql-16-vchord   # PG 16
apt install -y postgresql-15-vchord   # PG 15
apt install -y postgresql-14-vchord   # PG 14

预加载配置

shared_preload_libraries = 'vchord';

创建扩展

CREATE EXTENSION vchord CASCADE;  -- 依赖: vector

用法

将此扩展添加到 postgresql.conf 中的 shared_preload_libraries 配置项

CREATE EXTENSION vchord CASCADE;

在 embedding 列上创建索引:

CREATE INDEX ON gist_train USING vchordrq (embedding vector_l2_ops) WITH (options = $$
residual_quantization = true
[build.internal]
lists = [4096]
spherical_centroids = false
build_threads = 8
$$);

文档

查询

查询语句与 pgvector 完全相同。VectorChord 支持任意过滤操作以及 WHERE/JOIN 子句,就像 pgvecto.rs 的 VBASE 一样。

SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;

支持的距离函数包括:

  • <-> - L2 距离
  • <#> - (负)内积
  • <=> - 余弦距离

由于 PostgreSQL 查询规划器的限制,我们无法直接支持类似 SELECT embedding <-> '[3,1,2]' as distance WHERE distance < 0.1 ORDER BY distance 的范围查询。

要查询特定距离范围内的向量,可以使用以下语法。

-- 查询特定距离范围内的向量
-- sphere(center, radius) 表示以 center 为圆心、radius 为半径的球体内的向量,即范围查询
-- <<->> 是 L2 距离,<<#>> 是内积,<<=>> 是余弦距离
SELECT vec FROM t WHERE vec <<->> sphere('[0.24, 0.24, 0.24]'::vector, 0.012)

查询性能调优

可以通过调整 probesepsilon 参数来优化搜索性能:

-- 设置 probes 以控制扫描的列表数量。
-- 建议范围:总 `lists` 值的 3%–10%。
SET vchordrq.probes = 100;

-- 设置 epsilon 以控制重排序精度。
-- 值越小重排序越少速度越快,值越大召回率越高。
-- 建议范围:0.0–4.0。默认值为 1.9。
SET vchordrq.epsilon = 1.9;

以及 PostgreSQL 本身的设置:

-- 如果使用 SSD,将 `effective_io_concurrency` 设置为 200 以获得更快的磁盘 I/O。
SET effective_io_concurrency = 200;

-- 禁用 JIT(即时编译),因为它收益甚微(1–2%),
-- 且对单查询负载会增加额外开销。
SET jit = off;

-- 至少将总内存的 25% 分配给 `shared_buffers`。
-- 对于磁盘密集型负载,可以将其增加到总内存的 90%。使用网络存储时,建议禁用交换分区以避免 I/O 挂起。
-- 注意:此设置需要重启才能生效。
ALTER SYSTEM SET shared_buffers = '8GB';

索引预热

要预热索引,可以使用以下 SQL。在内存有限的情况下,这将显著提升性能。

-- vchordrq_prewarm(index_name::regclass) 将索引预热到共享缓冲区中
SELECT vchordrq_prewarm('gist_train_embedding_idx'::regclass);

索引构建时间

索引构建可以通过索引选项中的 build_threads 参数和 PostgreSQL 设置来实现并行化。使用以下设置优化并行度:

-- 将此值设置为可用于并行操作的 CPU 核心数。
SET max_parallel_maintenance_workers = 8;
SET max_parallel_workers = 8;

-- 调整工作进程总数。
-- 注意:此设置需要重启才能生效。
ALTER SYSTEM SET max_worker_processes = 8;

索引构建进度

可以通过查询 pg_stat_progress_create_index 视图来查看索引构建进度。

SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;

外部索引预计算

与纯 SQL 方式不同,外部索引预计算会先在外部进行聚类,然后将质心插入 PostgreSQL 表中。虽然过程更为复杂,但在大规模数据集(>500 万条)上,外部构建明显更快。

首先,需要使用 faissscikit-learn 或其他聚类库对向量进行聚类。

质心需要预先存储在一个任意名称的表中,该表包含 3 列:

  • id(integer):每个质心的 ID,必须唯一
  • parent(integer,可为空):每个质心的父 ID,普通聚类时应为 NULL
  • vector(vector):每个质心的向量表示,使用 pgvector 的 vector 类型

示例如下:

-- 创建质心表
CREATE TABLE public.centroids (id integer NOT NULL UNIQUE, parent integer, vector vector(768));
-- 插入质心数据
INSERT INTO public.centroids (id, parent, vector) VALUES (1, NULL, '{0.1, 0.2, 0.3, ..., 0.768}');
INSERT INTO public.centroids (id, parent, vector) VALUES (2, NULL, '{0.4, 0.5, 0.6, ..., 0.768}');
INSERT INTO public.centroids (id, parent, vector) VALUES (3, NULL, '{0.7, 0.8, 0.9, ..., 0.768}');
-- ...

-- 使用外部质心表创建索引
CREATE INDEX ON gist_train USING vchordrq (embedding vector_l2_ops) WITH (options = $$
[build.external]
table = 'public.centroids'
$$);

为了简化工作流程,我们提供了端到端的外部索引预计算脚本,详见 scripts


限制

  • 架构兼容性:快速扫描内核针对 x86_64 架构进行了优化。虽然可以在 aarch64 上运行,但性能可能较低。

构建

构建此扩展需要 clang-17+

在 EL 8/9、Ubuntu 24.04 上可直接使用,但在 Ubuntu 22.04 / Debian 12 上需要手动安装。

例如,在 Ubuntu 22 / Debian 12 上安装 clang-18 并将其设置为默认的 clang:

curl --proto '=https' --tlsv1.2 -sSf https://apt.llvm.org/llvm.sh | bash -s -- 18
sudo update-alternatives --install /usr/bin/clang clang $(which clang-18) 255

45 - vectorscale

使用DiskANN算法对向量进行高效索引

概览

扩展包名版本分类许可证语言
pgvectorscale0.9.0RAGPostgreSQLRust
ID扩展名BinLibLoadCreateTrustReloc模式
1820vectorscale-
相关扩展vector vchord vectorize pg_summarize pg_tiktoken pg4ml pgml vchord_bm25 pg_similarity

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.9.01817161514pgvectorscalevector
RPMPIGSTY0.9.01817161514pgvectorscale_$vpgvector_$v
DEBPIGSTY0.9.01817161514postgresql-$v-pgvectorscalepostgresql-$v-pgvector
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
d13.x86_64
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
d13.aarch64
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
u22.x86_64
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
u22.aarch64
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
u24.x86_64
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
u24.aarch64
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0
PIGSTY 0.9.0

构建

您可以使用 pig build 命令构建 pgvectorscale 扩展的 RPM / DEB 包:

pig build pkg pgvectorscale         # 构建 RPM / DEB 包

安装

您可以直接安装 pgvectorscale 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgvectorscale;          # 当前活跃 PG 版本安装
pig ext install -y pgvectorscale -v 18  # PG 18
pig ext install -y pgvectorscale -v 17  # PG 17
pig ext install -y pgvectorscale -v 16  # PG 16
pig ext install -y pgvectorscale -v 15  # PG 15
pig ext install -y pgvectorscale -v 14  # PG 14
dnf install -y pgvectorscale_18       # PG 18
dnf install -y pgvectorscale_17       # PG 17
dnf install -y pgvectorscale_16       # PG 16
dnf install -y pgvectorscale_15       # PG 15
dnf install -y pgvectorscale_14       # PG 14
apt install -y postgresql-18-pgvectorscale   # PG 18
apt install -y postgresql-17-pgvectorscale   # PG 17
apt install -y postgresql-16-pgvectorscale   # PG 16
apt install -y postgresql-15-pgvectorscale   # PG 15
apt install -y postgresql-14-pgvectorscale   # PG 14

创建扩展

CREATE EXTENSION vectorscale CASCADE;  -- 依赖: vector

用法

CREATE EXTENSION vectorscale CASCADE;

CREATE TABLE IF NOT EXISTS document_embedding  (
    id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    metadata JSONB,
    contents TEXT,
    embedding VECTOR(1536)
);

-- 使用 diskann 索引方法创建向量索引
CREATE INDEX document_embedding_idx ON document_embedding
USING diskann (embedding);

-- 基于向量距离进行近似最近邻查询
SELECT *
FROM document_embedding
ORDER BY embedding <=> $1
LIMIT 10

46 - vectorize

在PostgreSQL中封装RAG向量检索服务

概览

扩展包名版本分类许可证语言
pg_vectorize0.26.1RAGPostgreSQLRust
ID扩展名BinLibLoadCreateTrustReloc模式
1830vectorizevectorize
相关扩展pg_cron pgmq vector vchord vectorscale pg_summarize pg_tiktoken pg4ml pgml pg_later pg_similarity

manually upgraded PGRX from 0.16.1 to 0.17.0 by Vonng; shared_preload_libraries should include vectorize and pg_cron.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.26.11817161514pg_vectorizepg_cron, pgmq, vector
RPMPIGSTY0.26.11817161514pg_vectorize_$vpgmq_$v, pg_cron_$v, pgvector_$v
DEBPIGSTY0.26.11817161514postgresql-$v-pg-vectorizepostgresql-$v-pgmq, postgresql-$v-pg-cron, postgresql-$v-pgvector
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
d12.aarch64
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
d13.x86_64
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
d13.aarch64
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
u22.x86_64
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
u22.aarch64
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
u24.x86_64
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
u24.aarch64
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1
PIGSTY 0.26.1

构建

您可以使用 pig build 命令构建 pg_vectorize 扩展的 RPM / DEB 包:

pig build pkg pg_vectorize         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_vectorize 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_vectorize;          # 当前活跃 PG 版本安装
pig ext install -y pg_vectorize -v 18  # PG 18
pig ext install -y pg_vectorize -v 17  # PG 17
pig ext install -y pg_vectorize -v 16  # PG 16
pig ext install -y pg_vectorize -v 15  # PG 15
pig ext install -y pg_vectorize -v 14  # PG 14
dnf install -y pg_vectorize_18       # PG 18
dnf install -y pg_vectorize_17       # PG 17
dnf install -y pg_vectorize_16       # PG 16
dnf install -y pg_vectorize_15       # PG 15
dnf install -y pg_vectorize_14       # PG 14
apt install -y postgresql-18-pg-vectorize   # PG 18
apt install -y postgresql-17-pg-vectorize   # PG 17
apt install -y postgresql-16-pg-vectorize   # PG 16
apt install -y postgresql-15-pg-vectorize   # PG 15
apt install -y postgresql-14-pg-vectorize   # PG 14

预加载配置

shared_preload_libraries = 'pg_cron, vectorize';

创建扩展

CREATE EXTENSION vectorize CASCADE;  -- 依赖: pg_cron, pgmq, vector

用法

pg_vectorize:在 Postgres 上进行向量搜索的最简方式。 来源:README.md

一个 Postgres 扩展,自动化文本到嵌入向量的转换和编排,并提供与最流行 LLM 的集成。可以快速搭建和自动维护向量搜索、全文搜索和混合搜索,帮助你在 Postgres 上快速构建 RAG 和搜索引擎。

该项目重度依赖 pgvector(向量相似度搜索)、pgmq(后台工作进程编排)和 SentenceTransformers

API 文档:https://chuckhend.github.io/pg_vectorize/


概览

pg_vectorize 提供两种方式为任意 Postgres 添加语义搜索、全文搜索和混合搜索,方便在 Postgres 上构建检索增强生成(RAG)。

模式概览:

  • HTTP 服务器(适用于托管数据库):运行一个独立服务连接 Postgres 并暴露 REST API(POST /api/v1/tableGET /api/v1/search)。
  • Postgres 扩展(SQL):将扩展安装到 Postgres 中,使用 vectorize.table()vectorize.search() 等 SQL 函数(需要 Postgres 的文件系统访问权限)。

快速开始 – HTTP 服务器

使用 docker compose 在本地运行 Postgres 和 HTTP 服务:

# 运行 Postgres、嵌入向量服务器和管理 API
docker compose up -d

将示例数据集加载到 Postgres(可选):

psql postgres://postgres:postgres@localhost:5432/postgres -f server/sql/example.sql

通过 HTTP API 创建嵌入向量任务。这会为现有数据生成嵌入向量,并持续监控更新或新数据:

curl -X POST http://localhost:8080/api/v1/table -d '{
		"job_name": "my_job",
		"src_table": "my_products",
		"src_schema": "public",
		"src_columns": ["product_name", "description"],
		"primary_key": "product_id",
		"update_time_col": "updated_at",
		"model": "sentence-transformers/all-MiniLM-L6-v2"
	}' -H "Content-Type: application/json"
{"id":"16b80184-2e8e-4ee6-b7e2-1a068ff4b314"}

使用 HTTP API 搜索:

curl -G \
  "http://localhost:8080/api/v1/search" \
  --data-urlencode "job_name=my_job" \
  --data-urlencode "query=camping backpack" \
  --data-urlencode "limit=1" \
  | jq .
[
  {
    "description": "Storage solution for carrying personal items on ones back",
    "fts_rank": 1,
    "price": 45.0,
    "product_category": "accessories",
    "product_id": 6,
    "product_name": "Backpack",
    "rrf_score": 0.03278688524590164,
    "semantic_rank": 1,
    "similarity_score": 0.6296013593673706,
    "updated_at": "2025-10-05T00:14:39.220893+00:00"
  }
]

选择哪种模式?

  • 当 Postgres 是托管的(RDS、Cloud SQL 等)或无法安装扩展时,使用 HTTP 服务器。只需数据库中有 pgvector 即可,HTTP 服务单独运行。
  • 当自托管 Postgres 且可以安装扩展时,使用 Postgres 扩展。提供数据库内体验和直接的 SQL API 进行向量化和 RAG。

快速开始 – Postgres 扩展(SQL)

CREATE EXTENSION vectorize CASCADE;

使用 vectorize.table() 创建嵌入向量任务,使用 vectorize.search() 直接从 SQL 进行语义搜索。

47 - pg_similarity

提供17种距离度量函数

概览

扩展包名版本分类许可证语言
pg_similarity1.0RAGBSD 3-ClauseC
ID扩展名BinLibLoadCreateTrustReloc模式
1840pg_similarity-
相关扩展vector smlar fuzzystrmatch pg_trgm vchord pg_bigm citext unaccent

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.01817161514pg_similarity-
RPMPIGSTY1.01817161514pg_similarity_$v-
DEBPGDG1.01817161514postgresql-$v-similarity-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
el9.x86_64
el9.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
d12.aarch64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
d13.x86_64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
d13.aarch64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
u22.x86_64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
u22.aarch64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
u24.x86_64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
u24.aarch64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0

构建

您可以使用 pig build 命令构建 pg_similarity 扩展的 RPM 包:

pig build pkg pg_similarity         # 构建 RPM 包

安装

您可以直接安装 pg_similarity 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_similarity;          # 当前活跃 PG 版本安装
pig ext install -y pg_similarity -v 18  # PG 18
pig ext install -y pg_similarity -v 17  # PG 17
pig ext install -y pg_similarity -v 16  # PG 16
pig ext install -y pg_similarity -v 15  # PG 15
pig ext install -y pg_similarity -v 14  # PG 14
dnf install -y pg_similarity_18       # PG 18
dnf install -y pg_similarity_17       # PG 17
dnf install -y pg_similarity_16       # PG 16
dnf install -y pg_similarity_15       # PG 15
dnf install -y pg_similarity_14       # PG 14
apt install -y postgresql-18-similarity   # PG 18
apt install -y postgresql-17-similarity   # PG 17
apt install -y postgresql-16-similarity   # PG 16
apt install -y postgresql-15-similarity   # PG 15
apt install -y postgresql-14-similarity   # PG 14

创建扩展

CREATE EXTENSION pg_similarity;

用法

pg_similarity:PostgreSQL 相似度查询支持。 来源:README.md

pg_similarity 是支持 PostgreSQL 相似度查询的扩展。实现与 RDBMS 紧密集成,定义了运算符,你可以使用 ~~~~!~ 等代替传统运算符(=<>)。

pg_similarity 有三个主要组件:

  • 函数:实现文献中可用的相似度算法的函数集合。这些函数可作为 UDF 使用,并作为实现相似度运算符的基础;
  • 运算符:基于相似度函数定义的运算符集合。它们使用相似度函数获取相似度阈值,并与用户定义的阈值比较以决定是否匹配;
  • 会话变量:存储相似度函数参数的变量集合。这些变量可在运行时定义。

函数与运算符

该扩展支持一系列相似度算法。最知名的算法均已覆盖。请注意每种算法适用于特定领域。提供以下算法:

  • L1 距离(又称城市街区距离或曼哈顿距离)
  • 余弦距离
  • Dice 系数
  • 欧几里得距离
  • 汉明距离
  • Jaccard 系数
  • Jaro 距离
  • Jaro-Winkler 距离
  • Levenshtein 距离
  • 匹配系数
  • Monge-Elkan 系数
  • Needleman-Wunsch 系数
  • 重叠系数
  • Q-Gram 距离
  • Smith-Waterman 系数
  • Smith-Waterman-Gotoh 系数
  • Soundex 距离
算法函数运算符支持索引参数
L1 距离block(text, text) returns float8~++pg_similarity.block_tokenizer, pg_similarity.block_threshold, pg_similarity.block_is_normalized
余弦距离cosine(text, text) returns float8~##pg_similarity.cosine_tokenizer, pg_similarity.cosine_threshold, pg_similarity.cosine_is_normalized
Dice 系数dice(text, text) returns float8~-~pg_similarity.dice_tokenizer, pg_similarity.dice_threshold, pg_similarity.dice_is_normalized
欧几里得距离euclidean(text, text) returns float8~!!pg_similarity.euclidean_tokenizer, pg_similarity.euclidean_threshold, pg_similarity.euclidean_is_normalized
汉明距离hamming(bit varying, bit varying) returns float8 / hamming_text(text, text) returns float8~@~pg_similarity.hamming_threshold, pg_similarity.hamming_is_normalized
Jaccard 系数jaccard(text, text) returns float8~??pg_similarity.jaccard_tokenizer, pg_similarity.jaccard_threshold, pg_similarity.jaccard_is_normalized
Jaro 距离jaro(text, text) returns float8~%%pg_similarity.jaro_threshold, pg_similarity.jaro_is_normalized
Jaro-Winkler 距离jarowinkler(text, text) returns float8~@@pg_similarity.jarowinkler_threshold, pg_similarity.jarowinkler_is_normalized
Levenshtein 距离lev(text, text) returns float8~==pg_similarity.levenshtein_threshold, pg_similarity.levenshtein_is_normalized
匹配系数matchingcoefficient(text, text) returns float8~^^pg_similarity.matching_tokenizer, pg_similarity.matching_threshold, pg_similarity.matching_is_normalized
Monge-Elkan 系数mongeelkan(text, text) returns float8~||pg_similarity.mongeelkan_tokenizer, pg_similarity.mongeelkan_threshold, pg_similarity.mongeelkan_is_normalized
Needleman-Wunsch 系数needlemanwunsch(text, text) returns float8~#~pg_similarity.nw_threshold, pg_similarity.nw_is_normalized
重叠系数overlapcoefficient(text, text) returns float8~**pg_similarity.overlap_tokenizer, pg_similarity.overlap_threshold, pg_similarity.overlap_is_normalized
Q-Gram 距离qgram(text, text) returns float8~~~pg_similarity.qgram_threshold, pg_similarity.qgram_is_normalized
Smith-Waterman 系数smithwaterman(text, text) returns float8~=~pg_similarity.sw_threshold, pg_similarity.sw_is_normalized
Smith-Waterman-Gotoh 系数smithwatermangotoh(text, text) returns float8~!~pg_similarity.swg_threshold, pg_similarity.swg_is_normalized
Soundex 距离soundex(text, text) returns float8~*~

参数

多个参数控制 pg_similarity 函数和运算符的行为。可分为三类:

  • tokenizer:控制字符串的分词方式。有效值为 alnumgramwordcamelcase。所有 token 均为小写。默认为 alnum
    • alnum:分隔符为任何非字母数字字符。
    • gram:n-gram 是使用逐一滑动技术提取的长度为 n 的子序列。
    • word:分隔符为空白字符。
    • camelcase:分隔符为大写字母,但大写字母也作为 token 的首字符。
  • threshold:控制结果集的灵活程度。取值范围 0.01.0。默认为 0.7
  • normalized:控制相似度系数/距离是否归一化(在 0.0 和 1.0 之间)。默认为 true

示例

运行时设置参数:

SHOW pg_similarity.levenshtein_threshold;
-- 0.7

SET pg_similarity.levenshtein_threshold TO 0.5;

SET pg_similarity.cosine_tokenizer TO camelcase;

SET pg_similarity.euclidean_is_normalized TO false;

示例用表:

CREATE TABLE foo (a text);
INSERT INTO foo VALUES('Euler'),('Oiler'),('Euler Taveira de Oliveira'),('Maria Taveira dos Santos'),('Carlos Santos Silva');

CREATE TABLE bar (b text);
INSERT INTO bar VALUES('Euler T. de Oliveira'),('Euller'),('Oliveira, Euler Taveira'),('Sr. Oliveira');

使用相似度函数

SELECT a, b, cosine(a,b), jaro(a, b), euclidean(a, b) FROM foo, bar;

使用 levenshtein 运算符 (~==)

SHOW pg_similarity.levenshtein_threshold;
-- 0.7

SELECT a, b, lev(a,b) FROM foo, bar WHERE a ~== b;
--              a             |          b           |   lev
-- ---------------------------+----------------------+----------
--  Euler                     | Euller               | 0.833333
--  Euler Taveira de Oliveira | Euler T. de Oliveira |     0.76

SET pg_similarity.levenshtein_threshold TO 0.5;

SELECT a, b, lev(a,b) FROM foo, bar WHERE a ~== b;
--              a             |          b           |   lev
-- ---------------------------+----------------------+----------
--  Euler                     | Euller               | 0.833333
--  Oiler                     | Euller               |      0.5
--  Euler Taveira de Oliveira | Euler T. de Oliveira |     0.76

使用 qgram 运算符 (~~~)

SET pg_similarity.qgram_threshold TO 0.7;

SELECT a, b, qgram(a, b) FROM foo, bar WHERE a ~~~ b;
--              a             |            b            |  qgram
-- ---------------------------+-------------------------+----------
--  Euler                     | Euller                  |      0.8
--  Euler Taveira de Oliveira | Euler T. de Oliveira    |  0.77551
--  Euler Taveira de Oliveira | Oliveira, Euler Taveira | 0.807692

比较不同运算符

SELECT * FROM bar WHERE b ~@@ 'euler'; -- jaro-winkler 运算符
SELECT * FROM bar WHERE b ~~~ 'euler'; -- qgram 运算符
SELECT * FROM bar WHERE b ~== 'euler'; -- levenshtein 运算符
SELECT * FROM bar WHERE b ~## 'euler'; -- cosine 运算符

48 - pg_rrf

混合检索的倒数排序融合函数

概览

扩展包名版本分类许可证语言
pg_rrf0.0.3RAGMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
1845pg_rrf-

manually upgraded PGRX from 0.16.1 to 0.17.0 by Vonng

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.31817161514pg_rrf-
RPMPIGSTY0.0.31817161514pg_rrf_$v-
DEBPIGSTY0.0.31817161514postgresql-$v-pg-rrf-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY MISS
el8.aarch64PIGSTY MISS
el9.x86_64PIGSTY MISS
el9.aarch64PIGSTY MISS
el10.x86_64PIGSTY MISS
el10.aarch64PIGSTY MISS
d12.x86_64PIGSTY MISS
d12.aarch64PIGSTY MISS
d13.x86_64PIGSTY MISS
d13.aarch64PIGSTY MISS
u22.x86_64PIGSTY MISS
u22.aarch64PIGSTY MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
u24.x86_64PIGSTY MISS
u24.aarch64PIGSTY MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3

构建

您可以使用 pig build 命令构建 pg_rrf 扩展的 RPM / DEB 包:

pig build pkg pg_rrf         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_rrf 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_rrf;          # 当前活跃 PG 版本安装
pig ext install -y pg_rrf -v 17  # PG 17
pig ext install -y pg_rrf -v 16  # PG 16
pig ext install -y pg_rrf -v 15  # PG 15
pig ext install -y pg_rrf -v 14  # PG 14
dnf install -y pg_rrf_17       # PG 17
dnf install -y pg_rrf_16       # PG 16
dnf install -y pg_rrf_15       # PG 15
dnf install -y pg_rrf_14       # PG 14
apt install -y postgresql-17-pg-rrf   # PG 17
apt install -y postgresql-16-pg-rrf   # PG 16
apt install -y postgresql-15-pg-rrf   # PG 15
apt install -y postgresql-14-pg-rrf   # PG 14

创建扩展

CREATE EXTENSION pg_rrf;

用法

来源: README项目仓库

pg_rrf 提供互惠排名融合(Reciprocal Rank Fusion,RRF)函数,用于混合检索场景下的分数融合。 它的重点是合并多个有序候选列表,而不需要手写 FULL OUTER JOIN / COALESCE 之类的连接逻辑。

核心函数

  • rrf(rank_a, rank_b, k)
  • rrf3(rank_a, rank_b, rank_c, k)
  • rrf_fuse(ids_a bigint[], ids_b bigint[], k int default 60)
  • rrfn(ranks bigint[], k int)

README 还说明了这些分数辅助函数的行为:

  • 缺失的排名会被忽略
  • <= 0 的排名会被忽略
  • k <= 0 时会报错

示例

CREATE EXTENSION pg_rrf;

SELECT rrf(1, 2, 60) AS rrf_12;
SELECT rrf3(1, 2, 3, 60) AS rrf_123;
SELECT rrfn(ARRAY[1, 2, 3], 60) AS rrfn_123;
SELECT *
FROM rrf_fuse(ARRAY[10, 20, 30], ARRAY[20, 40], 60)
ORDER BY score DESC;

混合检索模式

上游 README 将 rrf_fuse 作为手工融合查询的替代方案:

WITH fused AS (
  SELECT *
  FROM rrf_fuse(
    ARRAY(SELECT id FROM docs ORDER BY bm25_score DESC LIMIT 100),
    ARRAY(SELECT id FROM docs ORDER BY embedding <=> :qvec LIMIT 100),
    60
  )
)
SELECT d.*, fused.score
FROM fused
JOIN docs d USING (id)
ORDER BY fused.score DESC
LIMIT 20;

需求

  • PostgreSQL 14-17
  • Docker 和 Docker Compose v2

README 说明构建与测试流程都在 Docker 中运行,因此该包工作流不依赖本地 PostgreSQL 或 Rust 工具链。

49 - smlar

高效的相似度搜索函数

概览

扩展包名版本分类许可证语言
smlar1.0RAGPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
1850smlar-
相关扩展pg_similarity fuzzystrmatch pg_trgm intarray vector pg_bigm unaccent vchord

fix pg18 break issue by https://github.com/Vonng/smlar

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514smlar-
RPMPIGSTY1.01817161514smlar_$v-
DEBPIGSTY1.01817161514postgresql-$v-smlar-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 smlar 扩展的 RPM / DEB 包:

pig build pkg smlar         # 构建 RPM / DEB 包

安装

您可以直接安装 smlar 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install smlar;          # 当前活跃 PG 版本安装
pig ext install -y smlar -v 18  # PG 18
pig ext install -y smlar -v 17  # PG 17
pig ext install -y smlar -v 16  # PG 16
pig ext install -y smlar -v 15  # PG 15
pig ext install -y smlar -v 14  # PG 14
dnf install -y smlar_18       # PG 18
dnf install -y smlar_17       # PG 17
dnf install -y smlar_16       # PG 16
dnf install -y smlar_15       # PG 15
dnf install -y smlar_14       # PG 14
apt install -y postgresql-18-smlar   # PG 18
apt install -y postgresql-17-smlar   # PG 17
apt install -y postgresql-16-smlar   # PG 16
apt install -y postgresql-15-smlar   # PG 15
apt install -y postgresql-14-smlar   # PG 14

创建扩展

CREATE EXTENSION smlar;

用法

smlar:PostgreSQL 数组的高效相似度搜索。 来源:README

smlar 扩展提供 PostgreSQL 数组上的高效相似度搜索,支持可配置的相似度公式、GiST 和 GIN 索引,以及 TF/IDF 加权。


函数

float4 smlar(anyarray, anyarray)

计算两个数组的相似度。数组应为相同类型。

float4 smlar(anyarray, anyarray, bool useIntersect)

计算两个复合类型数组的相似度。复合类型格式如下:

CREATE TYPE type_name AS (element_name anytype, weight_name FLOAT4);

useIntersect 选项指定分母中仅使用交集元素。

float4 smlar(anyarray a, anyarray b, text formula)

通过给定公式计算两个数组的相似度。公式中的预定义变量:

  • N.i – 两个数组中的公共元素数量(交集)
  • N.a – 第一个数组中的唯一元素数量
  • N.b – 第二个数组中的唯一元素数量

示例:

SELECT smlar('{1,4,6}'::int[], '{5,4,6}');
SELECT smlar('{1,4,6}'::int[], '{5,4,6}', 'N.i / sqrt(N.a * N.b)');
-- 这两个调用是等价的。
anyarray % anyarray

如果数组的相似度大于阈值限制则返回 true。

text[] tsvector2textarray(tsvector)

将 tsvector 类型转换为文本数组。

anyarray array_unique(anyarray)

排序并去重数组。

float4 inarray(anyarray, anyelement)

如果第二个参数不存在于第一个参数中返回零,否则返回 1.0。

float4 inarray(anyarray, anyelement, float4, float4)

如果第二个参数不存在于第一个参数中返回第四个参数,否则返回第三个参数。


GUC 配置变量

smlar.threshold  FLOAT

相似度低于阈值的数组不被 % 运算视为相似。

smlar.persistent_cache  BOOL

全局统计缓存存储在事务无关的内存中。

smlar.type  STRING

相似度公式类型:cosine(默认)、tfidfoverlap

smlar.stattable  STRING

存储集合级统计数据的表名。表应定义为:

CREATE TABLE table_name (
    value   data_type UNIQUE,
    ndoc    int4 (or bigint)  NOT NULL CHECK (ndoc > 0)
);

值为 null 的行表示文档总数。仅用于 smlar.type = 'tfidf'

smlar.tf_method  STRING

词频计算方法。取值:

  • "n" – 简单计数(默认)
  • "log" – 1 + log(n)
  • "const" – TF 等于 1

仅用于 smlar.type = 'tfidf'

smlar.idf_plus_one  BOOL

如果为 false(默认),idf 计算为 log(d/df)。如果为 true,计算为 log(1+d/df)。仅用于 smlar.type = 'tfidf'

强烈建议在 postgresql.conf 中添加:

smlar.threshold = 0.6  # 或其他 > 0 且 < 1 的值

GiST/GIN 索引支持

%&& 操作支持多种数组类型的 GiST 和 GIN 索引:

数组类型GIN 操作符类GiST 操作符类
bit[]_bit_sml_ops
bytea[]_bytea_sml_ops_bytea_sml_ops
char[]_char_sml_ops_char_sml_ops
cidr[]_cidr_sml_ops_cidr_sml_ops
date[]_date_sml_ops_date_sml_ops
float4[]_float4_sml_ops_float4_sml_ops
float8[]_float8_sml_ops_float8_sml_ops
inet[]_inet_sml_ops_inet_sml_ops
int2[]_int2_sml_ops_int2_sml_ops
int4[]_int4_sml_ops_int4_sml_ops
int8[]_int8_sml_ops_int8_sml_ops
interval[]_interval_sml_ops_interval_sml_ops
macaddr[]_macaddr_sml_ops_macaddr_sml_ops
money[]_money_sml_ops
numeric[]_numeric_sml_ops_numeric_sml_ops
oid[]_oid_sml_ops_oid_sml_ops
text[]_text_sml_ops_text_sml_ops
time[]_time_sml_ops_time_sml_ops
timestamp[]_timestamp_sml_ops_timestamp_sml_ops
timestamptz[]_timestamptz_sml_ops_timestamptz_sml_ops
timetz[]_timetz_sml_ops_timetz_sml_ops
varbit[]_varbit_sml_ops
varchar[]_varchar_sml_ops_varchar_sml_ops

50 - pg_summarize

使用LLM对文本字段进行总结

概览

扩展包名版本分类许可证语言
pg_summarize0.0.1RAGPostgreSQLRust
ID扩展名BinLibLoadCreateTrustReloc模式
1860pg_summarize-
相关扩展vectorize pg_tiktoken pg4ml pgml vector vchord vectorscale pg_net

PG18 fix by https://github.com/Vonng/pg_summarize

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.11817161514pg_summarize-
RPMPIGSTY0.0.11817161514pg_summarize_$v-
DEBPIGSTY0.0.11817161514postgresql-$v-pg-summarize-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d13.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d13.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u22.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u22.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u24.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u24.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1

构建

您可以使用 pig build 命令构建 pg_summarize 扩展的 RPM / DEB 包:

pig build pkg pg_summarize         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_summarize 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_summarize;          # 当前活跃 PG 版本安装
pig ext install -y pg_summarize -v 18  # PG 18
pig ext install -y pg_summarize -v 17  # PG 17
pig ext install -y pg_summarize -v 16  # PG 16
pig ext install -y pg_summarize -v 15  # PG 15
pig ext install -y pg_summarize -v 14  # PG 14
dnf install -y pg_summarize_18       # PG 18
dnf install -y pg_summarize_17       # PG 17
dnf install -y pg_summarize_16       # PG 16
dnf install -y pg_summarize_15       # PG 15
dnf install -y pg_summarize_14       # PG 14
apt install -y postgresql-18-pg-summarize   # PG 18
apt install -y postgresql-17-pg-summarize   # PG 17
apt install -y postgresql-16-pg-summarize   # PG 16
apt install -y postgresql-15-pg-summarize   # PG 15
apt install -y postgresql-14-pg-summarize   # PG 14

创建扩展

CREATE EXTENSION pg_summarize;

用法

pg_summarize:使用 LLM 进行文本摘要,基于 pgrx 构建。 来源:README.md

pg_summarize 是一个用 Rust(使用 pgrx)编写的 PostgreSQL 扩展,集成了 OpenAI API。它包含一个基础的 “Hello, pg_summarize!” 函数和一个使用 OpenAI 模型进行文本摘要的 summarize 函数。


快速开始

CREATE EXTENSION pg_summarize;

-- 测试 hello 函数
SELECT hello_pg_summarize();
--  hello_pg_summarize
-- ----------------------
--  Hello, pg_summarize

配置

该扩展从 PostgreSQL 设置中获取配置。使用 summarize 函数前需设置以下参数:

-- 设置 OpenAI API 密钥(必需)
ALTER SYSTEM SET pg_summarizer.api_key = 'your_openai_api_key';

-- 可选设置模型(默认:gpt-3.5-turbo)
ALTER SYSTEM SET pg_summarizer.model = 'gpt-3.5-turbo';

-- 或在会话级别设置提示词
SET pg_summarizer.prompt = 'Your custom prompt here';

-- 如果在 SYSTEM 级别设置,需重新加载配置
SELECT pg_reload_conf();

Summarize 函数

summarize 函数接受文本输入,发送到 OpenAI API,并返回摘要:

-- 摘要文本输入
SELECT summarize('<This is the text to be summarized.>');

-- 从现有数据创建摘要表
CREATE TABLE blogs_summary AS
  SELECT blog_url, summarize(blogs_text)
  FROM hexacluster_blogs;

-- 使用不同模型
SET pg_summarizer.model = 'gpt-4o';
CREATE TABLE blogs_summary_4o AS
  SELECT blog_url, summarize(blogs_text)
  FROM hexacluster_blogs;

工作原理

  • 配置获取summarize 函数通过 current_setting() 从 PostgreSQL 获取设置(API 密钥、模型、提示词)。未找到设置时使用默认值。
  • 默认提示词:内置提示词指示 AI 从 <text> 标签中摘要文本,重点简洁地捕获最重要的信息。
  • API 调用:该函数向 OpenAI 聊天补全端点发送 POST 请求,包含配置的模型和提示词,返回摘要内容。

51 - pg_tiktoken

在PostgreSQL中计算OpenAI使用的Token数

概览

扩展包名版本分类许可证语言
pg_tiktoken0.0.1RAGApache-2.0Rust
ID扩展名BinLibLoadCreateTrustReloc模式
1870pg_tiktoken-
相关扩展vectorize pg_summarize pg4ml pgml vector vchord vectorscale pg_graphql

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.11817161514pg_tiktoken-
RPMPIGSTY0.0.11817161514pg_tiktoken_$v-
DEBPIGSTY0.0.11817161514postgresql-$v-pg-tiktoken-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d12.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d13.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
d13.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u22.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u22.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u24.x86_64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
u24.aarch64
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1
PIGSTY 0.0.1

构建

您可以使用 pig build 命令构建 pg_tiktoken 扩展的 RPM / DEB 包:

pig build pkg pg_tiktoken         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_tiktoken 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_tiktoken;          # 当前活跃 PG 版本安装
pig ext install -y pg_tiktoken -v 18  # PG 18
pig ext install -y pg_tiktoken -v 17  # PG 17
pig ext install -y pg_tiktoken -v 16  # PG 16
pig ext install -y pg_tiktoken -v 15  # PG 15
pig ext install -y pg_tiktoken -v 14  # PG 14
dnf install -y pg_tiktoken_18       # PG 18
dnf install -y pg_tiktoken_17       # PG 17
dnf install -y pg_tiktoken_16       # PG 16
dnf install -y pg_tiktoken_15       # PG 15
dnf install -y pg_tiktoken_14       # PG 14
apt install -y postgresql-18-pg-tiktoken   # PG 18
apt install -y postgresql-17-pg-tiktoken   # PG 17
apt install -y postgresql-16-pg-tiktoken   # PG 16
apt install -y postgresql-15-pg-tiktoken   # PG 15
apt install -y postgresql-14-pg-tiktoken   # PG 14

创建扩展

CREATE EXTENSION pg_tiktoken;

用法

pg_tiktoken:用于 PostgreSQL 中 OpenAI 模型的 tiktoken 分词器。 来源:README.md

pg_tiktoken 是一个 PostgreSQL 扩展,使用 OpenAI 的 tiktoken 库提供输入分词功能。它允许你直接在 SQL 中计数和编码 token,这在处理 OpenAI 模型的输入长度限制时非常有用。


函数

tiktoken_count

计算给定编码或模型的 token 数量:

SELECT tiktoken_count('p50k_edit', 'A long time ago in a galaxy far, far away');
 tiktoken_count
----------------
             11
(1 row)

tiktoken_encode

获取给定编码或模型的 token ID:

SELECT tiktoken_encode('cl100k_base', 'A long time ago in a galaxy far, far away');
                  tiktoken_encode
----------------------------------------------------
 {32,1317,892,4227,304,264,34261,3117,11,3117,3201}
(1 row)

tiktoken_counttiktoken_encode 的第一个参数都可以接受编码名称或 OpenAI 模型名称。


支持的模型

编码名称OpenAI 模型
cl100k_baseChatGPT 模型, text-embedding-ada-002
p50k_base代码模型, text-davinci-002, text-davinci-003
p50k_edit编辑模型如 text-davinci-edit-001, code-davinci-edit-001
r50k_base(或 gpt2GPT-3 模型如 davinci

52 - pg4ml

PG4ML是一个机器学习框架

概览

扩展包名版本分类许可证语言
pg4ml2.0RAGAGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1880pg4ml-
相关扩展plpgsql tablefunc cube plpython3u pgml vectorize pg_summarize pg_tiktoken vector vchord vectorscale pg_strom

require python3

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.01817161514pg4mlplpgsql, tablefunc, cube, plpython3u
RPMPIGSTY2.01817161514pg4ml_$v-
DEBPIGSTY2.01817161514postgresql-$v-pg4ml-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
u24.x86_64
u24.aarch64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0

构建

您可以使用 pig build 命令构建 pg4ml 扩展的 RPM / DEB 包:

pig build pkg pg4ml         # 构建 RPM / DEB 包

安装

您可以直接安装 pg4ml 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg4ml;          # 当前活跃 PG 版本安装
pig ext install -y pg4ml -v 18  # PG 18
pig ext install -y pg4ml -v 17  # PG 17
pig ext install -y pg4ml -v 16  # PG 16
pig ext install -y pg4ml -v 15  # PG 15
pig ext install -y pg4ml -v 14  # PG 14
dnf install -y pg4ml_18       # PG 18
dnf install -y pg4ml_17       # PG 17
dnf install -y pg4ml_16       # PG 16
dnf install -y pg4ml_15       # PG 15
dnf install -y pg4ml_14       # PG 14
apt install -y postgresql-18-pg4ml   # PG 18
apt install -y postgresql-17-pg4ml   # PG 17
apt install -y postgresql-16-pg4ml   # PG 16
apt install -y postgresql-15-pg4ml   # PG 15
apt install -y postgresql-14-pg4ml   # PG 14

创建扩展

CREATE EXTENSION pg4ml CASCADE;  -- 依赖: plpgsql, tablefunc, cube, plpython3u

用法

pg4ml:PostgreSQL 机器学习框架。 来源:README.md

pg4ml 是一个 PostgreSQL 扩展,完全在数据库内使用 PL/pgSQL 和 PL/Python 实现机器学习框架。它通过 SQL 提供矩阵运算、神经网络构建与训练、聚类算法和科学计算功能。


前置条件

  • PostgreSQL >= 14,支持 Python3
  • 依赖扩展:plpgsqltablefunccubeplpython3u

快速开始

CREATE EXTENSION pg4ml CASCADE;
-- 这也会创建所需的依赖:plpgsql, tablefunc, cube, plpython3u

功能特性

矩阵运算

框架在 sm_sc schema 下提供了全面的矩阵运算库:

  • 逐元素运算:算术、比较、取整、拼接、布尔、位运算、复数和广播运算
  • 矩阵运算:乘法、转置、翻转、旋转、拼接
  • 构造:采样、替换、填充、字符匹配、随机生成
  • 三角函数:矩阵上的广播运算
  • 聚合:切片级聚合、矩阵级聚合、按切片值排序、定位极值位置

切片聚合示例

按垂直切片求平均(每组 2 行):

SELECT sm_sc.fv_aggr_slice_avg(
    array[[1.5, 11.5],
          [2.1, 12.1],
          [3.3, 13.3],
          [4.3, 14.3],
          [5.5, 15.5],
          [6.1, 16.1]],
    array[2, 1]
);
-- 返回: array[[1.8, 11.8],[3.8, 13.8],[5.8, 15.8]]

2x3 块上的最大池化:

SELECT sm_sc.fv_aggr_slice_max(
    array[[2.3, 5.1, 8.2, 2.56, 3.33, -1.9],
          [3.25, 6.4, 6.6, 6.9, -2.65, -4.6],
          [-2.3, 5.1, -8.2, 2.56, -3.33, -1.9],
          [3.25, -6.4, -6.6, 6.9, -2.65, -4.6]],
    array[2, 3]
);
-- 返回: array[[8.2, 6.9],[5.1, 6.9]]

神经网络

框架支持深度神经网络的构建和训练:

  • 节点和路径表sm_sc.tb_nn_node / sm_sc.tb_nn_path 用于定义网络结构
  • 训练输入缓冲区sm_sc.tb_nn_train_input_buff 用于接收训练数据
  • 任务管理sm_sc.tb_classify_task 用于部署和管理训练任务
  • 激活函数卷积池化Lambda 运算
  • 损失函数导数计算反向传播
  • 推理sm_sc.ft_nn_in_out 用于将测试/验证数据通过训练好的模型运行

聚类

  • K-means++:通过 sm_sc.prc_kmeans_pp 过程
  • DBSCAN:通过 sm_sc.prc_dbscan_pp 过程

两者都使用 sm_sc.tb_cluster_task 进行任务部署和管理。

科学计算

  • 波形处理
  • 计算图 JSON 序列化/反序列化
  • 复数运算
  • 线性代数

性能提示

  • 启用调试模式:SET session pg4ml._v_is_debug_check = '1';
  • 矩阵乘法使用 plpython3u 调用 numpy 进行优化
  • 调整 PostgreSQL 并行参数以支持多线程训练:
    • max_parallel_workers_per_gather
    • force_parallel_mode
    • parallel_setup_cost, parallel_tuple_cost
  • 考虑使用 pg_strom 扩展进行 GPU 加速

53 - pgml

PostgresML:用SQL运行机器学习算法并训练模型

概览

扩展包名版本分类许可证语言
pgml2.10.0RAGMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
1890pgmlpgml
相关扩展pg4ml vectorize pg_summarize pg_tiktoken vector vchord vectorscale pg_strom

pgrx=0.12.9

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.10.01817161514pgml-
RPMPIGSTY2.10.01817161514pgml_$v-
DEBPIGSTY2.10.01817161514postgresql-$v-pgml-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY MISS
el8.aarch64PIGSTY MISS
el9.x86_64PIGSTY MISS
el9.aarch64PIGSTY MISS
el10.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
el10.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
d12.x86_64PIGSTY MISS
d12.aarch64PIGSTY MISS
d13.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
d13.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
u22.x86_64PIGSTY MISS
u22.aarch64PIGSTY MISS
PIGSTY 2.10.0
PIGSTY 2.10.0
PIGSTY 2.10.0
PIGSTY 2.10.0
u24.x86_64PIGSTY MISS
u24.aarch64PIGSTY MISS
PIGSTY 2.10.0
PIGSTY 2.10.0
PIGSTY 2.10.0
PIGSTY 2.10.0

构建

您可以使用 pig build 命令构建 pgml 扩展的 RPM / DEB 包:

pig build pkg pgml         # 构建 RPM / DEB 包

安装

您可以直接安装 pgml 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgml;          # 当前活跃 PG 版本安装
pig ext install -y pgml -v 17  # PG 17
pig ext install -y pgml -v 16  # PG 16
pig ext install -y pgml -v 15  # PG 15
pig ext install -y pgml -v 14  # PG 14
dnf install -y pgml_17       # PG 17
dnf install -y pgml_16       # PG 16
dnf install -y pgml_15       # PG 15
dnf install -y pgml_14       # PG 14
apt install -y postgresql-17-pgml   # PG 17
apt install -y postgresql-16-pgml   # PG 16
apt install -y postgresql-15-pgml   # PG 15
apt install -y postgresql-14-pgml   # PG 14

预加载配置

shared_preload_libraries = 'pgml';

创建扩展

CREATE EXTENSION pgml;

用法

在所有集群节点上安装 pgml 扩展及 Python 依赖后,即可在 PostgreSQL 集群中启用 pgml

使用 patronictl 命令配置集群,将 pgml 添加到 shared_preload_libraries 中,并在 pgml.venv 中指定 venv 目录:

shared_preload_libraries: pgml, timescaledb, pg_stat_statements, auto_explain
pgml.venv: '/data/pgml'

完成后,重启数据库集群,然后使用 SQL 命令创建扩展:

CREATE EXTENSION vector;        -- 建议同时安装 pgvector!
CREATE EXTENSION pgml;          -- 在当前数据库中创建 PostgresML
SELECT pgml.version();          -- 打印 PostgresML 版本信息

如果一切正常,应当看到类似如下的输出:

# create extension pgml;
INFO:  Python version: 3.11.2 (main, Oct  5 2023, 16:06:03) [GCC 8.5.0 20210514 (Red Hat 8.5.0-18)]
INFO:  Scikit-learn 1.3.0, XGBoost 2.0.0, LightGBM 4.1.0, NumPy 1.26.1
CREATE EXTENSION

# SELECT pgml.version(); -- 打印 PostgresML 版本信息
 version
---------
 2.7.8

一切就绪!更多详情请参阅 PostgresML 官方文档:https://postgresml.org/docs/guides/use-cases/

54 - pg_search

ParadeDB BM25算法全文检索插件,ES全文检索

概览

扩展包名版本分类许可证语言
pg_search0.23.0FTSAGPL-3.0Rust
ID扩展名BinLibLoadCreateTrustReloc模式
2100pg_searchparadedb
相关扩展pgroonga pgroonga_database pg_bestmatch vchord_bm25 pg_bigm zhparser pg_tokenizer pg_trgm

bm25 am conflicts with pg_textsearch; PG15-16 require shared_preload_libraries while PG17-18 do not.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.23.01817161514pg_search-
RPMPIGSTY0.23.01817161514pg_search_$v-
DEBPIGSTY0.23.01817161514postgresql-$v-pg-search-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64PIGSTY MISS
el10.aarch64PIGSTY MISS
d12.x86_64
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.20.7
d12.aarch64
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.20.7
d13.x86_64
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
d13.aarch64
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.20.5
u22.x86_64
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.20.7
u22.aarch64
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.20.7
u24.x86_64
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.20.7
u24.aarch64
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.22.6
PIGSTY 0.20.7

构建

您可以使用 pig build 命令构建 pg_search 扩展的 DEB 包:

pig build pkg pg_search         # 构建 DEB 包

安装

您可以直接安装 pg_search 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_search;          # 当前活跃 PG 版本安装
pig ext install -y pg_search -v 18  # PG 18
pig ext install -y pg_search -v 17  # PG 17
pig ext install -y pg_search -v 16  # PG 16
pig ext install -y pg_search -v 15  # PG 15
dnf install -y pg_search_18       # PG 18
dnf install -y pg_search_17       # PG 17
dnf install -y pg_search_16       # PG 16
dnf install -y pg_search_15       # PG 15
apt install -y postgresql-18-pg-search   # PG 18
apt install -y postgresql-17-pg-search   # PG 17
apt install -y postgresql-16-pg-search   # PG 16
apt install -y postgresql-15-pg-search   # PG 15

预加载配置

shared_preload_libraries = 'pg_search';

创建扩展

CREATE EXTENSION pg_search;

用法

README | Quickstart | Install docs

pg_search 是 ParadeDB 为 PostgreSQL 提供的全文检索扩展。它基于 Tantivy,为堆表提供 BM25 索引和查询能力。当前上游文档说明,它支持 PostgreSQL 15 及以上版本。

入门

安装文档强调一个关键要求:必须把 pg_search 加入 shared_preload_libraries,这样后台工作进程才能处理索引写入。

shared_preload_libraries = 'pg_search'

随后启用扩展:

CREATE EXTENSION pg_search;
ALTER SYSTEM SET paradedb.pg_search_telemetry TO 'off';

创建 BM25 索引

Quickstart 展示了在堆表上创建 BM25 索引的方式,且需要唯一键字段:

CREATE INDEX search_idx ON mock_items
USING bm25 (id, description, category, rating, in_stock, created_at, metadata, weight_range)
WITH (key_field='id');

现有文档强调,key_field 必须唯一,BM25 索引是搜索查询的核心访问方法。

查询

@@@ 操作符用于执行搜索查询:

SELECT description, rating, category
FROM mock_items
WHERE description @@@ 'keyboard' AND rating > 2
ORDER BY rating
LIMIT 5;

ParadeDB 还提供用于相关性评分和摘要高亮的辅助函数:

SELECT description, paradedb.score(id)
FROM mock_items
WHERE description @@@ 'keyboard'
ORDER BY paradedb.score(id) DESC
LIMIT 5;

SELECT description, paradedb.snippet(description), paradedb.score(id)
FROM mock_items
WHERE description @@@ 'keyboard'
ORDER BY paradedb.score(id) DESC
LIMIT 5;

短语搜索支持用引号包裹表达式:

SELECT description
FROM mock_items
WHERE description @@@ '"metal keyboard"';

文本配置

Quickstart 还展示了如何为文本字段配置分词器,例如英文词干提取:

CREATE INDEX search_idx ON mock_items
USING bm25 (id, (description::pdb.simple('stemmer=english')), category)
WITH (key_field='id');

更深入的部署和运行说明请参考上游 ParadeDB 文档站,它是该项目的主文档入口。

55 - pgroonga

使用Groonga,面向所有语言的高速全文检索平台

概览

扩展包名版本分类许可证语言
pgroonga4.0.4FTSPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2110pgroonga-
2111pgroonga_database-
相关扩展pg_search pg_bigm zhparser pg_bestmatch pg_tokenizer pg_trgm rum vchord_bm25

require xxHash vendor repo to build

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY4.0.41817161514pgroonga-
RPMPIGSTY4.0.41817161514pgroonga_$vgroonga-libs
DEBPIGSTY4.0.41817161514postgresql-$v-pgroongalibgroonga0
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
el8.aarch64
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
el9.x86_64
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
el9.aarch64
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
el10.x86_64
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
el10.aarch64
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
u22.x86_64
u22.aarch64
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
u24.x86_64
u24.aarch64
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4
PIGSTY 4.0.4

构建

您可以使用 pig build 命令构建 pgroonga 扩展的 RPM / DEB 包:

pig build pkg pgroonga         # 构建 RPM / DEB 包

安装

您可以直接安装 pgroonga 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgroonga;          # 当前活跃 PG 版本安装
pig ext install -y pgroonga -v 18  # PG 18
pig ext install -y pgroonga -v 17  # PG 17
pig ext install -y pgroonga -v 16  # PG 16
pig ext install -y pgroonga -v 15  # PG 15
pig ext install -y pgroonga -v 14  # PG 14
dnf install -y pgroonga_18       # PG 18
dnf install -y pgroonga_17       # PG 17
dnf install -y pgroonga_16       # PG 16
dnf install -y pgroonga_15       # PG 15
dnf install -y pgroonga_14       # PG 14
apt install -y postgresql-18-pgroonga   # PG 18
apt install -y postgresql-17-pgroonga   # PG 17
apt install -y postgresql-16-pgroonga   # PG 16
apt install -y postgresql-15-pgroonga   # PG 15
apt install -y postgresql-14-pgroonga   # PG 14

创建扩展

CREATE EXTENSION pgroonga;

用法

以下是一个关于如何使用 PGroonga 的快速教程

CREATE EXTENSION IF NOT EXISTS pgroonga;

CREATE TABLE memos
(
    id      integer,
    content text
);

CREATE INDEX pgroonga_content_index ON memos USING pgroonga (content);

INSERT INTO memos VALUES (1, 'PostgreSQL is a relational database management system.');
INSERT INTO memos VALUES (2, 'Groonga is a fast full text search engine that supports all languages.');
INSERT INTO memos VALUES (3, 'PGroonga is a PostgreSQL extension that uses Groonga as index.');
INSERT INTO memos VALUES (4, 'There is groonga command.');

SET enable_seqscan = off;

-- 现在让我们使用 pgroonga 进行查询

SELECT * FROM memos WHERE content &@ 'engine';
--  id |                                content
-- ----+------------------------------------------------------------------------
--   2 | Groonga is a fast full text search engine that supports all languages.
-- (1 row)

SELECT * FROM memos WHERE content &@~ 'PGroonga OR PostgreSQL';
--  id |                            content
-- ----+----------------------------------------------------------------
--   3 | PGroonga is a PostgreSQL extension that uses Groonga as index.
--   1 | PostgreSQL is a relational database management system.
-- (2 rows)

SELECT * FROM memos WHERE content LIKE '%engine%';
--  id |                                content
-- ----+------------------------------------------------------------------------
--   2 | Groonga is a fast full text search engine that supports all languages.
-- (1 row)

56 - pgroonga_database

PGGroonga 数据库管理模块

概览

扩展包名版本分类许可证语言
pgroonga4.0.4FTSPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2110pgroonga-
2111pgroonga_database-
相关扩展pg_search zhparser pg_bigm pg_tokenizer pg_trgm fuzzystrmatch rum unaccent

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY4.0.41817161514pgroonga-
RPMPIGSTY4.0.41817161514pgroonga_$vgroonga-libs
DEBPIGSTY4.0.41817161514postgresql-$v-pgroongalibgroonga0
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
el8.aarch64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
el9.x86_64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
el9.aarch64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
el10.x86_64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
el10.aarch64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
d12.x86_64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
d12.aarch64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
d13.x86_64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
d13.aarch64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
u22.x86_64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
u22.aarch64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
u24.x86_64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4
u24.aarch64PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4PIGSTY 4.0.4

构建

您可以使用 pig build 命令构建 pgroonga 扩展的 RPM / DEB 包:

pig build pkg pgroonga         # 构建 RPM / DEB 包

安装

您可以直接安装 pgroonga 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgroonga;          # 当前活跃 PG 版本安装
pig ext install -y pgroonga -v 18  # PG 18
pig ext install -y pgroonga -v 17  # PG 17
pig ext install -y pgroonga -v 16  # PG 16
pig ext install -y pgroonga -v 15  # PG 15
pig ext install -y pgroonga -v 14  # PG 14
dnf install -y pgroonga_18       # PG 18
dnf install -y pgroonga_17       # PG 17
dnf install -y pgroonga_16       # PG 16
dnf install -y pgroonga_15       # PG 15
dnf install -y pgroonga_14       # PG 14
apt install -y postgresql-18-pgroonga   # PG 18
apt install -y postgresql-17-pgroonga   # PG 17
apt install -y postgresql-16-pgroonga   # PG 16
apt install -y postgresql-15-pgroonga   # PG 15
apt install -y postgresql-14-pgroonga   # PG 14

创建扩展

CREATE EXTENSION pgroonga_database;

用法

PGroonga 文档 | GitHub: pgroonga/pgroonga

pgroonga_databasePGroonga 项目的子扩展。它为 PGroonga 提供数据库管理功能,PGroonga 使 PostgreSQL 成为支持所有语言的快速全文搜索平台。

PGroonga 是一个全面的全文搜索解决方案,以 Groonga 作为后端。它开箱即用地支持所有语言(包括中日韩 CJK),并提供丰富功能:

  • 支持所有语言的快速全文搜索
  • 丰富的查询语法(查询语言、脚本语法)
  • JSON 搜索
  • 感知 HTML/XML 标签的高亮
  • 相似搜索
  • 同义词扩展
  • 自动补全
  • 查询日志分析

PGroonga 文档非常详尽,涵盖数百页。详细用法、API 参考、运算符、函数和调优指南请参见官方文档:

快速开始

CREATE EXTENSION pgroonga_database;
CREATE EXTENSION pgroonga;

-- 创建包含文本内容的表
CREATE TABLE memos (
  id integer,
  content text
);

-- 创建 PGroonga 索引
CREATE INDEX pgroonga_content_index ON memos USING pgroonga (content);

-- 插入数据
INSERT INTO memos VALUES (1, 'PostgreSQL is a relational database management system.');
INSERT INTO memos VALUES (2, 'Groonga is a fast full text search engine that supports all languages.');
INSERT INTO memos VALUES (3, 'PGroonga is a PostgreSQL extension that uses Groonga as its backend.');

-- 全文搜索
SELECT * FROM memos WHERE content &@~ 'PostgreSQL OR Groonga';

57 - pg_bigm

基于二字组的多语言全文检索扩展

概览

扩展包名版本分类许可证语言
pg_bigm1.2FTSPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2120pg_bigm-
相关扩展pg_search pgroonga zhparser pg_trgm pgroonga_database pg_tokenizer fuzzystrmatch rum

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.21817161514pg_bigm-
RPMPGDG1.21817161514pg_bigm_$v-
DEBPIGSTY1.21817161514postgresql-$v-pg-bigm-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

构建

您可以使用 pig build 命令构建 pg_bigm 扩展的 RPM / DEB 包:

pig build pkg pg_bigm         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_bigm 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_bigm;          # 当前活跃 PG 版本安装
pig ext install -y pg_bigm -v 18  # PG 18
pig ext install -y pg_bigm -v 17  # PG 17
pig ext install -y pg_bigm -v 16  # PG 16
pig ext install -y pg_bigm -v 15  # PG 15
pig ext install -y pg_bigm -v 14  # PG 14
dnf install -y pg_bigm_18       # PG 18
dnf install -y pg_bigm_17       # PG 17
dnf install -y pg_bigm_16       # PG 16
dnf install -y pg_bigm_15       # PG 15
dnf install -y pg_bigm_14       # PG 14
apt install -y postgresql-18-pg-bigm   # PG 18
apt install -y postgresql-17-pg-bigm   # PG 17
apt install -y postgresql-16-pg-bigm   # PG 16
apt install -y postgresql-15-pg-bigm   # PG 15
apt install -y postgresql-14-pg-bigm   # PG 14

预加载配置

shared_preload_libraries = 'pg_bigm';

创建扩展

CREATE EXTENSION pg_bigm;

用法

pg_bigm 文档 | GitHub: pgbigm/pg_bigm

pg_bigm 模块为 PostgreSQL 提供全文搜索能力。它允许用户创建 2-gram(bigram)索引,以加速全文搜索。

pg_bigm 采用 PostgreSQL License 发布,是一种宽松的开源许可证,和 BSD、MIT 类似。

功能特性

  • Bigram 索引:为文本列创建 2-gram(bigram)GIN 索引
  • 更快的 LIKE 搜索:加速 LIKE 查询,包括前缀、后缀和子串搜索
  • 全语言支持:无需额外配置即可支持包括中文、日文、韩文在内的任意语言
  • 简单 API:提供相似度搜索函数和运算符

函数与运算符

函数

函数返回类型说明
likequery(text)text根据关键字生成全文搜索查询
show_bigm(text)text[]显示给定字符串中的所有 2-gram
pg_gin_pending_stats(regclass)record返回 GIN 索引待处理列表中的页面数和元组数

运算符

运算符说明
text =% text当左右操作数的相似度大于等于 pg_bigm.similarity_limit 时返回 true

GUC 参数

参数类型默认值说明
pg_bigm.last_updatetext-显示模块最后更新日期(只读)
pg_bigm.enable_recheckboolon控制索引扫描期间是否执行复查
pg_bigm.gin_key_limitint0限制全文搜索使用的最大 bigram 数量,0 表示不限制
pg_bigm.similarity_limitreal0.3设置 =% 运算符的最小相似度阈值

示例

基本全文搜索

-- 创建扩展
CREATE EXTENSION pg_bigm;

-- 创建含文本数据的表
CREATE TABLE documents (id serial PRIMARY KEY, content text);
INSERT INTO documents (content) VALUES
  ('PostgreSQL is a powerful database'),
  ('Full text search with bigram indexing'),
  ('Japanese text: 日本語テキスト検索');

-- 创建 bigram 索引
CREATE INDEX docs_bigm_idx ON documents USING gin (content gin_bigm_ops);

-- 使用 LIKE 搜索
SELECT * FROM documents WHERE content LIKE '%search%';

-- 使用 likequery 函数搜索
SELECT * FROM documents WHERE content LIKE likequery('database');

相似度搜索

-- 显示字符串的 bigram
SELECT show_bigm('PostgreSQL');

-- 相似度搜索
SET pg_bigm.similarity_limit = 0.2;
SELECT * FROM documents WHERE content =% 'database search';

与 pg_trgm 的比较

pg_bigm 相较于内置的 pg_trgm 有以下优势:

特性pg_bigmpg_trgm
N-gram 类型2-gram(bigram)3-gram(trigram)
最小搜索字符串1 个字符3 个字符
非字母语言完全支持有限支持
LIKE 搜索类型前缀、后缀和子串前缀、后缀和子串

更完整的高级用法和性能调优,请参见 pg_bigm 官方文档

58 - zhparser

中文分词,全文搜索解析器

概览

扩展包名版本分类许可证语言
zhparser2.3FTSPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2130zhparser-
相关扩展pg_trgm rum pg_search pgroonga pgroonga_database pg_bigm pg_tokenizer vchord_bm25

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.31817161514zhparser-
RPMPIGSTY2.31817161514zhparser_$v-
DEBPIGSTY2.31817161514postgresql-$v-zhparser-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
d13.x86_64
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
d13.aarch64
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
u22.x86_64
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
u22.aarch64
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
u24.x86_64
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
u24.aarch64
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3
PIGSTY 2.3

构建

您可以使用 pig build 命令构建 zhparser 扩展的 RPM / DEB 包:

pig build pkg zhparser         # 构建 RPM / DEB 包

安装

您可以直接安装 zhparser 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install zhparser;          # 当前活跃 PG 版本安装
pig ext install -y zhparser -v 18  # PG 18
pig ext install -y zhparser -v 17  # PG 17
pig ext install -y zhparser -v 16  # PG 16
pig ext install -y zhparser -v 15  # PG 15
pig ext install -y zhparser -v 14  # PG 14
dnf install -y zhparser_18       # PG 18
dnf install -y zhparser_17       # PG 17
dnf install -y zhparser_16       # PG 16
dnf install -y zhparser_15       # PG 15
dnf install -y zhparser_14       # PG 14
apt install -y postgresql-18-zhparser   # PG 18
apt install -y postgresql-17-zhparser   # PG 17
apt install -y postgresql-16-zhparser   # PG 16
apt install -y postgresql-15-zhparser   # PG 15
apt install -y postgresql-14-zhparser   # PG 14

创建扩展

CREATE EXTENSION zhparser;

用法

GitHub: amutu/zhparser

zhparser 是基于 SCWS(Simple Chinese Word Segmentation)分词库的 PostgreSQL 中文全文搜索扩展。

功能特性

  • 为 PostgreSQL 全文搜索提供中文分词
  • 基于 SCWS(简易中文分词)库
  • 支持自定义词典(TXT 和 XDB 格式)
  • 数据库级自定义词表(v2.1 起)
  • 多个可调参数控制分词行为

快速开始

-- 创建扩展
CREATE EXTENSION zhparser;

-- 创建使用 zhparser 的文本搜索配置
CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser);

-- 添加词类映射
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;

-- 测试中文分词
SELECT to_tsvector('chinese', '小明硕士毕业于中国科学院计算所,后在日本京都大学深造');

-- 创建表和中文全文搜索索引
CREATE TABLE articles (id serial PRIMARY KEY, title text, body text);

CREATE INDEX articles_body_idx ON articles
  USING gin (to_tsvector('chinese', body));

-- 中文全文搜索查询
SELECT * FROM articles
  WHERE to_tsvector('chinese', body) @@ to_tsquery('chinese', '中国');

配置参数

zhparser 提供多个 GUC 参数控制分词行为:

参数默认值说明
zhparser.punctuation_ignoreoff忽略所有标点符号
zhparser.seg_with_dualityoff对长词进行二元分词
zhparser.dict_in_memoryoff将整个词典加载到内存
zhparser.multi_shortoff短词复合分词
zhparser.multi_dualityoff二元复合分词
zhparser.multi_zmainoff首次复合分词中的关键词
zhparser.multi_zalloff使用所有复合分词

词类

zhparser 支持 SCWS 的以下词类:

代码说明
a形容词
b区别词
c连词
d副词
e叹词
f方位词
g词根
h前缀
i成语
j简称
k后缀
l临时习语
m数词
n名词
o拟声词
p介词
q量词
r代词
s处所词
t时间词
u助词
v动词
w标点符号
x未知
y语气词
z状态词

自定义词典

基于文件的词典

将自定义词典文件放在共享目录(通常为 $SHAREDIR/tsearch_data/):

  • TXT 格式:每行一个词
  • XDB 格式:编译后的 SCWS 词典格式

自定义词典优先于内置词典。

数据库级自定义词(v2.1+)

-- 通过 zhparser 内置表添加自定义词
INSERT INTO zhparser.zhprs_custom_word VALUES ('中国科学院计算所');

-- 重新加载自定义词典(同步后需重新连接才能生效)
SELECT sync_zhprs_custom_word();

-- 验证带自定义词的分词结果
SELECT to_tsvector('chinese', '小明硕士毕业于中国科学院计算所');

Docker 快速启动

docker run --name pgzhparser -d \
  -e POSTGRES_PASSWORD=somepassword \
  zhparser/zhparser:bookworm-16

59 - pg_bestmatch

在数据库内生成BM25稀疏向量

概览

扩展包名版本分类许可证语言
pg_bestmatch0.0.2FTSApache-2.0Rust
ID扩展名BinLibLoadCreateTrustReloc模式
2140pg_bestmatchbm_catalog
相关扩展vector pg_search vchord_bm25 vchord vectorscale zhparser pg_tokenizer vectorize

manual updated pgrx by Vonng

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.21817161514pg_bestmatch-
RPMPIGSTY0.0.21817161514pg_bestmatch_$v-
DEBPIGSTY0.0.21817161514postgresql-$v-pg-bestmatch-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
d12.x86_64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
d12.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
d13.x86_64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
d13.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u22.x86_64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u22.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u24.x86_64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u24.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2

构建

您可以使用 pig build 命令构建 pg_bestmatch 扩展的 RPM / DEB 包:

pig build pkg pg_bestmatch         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_bestmatch 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_bestmatch;          # 当前活跃 PG 版本安装
pig ext install -y pg_bestmatch -v 18  # PG 18
pig ext install -y pg_bestmatch -v 17  # PG 17
pig ext install -y pg_bestmatch -v 16  # PG 16
pig ext install -y pg_bestmatch -v 15  # PG 15
pig ext install -y pg_bestmatch -v 14  # PG 14
dnf install -y pg_bestmatch_18       # PG 18
dnf install -y pg_bestmatch_17       # PG 17
dnf install -y pg_bestmatch_16       # PG 16
dnf install -y pg_bestmatch_15       # PG 15
dnf install -y pg_bestmatch_14       # PG 14
apt install -y postgresql-18-pg-bestmatch   # PG 18
apt install -y postgresql-17-pg-bestmatch   # PG 17
apt install -y postgresql-16-pg-bestmatch   # PG 16
apt install -y postgresql-15-pg-bestmatch   # PG 15
apt install -y postgresql-14-pg-bestmatch   # PG 14

预加载配置

shared_preload_libraries = 'pg_bestmatch';

创建扩展

CREATE EXTENSION pg_bestmatch;

用法

  • 仓库:https://github.com/tensorchord/pg_bestmatch.rs
  • 基准测试:https://hazyresearch.stanford.edu/blog/2024-05-20-m2-bert-retrieval

工作原理

  • 通过 bm25_create(table_name, column_name, statistic_name); 基于文档集创建 BM25 统计信息,该操作会创建一个物化视图来记录统计数据。
  • 使用 bm25_document_to_svector(statistic_name, passage) 生成文档的稀疏向量
  • 查询时,使用 bm25_query_to_svector(statistic_name, query) 生成查询的稀疏向量
  • 通过查询稀疏向量与文档稀疏向量的点积计算相关性得分
  • 目前使用 HuggingFace 分词器和 bert-base-uncased 词汇表来进行分词。未来可能会支持更多分词器配置选项。

安装

CREATE EXTENSION pg_bestmatch;
SET search_path TO public, bm_catalog;

示例

以下是一个使用 Stanford LoCo 基准测试 数据集演示本扩展用法的完整工作流。

  1. 加载数据集。如果您想使用该数据集体验 pg_bestmatch,可以使用以下脚本。
wget https://huggingface.co/api/datasets/hazyresearch/LoCoV1-Documents/parquet/default/test/0.parquet -O documents.parquet
wget https://huggingface.co/api/datasets/hazyresearch/LoCoV1-Queries/parquet/default/test/0.parquet -O queries.parquet
import pandas as pd
from sqlalchemy import create_engine
import numpy as np
from psycopg2.extensions import register_adapter, AsIs

def adapter_numpy_float64(numpy_float64):
    return AsIs(numpy_float64)

def adapter_numpy_int64(numpy_int64):
    return AsIs(numpy_int64)

def adapter_numpy_float32(numpy_float32):
    return AsIs(numpy_float32)

def adapter_numpy_int32(numpy_int32):
    return AsIs(numpy_int32)

def adapter_numpy_array(numpy_array):
    return AsIs(tuple(numpy_array))

register_adapter(np.float64, adapter_numpy_float64)
register_adapter(np.int64, adapter_numpy_int64)
register_adapter(np.float32, adapter_numpy_float32)
register_adapter(np.int32, adapter_numpy_int32)
register_adapter(np.ndarray, adapter_numpy_array)

db_url = "postgresql://localhost:5432/pg_bestmatch_test"
engine = create_engine(db_url)

def load_documents():
    df = pd.read_parquet("documents.parquet")
    df.to_sql("documents", engine, if_exists='replace', index=False)

def load_queries():
    df = pd.read_parquet("queries.parquet")
    df['answer_pids'] = df['answer_pids'].apply(lambda x: str(x[0]))
    df.to_sql("queries", engine, if_exists='replace', index=False)

load_documents()
load_queries()
  1. documents 表创建 BM25 统计信息。
SELECT bm25_create('documents', 'passage', 'documents_passage_bm25', 0.75, 1.2);
  1. documentsqueries 表中添加向量列,并更新文档和查询的向量表示。
ALTER TABLE documents ADD COLUMN embedding svector; -- pgvecto.rs 用户
ALTER TABLE documents ADD COLUMN embedding sparsevec; -- pgvector 用户

UPDATE documents SET embedding = bm25_document_to_svector('documents_passage_bm25', passage)::svector; -- pgvecto.rs 用户
UPDATE documents SET embedding = bm25_document_to_svector('documents_passage_bm25', passage, 'pgvector')::sparsevec; -- pgvector 用户
  1. (可选)在稀疏向量列上创建向量索引。
CREATE INDEX ON documents USING vectors (embedding svector_dot_ops); -- pgvecto.rs 用户
CREATE INDEX ON documents USING ivfflat (embedding sparsevec_ip_ops); -- pgvector 用户
  1. 执行向量搜索,为每个查询找到最相关的文档。
ALTER TABLE queries ADD COLUMN embedding svector; -- pgvecto.rs 用户
ALTER TABLE queries ADD COLUMN embedding sparsevec; -- pgvector 用户

UPDATE queries SET embedding = bm25_query_to_svector('documents_passage_bm25', query)::svector; -- pgvecto.rs 用户
UPDATE queries SET embedding = bm25_query_to_svector('documents_passage_bm25', query, 'pgvector')::sparsevec; -- pgvector 用户

SELECT sum((array[answer_pids] = array(SELECT pid FROM documents WHERE queries.dataset = documents.dataset ORDER BY queries.embedding <#> documents.embedding LIMIT 1))::int) FROM queries;

此工作流展示了如何利用本扩展在 PostgreSQL 中结合 BM25 文本查询与向量搜索。BM25 在该数据集上的 Top 1 召回率为 0.77。如果您能复现该结果,说明操作正确。


与 pg_search 的比较

  • pg_bestmatch.rs 仅提供生成稀疏向量的方法,不支持基于索引的搜索(可通过 pgvecto.rs 或 pgvector 实现)。
  • pg_search 通过外部 tantivy 引擎执行 BM25 检索,在与事务、过滤器或 JOIN 操作结合使用时可能存在限制。由于 pg_bestmatch.rs 完全原生于 PostgreSQL,因此在 PostgreSQL 内部与这些操作具有完全的兼容性。

函数参考

  • tokenize
    • 说明:将输入字符串分词为独立的词元。
    • 示例:
      SELECT tokenize('i have an apple'); -- 结果:{i,have,an,apple}
      
  • bm25_create
    • 说明:为指定的表和列创建 BM25 统计信息。
    • 用法:
      SELECT bm25_create('documents', 'passage', 'documents_passage_bm25');
      
    • 参数:
      • table_name:表名。
      • column_name:列名。
      • stat_name:BM25 统计信息名称。
      • b:BM25 参数(默认值 0.75)。
      • k:BM25 参数(默认值 1.2)。
  • bm25_refresh
    • 说明:更新 BM25 统计信息以反映底层数据的变化。
    • 用法:
      SELECT bm25_refresh('documents_passage_bm25');
      
    • 参数:
      • stat_name:要更新的 BM25 统计信息名称。
  • bm25_drop
    • 说明:删除指定表和列的 BM25 统计信息。
    • 用法:
      SELECT bm25_drop('documents_passage_bm25');
      
    • 参数:
      • stat_name:要删除的 BM25 统计信息名称。
  • bm25_document_to_svector
    • 说明:将文档文本转换为稀疏向量表示。
    • 用法:
      SELECT bm25_document_to_svector('documents_passage_bm25', 'document_text');
      
    • 参数:
      • stat_name:BM25 统计信息名称。
      • document_text:文档文本内容。
      • style:输出 pgvecto.rs 风格或 pgvector 风格的稀疏向量。
  • bm25_query_to_svector
    • 说明:将查询文本转换为稀疏向量表示。
    • 用法:
      SELECT bm25_query_to_svector('documents_passage_bm25', 'We begin, as always, with the text.');
      
    • 参数:
      • stat_name:BM25 统计信息名称。
      • query_text:查询文本内容。
      • style:输出 pgvecto.rs 风格或 pgvector 风格的稀疏向量。

60 - vchord_bm25

BM25排序算法

概览

扩展包名版本分类许可证语言
vchord_bm250.3.0FTSAGPL-3.0Rust
ID扩展名BinLibLoadCreateTrustReloc模式
2150vchord_bm25bm25_catalog
相关扩展vector vchord pg_search pg_bestmatch vectorscale zhparser pg_tokenizer pgroonga

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.3.01817161514vchord_bm25-
RPMPIGSTY0.3.01817161514vchord_bm25_$v-
DEBPIGSTY0.3.01817161514postgresql-$v-vchord-bm25-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
d13.aarch64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
u22.x86_64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
u22.aarch64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
u24.x86_64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
u24.aarch64
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0
PIGSTY 0.3.0

构建

您可以使用 pig build 命令构建 vchord_bm25 扩展的 RPM / DEB 包:

pig build pkg vchord_bm25         # 构建 RPM / DEB 包

安装

您可以直接安装 vchord_bm25 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install vchord_bm25;          # 当前活跃 PG 版本安装
pig ext install -y vchord_bm25 -v 18  # PG 18
pig ext install -y vchord_bm25 -v 17  # PG 17
pig ext install -y vchord_bm25 -v 16  # PG 16
pig ext install -y vchord_bm25 -v 15  # PG 15
pig ext install -y vchord_bm25 -v 14  # PG 14
dnf install -y vchord_bm25_18       # PG 18
dnf install -y vchord_bm25_17       # PG 17
dnf install -y vchord_bm25_16       # PG 16
dnf install -y vchord_bm25_15       # PG 15
dnf install -y vchord_bm25_14       # PG 14
apt install -y postgresql-18-vchord-bm25   # PG 18
apt install -y postgresql-17-vchord-bm25   # PG 17
apt install -y postgresql-16-vchord-bm25   # PG 16
apt install -y postgresql-15-vchord-bm25   # PG 15
apt install -y postgresql-14-vchord-bm25   # PG 14

预加载配置

shared_preload_libraries = 'vchord_bm25';

创建扩展

CREATE EXTENSION vchord_bm25;

用法

GitHub: tensorchord/VectorChord-bm25

VectorChord-BM25 是一个实现 BM25 排序算法的 PostgreSQL 扩展,基于 Block-WeakAnd 算法。它设计与 pg_tokenizer 配合使用,支持自定义文本分词。

架构

该扩展由三个主要组件组成:

  1. 分词器:将文本转换为 bm25vector(存储词汇 ID 和词频的稀疏向量)
  2. bm25vector:用于存储分词后文本的自定义数据类型
  3. bm25vector 索引:加速搜索和排序操作

快速开始

-- 启用所需扩展
CREATE EXTENSION IF NOT EXISTS pg_tokenizer CASCADE;
CREATE EXTENSION IF NOT EXISTS vchord_bm25 CASCADE;

-- 创建分词器(如用于英文的 LLMLingua2)
SELECT create_tokenizer('tokenizer1', $$
model = "llmlingua2"
$$);

-- 创建包含文本内容的表
CREATE TABLE documents (
  id SERIAL PRIMARY KEY,
  passage TEXT,
  embedding bm25vector
);

-- 将文本段落分词为 bm25vector
UPDATE documents SET embedding = tokenize(passage, 'tokenizer1');

-- 创建 BM25 索引
CREATE INDEX documents_embedding_bm25 ON documents USING bm25 (embedding bm25_ops);

-- 使用 BM25 排序查询
SELECT id, passage, embedding <&> to_bm25query('documents_embedding_bm25', tokenize('search query', 'tokenizer1')) AS score
FROM documents
ORDER BY score
LIMIT 10;

注意:VectorChord-BM25 中的 BM25 分数为负数,越负表示相关性越高。

<&> 运算符

<&> 运算符计算存储的 bm25vector 与查询 bm25vector 之间的 BM25 相关性分数。查询必须用 to_bm25query() 包装,它接受索引名称和分词后的查询:

-- 基本搜索查询
-- to_bm25query(索引名称, 分词后的查询)
SELECT id, passage, embedding <&> to_bm25query('documents_embedding_bm25', tokenize('database system', 'tokenizer1')) AS score
FROM documents
ORDER BY score
LIMIT 10;

语言支持

VectorChord-BM25 通过不同的分词器配置支持多种语言:

语言方式模型/预分词器
英语预训练模型model = "llmlingua2"model = "bert_base_uncased"
中文带结巴预分词器的自定义模型[pre_tokenizer.jieba]
日语带 Lindera 预分词器的自定义模型Lindera + IPADIC 词典
自定义通过文本分析器训练的用户模型create_custom_model_tokenizer_and_trigger()

中文文本搜索示例

中文文本需要带结巴预分词器的自定义模型(而非预训练模型):

-- 创建带结巴预分词器的文本分析器
SELECT create_text_analyzer('zh_text_analyzer', $$
[pre_tokenizer.jieba]
$$);

-- 创建在语料上训练的自定义模型分词器
SELECT create_custom_model_tokenizer_and_trigger(
    tokenizer_name => 'zh_tokenizer',
    model_name => 'zh_model',
    text_analyzer_name => 'zh_text_analyzer',
    table_name => 'documents',
    source_column => 'passage',
    target_column => 'embedding'
);

自定义分词器模型

对于领域特定术语,你可以创建带停用词、词干提取和其他过滤器的文本分析器,然后使用 create_custom_model_tokenizer_and_trigger() 在语料上训练自定义模型。

与替代方案的比较

特性VectorChord-BM25PostgreSQL tsvector + ts_rank
排序算法BM25tf-idf 变体
自定义分词器支持(通过 pg_tokenizer)仅限内置配置
索引类型专用 BM25 索引GIN 索引
原生 PostgreSQL是(扩展)内置
语言支持通过模型可扩展通过文本搜索配置

61 - pg_tokenizer

用于全文检索的分词器

概览

扩展包名版本分类许可证语言
pg_tokenizer0.1.1FTSApache-2.0Rust
ID扩展名BinLibLoadCreateTrustReloc模式
2160pg_tokenizertokenizer_catalog
相关扩展pg_search pgroonga pg_bigm zhparser pgroonga_database pg_bestmatch vchord_bm25 pg_trgm

PG18 fix by Vonng

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.1.11817161514pg_tokenizer-
RPMPIGSTY0.1.11817161514pg_tokenizer_$v-
DEBPIGSTY0.1.11817161514postgresql-$v-pg-tokenizer-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
d12.aarch64
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
d13.x86_64
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
d13.aarch64
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
u22.x86_64
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
u22.aarch64
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
u24.x86_64
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
u24.aarch64
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1
PIGSTY 0.1.1

构建

您可以使用 pig build 命令构建 pg_tokenizer 扩展的 RPM / DEB 包:

pig build pkg pg_tokenizer         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_tokenizer 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_tokenizer;          # 当前活跃 PG 版本安装
pig ext install -y pg_tokenizer -v 18  # PG 18
pig ext install -y pg_tokenizer -v 17  # PG 17
pig ext install -y pg_tokenizer -v 16  # PG 16
pig ext install -y pg_tokenizer -v 15  # PG 15
pig ext install -y pg_tokenizer -v 14  # PG 14
dnf install -y pg_tokenizer_18       # PG 18
dnf install -y pg_tokenizer_17       # PG 17
dnf install -y pg_tokenizer_16       # PG 16
dnf install -y pg_tokenizer_15       # PG 15
dnf install -y pg_tokenizer_14       # PG 14
apt install -y postgresql-18-pg-tokenizer   # PG 18
apt install -y postgresql-17-pg-tokenizer   # PG 17
apt install -y postgresql-16-pg-tokenizer   # PG 16
apt install -y postgresql-15-pg-tokenizer   # PG 15
apt install -y postgresql-14-pg-tokenizer   # PG 14

预加载配置

shared_preload_libraries = 'pg_tokenizer';

创建扩展

CREATE EXTENSION pg_tokenizer;

用法

GitHub: tensorchord/pg_tokenizer.rs

pg_tokenizer 是一个为全文搜索提供分词器的 PostgreSQL 扩展。它设计与 VectorChord-bm25 配合使用,提供原生 BM25 排序索引支持。

快速开始

CREATE EXTENSION pg_tokenizer;

-- 使用 LLMLingua2 模型创建分词器
SELECT create_tokenizer('tokenizer1', $$
model = "llmlingua2"
$$);

-- 分词文本
SELECT tokenize('PostgreSQL is a powerful, open-source object-relational database system. It has over 15 years of active development.', 'tokenizer1');

分词器模型

pg_tokenizer 支持多种分词器模型,适用于不同语言和场景:

模型语言说明
llmlingua2英语基于 BERT 的 LLMLingua2 分词器
jieba中文结巴中文分词
lindera/ipadic日语带 IPADIC 词典的 Lindera 分词器
自定义模型任意用户训练的领域特定文本模型

创建分词器

-- 英文分词器
SELECT create_tokenizer('en_tokenizer', $$
model = "llmlingua2"
$$);

-- 中文分词器
SELECT create_tokenizer('zh_tokenizer', $$
model = "jieba"
$$);

-- 日文分词器
SELECT create_tokenizer('ja_tokenizer', $$
model = "lindera/ipadic"
$$);

文本分词

-- 分词英文文本
SELECT tokenize('full text search in PostgreSQL', 'en_tokenizer');

-- 分词中文文本
SELECT tokenize('PostgreSQL是一个强大的数据库系统', 'zh_tokenizer');

文本分析器

pg_tokenizer 还提供文本分析器功能,将分词与额外的文本处理步骤结合。详细的文本分析器用法请参见文本分析器文档

与 VectorChord-BM25 集成

pg_tokenizer 通常与 VectorChord-BM25 配合使用以获得完整的 BM25 排序支持:

CREATE EXTENSION IF NOT EXISTS pg_tokenizer CASCADE;
CREATE EXTENSION IF NOT EXISTS vchord_bm25 CASCADE;

-- 创建分词器
SELECT create_tokenizer('my_tokenizer', $$
model = "llmlingua2"
$$);

-- 将文本分词为 bm25vector 用于索引和搜索
SELECT tokenize('your search query', 'my_tokenizer');

文档

更多详情请参见完整文档:

62 - biscuit

使用IAM的高性能文本模式匹配

概览

扩展包名版本分类许可证语言
pg_biscuit2.2.2FTSMITC
ID扩展名BinLibLoadCreateTrustReloc模式
2170biscuitpublic
相关扩展plpgsql hll rum pg_textsearch

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.2.21817161514pg_biscuitplpgsql
RPMPIGSTY2.2.21817161514pg_biscuit_$v-
DEBPIGSTY2.2.21817161514postgresql-$v-biscuit-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY MISSPIGSTY MISS
el8.aarch64PIGSTY MISSPIGSTY MISS
el9.x86_64PIGSTY MISSPIGSTY MISS
el9.aarch64PIGSTY MISSPIGSTY MISS
el10.x86_64PIGSTY MISSPIGSTY MISS
el10.aarch64PIGSTY MISSPIGSTY MISS
d12.x86_64PIGSTY MISSPIGSTY MISS
d12.aarch64PIGSTY MISSPIGSTY MISS
d13.x86_64PIGSTY MISSPIGSTY MISS
d13.aarch64PIGSTY MISSPIGSTY MISS
u22.x86_64PIGSTY MISSPIGSTY MISS
u22.aarch64
PIGSTY 2.2.2
PIGSTY 2.2.2
PIGSTY 2.2.2
PIGSTY MISSPIGSTY MISS
u24.x86_64PIGSTY MISSPIGSTY MISS
u24.aarch64
PIGSTY 2.2.2
PIGSTY 2.2.2
PIGSTY 2.2.2
PIGSTY MISSPIGSTY MISS

构建

您可以使用 pig build 命令构建 pg_biscuit 扩展的 RPM / DEB 包:

pig build pkg pg_biscuit         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_biscuit 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_biscuit;          # 当前活跃 PG 版本安装
pig ext install -y pg_biscuit -v 18  # PG 18
pig ext install -y pg_biscuit -v 17  # PG 17
pig ext install -y pg_biscuit -v 16  # PG 16
dnf install -y pg_biscuit_18       # PG 18
dnf install -y pg_biscuit_17       # PG 17
dnf install -y pg_biscuit_16       # PG 16
apt install -y postgresql-18-biscuit   # PG 18
apt install -y postgresql-17-biscuit   # PG 17
apt install -y postgresql-16-biscuit   # PG 16

创建扩展

CREATE EXTENSION biscuit CASCADE;  -- 依赖: plpgsql

用法

README | Docs

biscuit 是 PostgreSQL 的一种索引访问方法,专为 LIKEILIKE 模式匹配优化,也支持多列检索。上游将其定位为一种确定性的位图索引,可避免基于 trigram 的搜索常见的误命中复查开销。

快速上手

创建扩展,并在一个或多个文本列上建立 Biscuit 索引:

CREATE EXTENSION biscuit;

CREATE INDEX idx_users_name ON users USING biscuit(name);

CREATE INDEX idx_products_search
ON products USING biscuit(name, description, category);

带通配符的常见查询同样可以使用该索引:

SELECT * FROM users WHERE name LIKE '%john%';
SELECT * FROM users WHERE name NOT LIKE 'a%b%c';
SELECT COUNT(*) FROM users WHERE name LIKE '%test%';

SELECT *
FROM products
WHERE name LIKE '%widget%'
  AND description LIKE '%blue%'
  AND category LIKE 'electronics%'
LIMIT 10;

索引行为

Biscuit 为每个字符串维护位图位置索引,能够同时匹配正向和反向字符位置。上游设计强调:

  • 正向索引,用于匹配字符在精确位置上的出现
  • 反向索引,用于按字符串末尾倒数位置匹配字符
  • ILIKE 的大小写不敏感变体
  • 用于快速长度过滤的精确长度位图和最小长度位图

对于 LIKE 'abc%def' 这类模式,Biscuit 可以把前缀位图、后缀位图以及最小长度过滤合并起来,从而在不执行 heap 复查的情况下得到精确结果。

模式类型

上游文档对常见模式给出了优化路径:

  • 精确匹配,例如 'abc'
  • 前缀匹配,例如 'abc%'
  • 后缀匹配,例如 '%xyz'
  • 子串匹配,例如 '%abc%'
  • 多列谓词,Biscuit 会按估计选择性重排谓词顺序

性能说明

上游 README 强调了纯位图求值及多项执行优化,包括:

  • 中间位图为空时提前结束
  • 对稀疏和稠密数据直接使用 roaring bitmap
  • 后缀谓词使用反向位置查找
  • 对 TID 做排序,以提高 heap 访问局部性
  • 对聚合查询和 LIMIT 的特殊处理

项目 README 还给出了一个 100 万行测试表的基准方案,用来比较 Biscuit 索引与 trigram 方案。

需求

当前上游 README 列出的源码构建要求包括:

  • PostgreSQL 16 或更高版本
  • 标准构建工具,如 gccmakepg_config
  • 可选的 CRoaring,用于提升性能

该项目通过 PGXN 发布包,并在 Read the Docs 上维护独立文档站。

63 - pg_textsearch

带有BM25排序的全文搜索扩展

概览

扩展包名版本分类许可证语言
pg_textsearch1.0.0FTSPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2180pg_textsearch-
相关扩展pg_search pgroonga pg_bigm zhparser pg_trgm rum biscuit fuzzystrmatch

bm25 am conflicts with pg_search; must be preloaded via shared_preload_libraries.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.0.01817161514pg_textsearch-
RPMPIGSTY1.0.01817161514pg_textsearch_$v-
DEBPIGSTY1.0.01817161514postgresql-$v-textsearch-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISS
el8.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISS
el9.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISS
el9.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISS
el10.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISS
el10.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISS
d12.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISS
d12.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISS
d13.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISS
d13.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY MISSPIGSTY MISSPIGSTY MISS
u22.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY MISSPIGSTY MISSPIGSTY MISS
u22.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY MISSPIGSTY MISSPIGSTY MISS
u24.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY MISSPIGSTY MISSPIGSTY MISS
u24.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY MISSPIGSTY MISSPIGSTY MISS

构建

您可以使用 pig build 命令构建 pg_textsearch 扩展的 RPM / DEB 包:

pig build pkg pg_textsearch         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_textsearch 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_textsearch;          # 当前活跃 PG 版本安装
pig ext install -y pg_textsearch -v 18  # PG 18
pig ext install -y pg_textsearch -v 17  # PG 17
dnf install -y pg_textsearch_18       # PG 18
dnf install -y pg_textsearch_17       # PG 17
apt install -y postgresql-18-textsearch   # PG 18
apt install -y postgresql-17-textsearch   # PG 17

预加载配置

shared_preload_libraries = 'pg_textsearch';

创建扩展

CREATE EXTENSION pg_textsearch;

用法

pg_textsearch: 使用 BM25 的 PostgreSQL 现代排序文本搜索

pg_textsearch 提供基于 BM25 评分并结合 Block-Max WAND 优化的现代排序文本搜索。它语法简洁,支持快速 top-k 查询、并行索引构建以及分区表。

添加到 shared_preload_libraries

shared_preload_libraries = 'pg_textsearch'
CREATE EXTENSION pg_textsearch;

快速开始

CREATE TABLE documents (id bigserial PRIMARY KEY, content text);
INSERT INTO documents (content) VALUES
    ('PostgreSQL is a powerful database system'),
    ('BM25 is an effective ranking function'),
    ('Full text search with custom scoring');

-- 创建 BM25 索引
CREATE INDEX docs_idx ON documents USING bm25(content) WITH (text_config='english');

-- 使用 <@> 运算符查询(返回负 BM25 分数,分数越低匹配越好)
SELECT * FROM documents
ORDER BY content <@> 'database system'
LIMIT 5;

查询

-- 从列自动检测索引
SELECT * FROM documents
ORDER BY content <@> 'database system'
LIMIT 5;

-- 显式指定索引
SELECT * FROM documents
WHERE content <@> to_bm25query('database system', 'docs_idx') < -1.0;

过滤

前置过滤会在评分前缩减行数,适合选择性强的过滤条件:

CREATE INDEX ON documents (category_id);
SELECT * FROM documents
WHERE category_id = 123
ORDER BY content <@> 'search terms'
LIMIT 10;

后置过滤会先执行 BM25 扫描,再应用过滤条件:

SELECT * FROM documents
WHERE content <@> to_bm25query('search terms', 'docs_idx') < -5.0
ORDER BY content <@> 'search terms'
LIMIT 10;

索引选项

选项默认值说明
text_config(必需)PostgreSQL 文本搜索配置
k11.2词频饱和参数
b0.75长度归一化参数
CREATE INDEX ON documents USING bm25(content)
  WITH (text_config='english', k1=1.5, b=0.8);

-- 语言专用配置
CREATE INDEX ON french_docs USING bm25(content) WITH (text_config='french');
CREATE INDEX ON german_docs USING bm25(content) WITH (text_config='german');

数据类型

bm25query - 表示 BM25 评分查询:

SELECT to_bm25query('search query text', 'docs_idx');
-- docs_idx:search query text

64 - pg_pinyin

PostgreSQL 拼音转写与检索辅助扩展

概览

扩展包名版本分类许可证语言
pg_pinyin0.0.2FTSMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
2190pg_pinyinpinyin
相关扩展zhparser pg_search pg_trgm pg_bigm pgroonga pgroonga_database pg_tokenizer fuzzystrmatch

pgrx 0.17.0; optional tokenizer-input overload can integrate with pg_search

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.21817161514pg_pinyin-
RPMPIGSTY0.0.21817161514pg_pinyin_$v-
DEBPIGSTY0.0.21817161514postgresql-$v-pinyin-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u22.x86_64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u22.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u24.x86_64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
u24.aarch64
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2
PIGSTY 0.0.2

构建

您可以使用 pig build 命令构建 pg_pinyin 扩展的 RPM / DEB 包:

pig build pkg pg_pinyin         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_pinyin 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_pinyin;          # 当前活跃 PG 版本安装
pig ext install -y pg_pinyin -v 18  # PG 18
pig ext install -y pg_pinyin -v 17  # PG 17
pig ext install -y pg_pinyin -v 16  # PG 16
pig ext install -y pg_pinyin -v 15  # PG 15
pig ext install -y pg_pinyin -v 14  # PG 14
dnf install -y pg_pinyin_18       # PG 18
dnf install -y pg_pinyin_17       # PG 17
dnf install -y pg_pinyin_16       # PG 16
dnf install -y pg_pinyin_15       # PG 15
dnf install -y pg_pinyin_14       # PG 14
apt install -y postgresql-18-pinyin   # PG 18
apt install -y postgresql-17-pinyin   # PG 17
apt install -y postgresql-16-pinyin   # PG 16
apt install -y postgresql-15-pinyin   # PG 15
apt install -y postgresql-14-pinyin   # PG 14

创建扩展

CREATE EXTENSION pg_pinyin;

用法

pg_pinyin: PostgreSQL 的拼音转换与搜索辅助

将中文字符转换为拼音罗马化,用于搜索和索引。可与 pg_trgm 配合实现模糊拼音搜索,或与 pg_search 配合实现基于词的搜索。

CREATE EXTENSION pg_pinyin;

函数

函数说明
pinyin_char_romanize(text)字符级拼音罗马化
pinyin_char_romanize(text, suffix)使用自定义词典后缀
pinyin_word_romanize(text)词级拼音罗马化
pinyin_word_romanize(text, suffix)使用自定义词典后缀

生成列 + Trigram 搜索

CREATE EXTENSION IF NOT EXISTS pg_pinyin;
CREATE EXTENSION IF NOT EXISTS pg_trgm;

CREATE TABLE voice (
  id bigserial PRIMARY KEY,
  description text NOT NULL,
  pinyin text GENERATED ALWAYS AS (public.pinyin_char_romanize(description)) STORED
);

CREATE INDEX voice_pinyin_trgm_idx ON voice USING gin (pinyin gin_trgm_ops);

INSERT INTO voice (description) VALUES ('郑爽ABC');
SELECT id, description, pinyin FROM voice;

自定义词典

pinyin schema 中提供带后缀的自定义词典表:

CREATE TABLE IF NOT EXISTS pinyin.pinyin_mapping_suffix1 (
  character text PRIMARY KEY,
  pinyin text NOT NULL
);

CREATE TABLE IF NOT EXISTS pinyin.pinyin_words_suffix1 (
  word text PRIMARY KEY,
  pinyin text NOT NULL
);

INSERT INTO pinyin.pinyin_mapping_suffix1 (character, pinyin)
VALUES ('郑', '|zhengx|')
ON CONFLICT (character) DO UPDATE SET pinyin = EXCLUDED.pinyin;

-- 使用自定义词典
SELECT public.pinyin_char_romanize('郑爽ABC', '_suffix1');

65 - pg_kazsearch

PostgreSQL 哈萨克语全文检索扩展

概览

扩展包名版本分类许可证语言
pg_kazsearch0.1.0FTSLGPL-3.0Rust
ID扩展名BinLibLoadCreateTrustReloc模式
2200pg_kazsearch-

Upstream release/package version is 2.0.0; extension control version is 0.1.0.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.1.01817161514pg_kazsearch-
RPMPIGSTY2.0.01817161514pg_kazsearch_$v-
DEBPIGSTY2.0.01817161514postgresql-$v-pg-kazsearch-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY MISSPIGSTY MISS
el8.aarch64PIGSTY MISSPIGSTY MISS
el9.x86_64PIGSTY MISSPIGSTY MISS
el9.aarch64PIGSTY MISSPIGSTY MISS
el10.x86_64PIGSTY MISSPIGSTY MISS
el10.aarch64PIGSTY MISSPIGSTY MISS
d12.x86_64PIGSTY MISSPIGSTY MISS
d12.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY MISSPIGSTY MISS
d13.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY MISSPIGSTY MISS
d13.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY MISSPIGSTY MISS
u22.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY MISSPIGSTY MISS
u22.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY MISSPIGSTY MISS
u24.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY MISSPIGSTY MISS
u24.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY MISSPIGSTY MISS

构建

您可以使用 pig build 命令构建 pg_kazsearch 扩展的 RPM / DEB 包:

pig build pkg pg_kazsearch         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_kazsearch 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_kazsearch;          # 当前活跃 PG 版本安装
pig ext install -y pg_kazsearch -v 18  # PG 18
pig ext install -y pg_kazsearch -v 17  # PG 17
pig ext install -y pg_kazsearch -v 16  # PG 16
dnf install -y pg_kazsearch_18       # PG 18
dnf install -y pg_kazsearch_17       # PG 17
dnf install -y pg_kazsearch_16       # PG 16
apt install -y postgresql-18-pg-kazsearch   # PG 18
apt install -y postgresql-17-pg-kazsearch   # PG 17
apt install -y postgresql-16-pg-kazsearch   # PG 16

创建扩展

CREATE EXTENSION pg_kazsearch;

用法

来源: README项目仓库

pg_kazsearch 是一个面向哈萨克语的 PostgreSQL 全文检索扩展。 上游 README 将其描述为使用 pgrx 构建的 Rust 扩展,它接入 PostgreSQL 的文本检索流水线。

它会创建一个可直接使用的配置 kazakh_cfg,以及配套词典 pg_kazsearch_dict

快速开始

CREATE EXTENSION pg_kazsearch;

SELECT to_tsvector('kazakh_cfg', 'президенттің жарлығы');
-- 'жарлық':2 'президент':1

SELECT ts_lexize('pg_kazsearch_dict', 'алмаларымыздағы');
-- {алма}

使用场景

README 展示了以下典型用法:

  • 对单个哈萨克语词语做词干提取
  • 使用 to_tsvector('kazakh_cfg', ...) 构建 tsvector
  • 为表添加生成列类型的 tsvector
  • 用 GIN 索引这些列
  • 使用 websearch_to_tsquery('kazakh_cfg', ...) 进行检索

示例表工作流:

ALTER TABLE articles ADD COLUMN fts tsvector
    GENERATED ALWAYS AS (
        setweight(to_tsvector('kazakh_cfg', title), 'A') ||
        setweight(to_tsvector('kazakh_cfg', body), 'B')
    ) STORED;

CREATE INDEX idx_fts ON articles USING GIN (fts);

SELECT title FROM articles
WHERE fts @@ websearch_to_tsquery('kazakh_cfg', 'президенттің жарлығы')
ORDER BY ts_rank_cd(fts, websearch_to_tsquery('kazakh_cfg', 'президенттің жарлығы')) DESC
LIMIT 10;

调优

可以在运行时调整惩罚权重:

ALTER TEXT SEARCH DICTIONARY pg_kazsearch_dict (w_deriv = 3.5, w_short_char = 100.0);

部署

README 列出了三种支持的安装路径:

  • 预编译的 Debian/Ubuntu 软件包
  • 基于 ghcr.io/darkhanakh/pg-kazsearch 的 Docker 镜像
  • 使用 cargo pgrx install 从源码构建

本项目的仓库元数据对应 PostgreSQL 16-18。

66 - hunspell_cs_cz

Hunspell捷克语全文检索词典

概览

扩展包名版本分类许可证语言
hunspell_cs_cz1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2270hunspell_cs_cz-
相关扩展hunspell_de_de hunspell_en_us hunspell_fr hunspell_nl_nl hunspell_ne_np hunspell_nn_no hunspell_pt_pt hunspell_ru_ru

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_cs_cz-
RPMPIGSTY1.01817161514hunspell_cs_cz_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-cs-cz-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_cs_cz 扩展的 RPM / DEB 包:

pig build pkg hunspell_cs_cz         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_cs_cz 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_cs_cz;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_cs_cz -v 18  # PG 18
pig ext install -y hunspell_cs_cz -v 17  # PG 17
pig ext install -y hunspell_cs_cz -v 16  # PG 16
pig ext install -y hunspell_cs_cz -v 15  # PG 15
pig ext install -y hunspell_cs_cz -v 14  # PG 14
dnf install -y hunspell_cs_cz_18       # PG 18
dnf install -y hunspell_cs_cz_17       # PG 17
dnf install -y hunspell_cs_cz_16       # PG 16
dnf install -y hunspell_cs_cz_15       # PG 15
dnf install -y hunspell_cs_cz_14       # PG 14
apt install -y postgresql-18-hunspell-cs-cz   # PG 18
apt install -y postgresql-17-hunspell-cs-cz   # PG 17
apt install -y postgresql-16-hunspell-cs-cz   # PG 16
apt install -y postgresql-15-hunspell-cs-cz   # PG 15
apt install -y postgresql-14-hunspell-cs-cz   # PG 14

创建扩展

CREATE EXTENSION hunspell_cs_cz;

用法

hunspell_cs_cz: PostgreSQL 的捷克语 Hunspell 词典

用于 PostgreSQL 全文搜索的捷克语 Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_cs_cz;

SELECT ts_lexize('czech_hunspell', 'příběhy');

SELECT to_tsvector('czech_hunspell', 'příběhy');

该扩展提供 czech_hunspell 词典和文本搜索配置。

67 - hunspell_de_de

Hunspell德语全文检索词典

概览

扩展包名版本分类许可证语言
hunspell_de_de1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2271hunspell_de_de-
相关扩展hunspell_cs_cz hunspell_en_us hunspell_fr hunspell_nl_nl hunspell_ne_np hunspell_nn_no hunspell_pt_pt hunspell_ru_ru

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_de_de-
RPMPIGSTY1.01817161514hunspell_de_de_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-de-de-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
el8.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_de_de 扩展的 RPM / DEB 包:

pig build pkg hunspell_de_de         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_de_de 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_de_de;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_de_de -v 18  # PG 18
pig ext install -y hunspell_de_de -v 17  # PG 17
pig ext install -y hunspell_de_de -v 16  # PG 16
pig ext install -y hunspell_de_de -v 15  # PG 15
pig ext install -y hunspell_de_de -v 14  # PG 14
dnf install -y hunspell_de_de_18       # PG 18
dnf install -y hunspell_de_de_17       # PG 17
dnf install -y hunspell_de_de_16       # PG 16
dnf install -y hunspell_de_de_15       # PG 15
dnf install -y hunspell_de_de_14       # PG 14
apt install -y postgresql-18-hunspell-de-de   # PG 18
apt install -y postgresql-17-hunspell-de-de   # PG 17
apt install -y postgresql-16-hunspell-de-de   # PG 16
apt install -y postgresql-15-hunspell-de-de   # PG 15
apt install -y postgresql-14-hunspell-de-de   # PG 14

创建扩展

CREATE EXTENSION hunspell_de_de;

用法

hunspell_de_de: PostgreSQL 的德语 Hunspell 词典

用于 PostgreSQL 全文搜索的德语 Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_de_de;

SELECT ts_lexize('german_hunspell', 'Geschichten');

SELECT to_tsvector('german_hunspell', 'Geschichten');

该扩展提供 german_hunspell 词典和文本搜索配置。

68 - hunspell_en_us

Hunspell英语全文检索词典

概览

扩展包名版本分类许可证语言
hunspell_en_us1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2272hunspell_en_us-
相关扩展hunspell_cs_cz hunspell_de_de hunspell_fr hunspell_nl_nl hunspell_ne_np hunspell_nn_no hunspell_pt_pt hunspell_ru_ru

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_en_us-
RPMPIGSTY1.01817161514hunspell_en_us_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-en-us-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_en_us 扩展的 RPM / DEB 包:

pig build pkg hunspell_en_us         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_en_us 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_en_us;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_en_us -v 18  # PG 18
pig ext install -y hunspell_en_us -v 17  # PG 17
pig ext install -y hunspell_en_us -v 16  # PG 16
pig ext install -y hunspell_en_us -v 15  # PG 15
pig ext install -y hunspell_en_us -v 14  # PG 14
dnf install -y hunspell_en_us_18       # PG 18
dnf install -y hunspell_en_us_17       # PG 17
dnf install -y hunspell_en_us_16       # PG 16
dnf install -y hunspell_en_us_15       # PG 15
dnf install -y hunspell_en_us_14       # PG 14
apt install -y postgresql-18-hunspell-en-us   # PG 18
apt install -y postgresql-17-hunspell-en-us   # PG 17
apt install -y postgresql-16-hunspell-en-us   # PG 16
apt install -y postgresql-15-hunspell-en-us   # PG 15
apt install -y postgresql-14-hunspell-en-us   # PG 14

创建扩展

CREATE EXTENSION hunspell_en_us;

用法

hunspell_en_us: PostgreSQL 的英语(美国) Hunspell 词典

用于 PostgreSQL 全文搜索的英语(美国) Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_en_us;

SELECT ts_lexize('english_hunspell', 'stories');

SELECT to_tsvector('english_hunspell', 'stories');

该扩展提供 english_hunspell 词典和文本搜索配置。

69 - hunspell_fr

Hunspell法语全文检索词典

概览

扩展包名版本分类许可证语言
hunspell_fr1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2273hunspell_fr-
相关扩展hunspell_cs_cz hunspell_de_de hunspell_en_us hunspell_nl_nl hunspell_ne_np hunspell_nn_no hunspell_pt_pt hunspell_ru_ru

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_fr-
RPMPIGSTY1.01817161514hunspell_fr_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-fr-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_fr 扩展的 RPM / DEB 包:

pig build pkg hunspell_fr         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_fr 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_fr;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_fr -v 18  # PG 18
pig ext install -y hunspell_fr -v 17  # PG 17
pig ext install -y hunspell_fr -v 16  # PG 16
pig ext install -y hunspell_fr -v 15  # PG 15
pig ext install -y hunspell_fr -v 14  # PG 14
dnf install -y hunspell_fr_18       # PG 18
dnf install -y hunspell_fr_17       # PG 17
dnf install -y hunspell_fr_16       # PG 16
dnf install -y hunspell_fr_15       # PG 15
dnf install -y hunspell_fr_14       # PG 14
apt install -y postgresql-18-hunspell-fr   # PG 18
apt install -y postgresql-17-hunspell-fr   # PG 17
apt install -y postgresql-16-hunspell-fr   # PG 16
apt install -y postgresql-15-hunspell-fr   # PG 15
apt install -y postgresql-14-hunspell-fr   # PG 14

创建扩展

CREATE EXTENSION hunspell_fr;

用法

hunspell_fr: PostgreSQL 的法语 Hunspell 词典

用于 PostgreSQL 全文搜索的法语 Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_fr;

SELECT ts_lexize('french_hunspell', 'histoires');

SELECT to_tsvector('french_hunspell', 'histoires');

该扩展提供 french_hunspell 词典和文本搜索配置。

70 - hunspell_ne_np

Hunspell尼泊尔语全文检索词典

概览

扩展包名版本分类许可证语言
hunspell_ne_np1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2274hunspell_ne_np-
相关扩展hunspell_en_us hunspell_nn_no hunspell_pt_pt hunspell_ru_ru hunspell_ru_ru_aot hunspell_cs_cz hunspell_de_de hunspell_fr

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_ne_np-
RPMPIGSTY1.01817161514hunspell_ne_np_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-ne-np-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_ne_np 扩展的 RPM / DEB 包:

pig build pkg hunspell_ne_np         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_ne_np 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_ne_np;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_ne_np -v 18  # PG 18
pig ext install -y hunspell_ne_np -v 17  # PG 17
pig ext install -y hunspell_ne_np -v 16  # PG 16
pig ext install -y hunspell_ne_np -v 15  # PG 15
pig ext install -y hunspell_ne_np -v 14  # PG 14
dnf install -y hunspell_ne_np_18       # PG 18
dnf install -y hunspell_ne_np_17       # PG 17
dnf install -y hunspell_ne_np_16       # PG 16
dnf install -y hunspell_ne_np_15       # PG 15
dnf install -y hunspell_ne_np_14       # PG 14
apt install -y postgresql-18-hunspell-ne-np   # PG 18
apt install -y postgresql-17-hunspell-ne-np   # PG 17
apt install -y postgresql-16-hunspell-ne-np   # PG 16
apt install -y postgresql-15-hunspell-ne-np   # PG 15
apt install -y postgresql-14-hunspell-ne-np   # PG 14

创建扩展

CREATE EXTENSION hunspell_ne_np;

用法

hunspell_ne_np: PostgreSQL 的尼泊尔语 Hunspell 词典

用于 PostgreSQL 全文搜索的尼泊尔语 Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_ne_np;

SELECT ts_lexize('nepali_hunspell', 'कथाहरू');

SELECT to_tsvector('nepali_hunspell', 'कथाहरू');

该扩展提供 nepali_hunspell 词典和文本搜索配置。

71 - hunspell_nl_nl

Hunspell荷兰语全文检索词典

概览

扩展包名版本分类许可证语言
hunspell_nl_nl1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2275hunspell_nl_nl-
相关扩展hunspell_cs_cz hunspell_de_de hunspell_en_us hunspell_fr hunspell_ne_np hunspell_nn_no hunspell_pt_pt hunspell_ru_ru

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_nl_nl-
RPMPIGSTY1.01817161514hunspell_nl_nl_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-nl-nl-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_nl_nl 扩展的 RPM / DEB 包:

pig build pkg hunspell_nl_nl         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_nl_nl 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_nl_nl;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_nl_nl -v 18  # PG 18
pig ext install -y hunspell_nl_nl -v 17  # PG 17
pig ext install -y hunspell_nl_nl -v 16  # PG 16
pig ext install -y hunspell_nl_nl -v 15  # PG 15
pig ext install -y hunspell_nl_nl -v 14  # PG 14
dnf install -y hunspell_nl_nl_18       # PG 18
dnf install -y hunspell_nl_nl_17       # PG 17
dnf install -y hunspell_nl_nl_16       # PG 16
dnf install -y hunspell_nl_nl_15       # PG 15
dnf install -y hunspell_nl_nl_14       # PG 14
apt install -y postgresql-18-hunspell-nl-nl   # PG 18
apt install -y postgresql-17-hunspell-nl-nl   # PG 17
apt install -y postgresql-16-hunspell-nl-nl   # PG 16
apt install -y postgresql-15-hunspell-nl-nl   # PG 15
apt install -y postgresql-14-hunspell-nl-nl   # PG 14

创建扩展

CREATE EXTENSION hunspell_nl_nl;

用法

hunspell_nl_nl: PostgreSQL 的荷兰语 Hunspell 词典

用于 PostgreSQL 全文搜索的荷兰语 Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_nl_nl;

SELECT ts_lexize('dutch_hunspell', 'verhalen');

SELECT to_tsvector('dutch_hunspell', 'verhalen');

该扩展提供 dutch_hunspell 词典和文本搜索配置。

72 - hunspell_nn_no

Hunspell挪威语全文检索词典

概览

扩展包名版本分类许可证语言
hunspell_nn_no1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2276hunspell_nn_no-
相关扩展hunspell_en_us hunspell_ne_np hunspell_pt_pt hunspell_ru_ru hunspell_ru_ru_aot hunspell_cs_cz hunspell_de_de hunspell_fr

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_nn_no-
RPMPIGSTY1.01817161514hunspell_nn_no_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-nn-no-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_nn_no 扩展的 RPM / DEB 包:

pig build pkg hunspell_nn_no         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_nn_no 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_nn_no;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_nn_no -v 18  # PG 18
pig ext install -y hunspell_nn_no -v 17  # PG 17
pig ext install -y hunspell_nn_no -v 16  # PG 16
pig ext install -y hunspell_nn_no -v 15  # PG 15
pig ext install -y hunspell_nn_no -v 14  # PG 14
dnf install -y hunspell_nn_no_18       # PG 18
dnf install -y hunspell_nn_no_17       # PG 17
dnf install -y hunspell_nn_no_16       # PG 16
dnf install -y hunspell_nn_no_15       # PG 15
dnf install -y hunspell_nn_no_14       # PG 14
apt install -y postgresql-18-hunspell-nn-no   # PG 18
apt install -y postgresql-17-hunspell-nn-no   # PG 17
apt install -y postgresql-16-hunspell-nn-no   # PG 16
apt install -y postgresql-15-hunspell-nn-no   # PG 15
apt install -y postgresql-14-hunspell-nn-no   # PG 14

创建扩展

CREATE EXTENSION hunspell_nn_no;

用法

hunspell_nn_no: PostgreSQL 的挪威语(尼诺斯克) Hunspell 词典

用于 PostgreSQL 全文搜索的挪威语(尼诺斯克) Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_nn_no;

SELECT ts_lexize('norwegian_hunspell', 'historier');

SELECT to_tsvector('norwegian_hunspell', 'historier');

该扩展提供 norwegian_hunspell 词典和文本搜索配置。

73 - hunspell_pt_pt

Hunspell葡萄牙语全文检索词典

概览

扩展包名版本分类许可证语言
hunspell_pt_pt1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2277hunspell_pt_pt-
相关扩展hunspell_en_us hunspell_ne_np hunspell_nn_no hunspell_ru_ru hunspell_ru_ru_aot hunspell_cs_cz hunspell_de_de hunspell_fr

WARNING, conflict with pg built-in dict file, not recommended

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_pt_pt-
RPMPIGSTY1.01817161514hunspell_pt_pt_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-pt-pt-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.x86_64PIGSTY MISS
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64PIGSTY MISS
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
d13.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
u22.x86_64PIGSTY MISS
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64PIGSTY MISS
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64PIGSTY MISS
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64PIGSTY MISS
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_pt_pt 扩展的 RPM / DEB 包:

pig build pkg hunspell_pt_pt         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_pt_pt 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_pt_pt;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_pt_pt -v 18  # PG 18
pig ext install -y hunspell_pt_pt -v 17  # PG 17
pig ext install -y hunspell_pt_pt -v 16  # PG 16
pig ext install -y hunspell_pt_pt -v 15  # PG 15
pig ext install -y hunspell_pt_pt -v 14  # PG 14
dnf install -y hunspell_pt_pt_18       # PG 18
dnf install -y hunspell_pt_pt_17       # PG 17
dnf install -y hunspell_pt_pt_16       # PG 16
dnf install -y hunspell_pt_pt_15       # PG 15
dnf install -y hunspell_pt_pt_14       # PG 14
apt install -y postgresql-18-hunspell-pt-pt   # PG 18
apt install -y postgresql-17-hunspell-pt-pt   # PG 17
apt install -y postgresql-16-hunspell-pt-pt   # PG 16
apt install -y postgresql-15-hunspell-pt-pt   # PG 15
apt install -y postgresql-14-hunspell-pt-pt   # PG 14

创建扩展

CREATE EXTENSION hunspell_pt_pt;

用法

hunspell_pt_pt: PostgreSQL 的葡萄牙语 Hunspell 词典

用于 PostgreSQL 全文搜索的葡萄牙语 Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_pt_pt;

SELECT ts_lexize('portuguese_hunspell', 'histórias');

SELECT to_tsvector('portuguese_hunspell', 'histórias');

该扩展提供 portuguese_hunspell 词典和文本搜索配置。

74 - hunspell_ru_ru

Hunspell俄语全文检索词典

概览

扩展包名版本分类许可证语言
hunspell_ru_ru1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2278hunspell_ru_ru-
相关扩展hunspell_ne_np hunspell_nn_no hunspell_pt_pt hunspell_ru_ru_aot hunspell_cs_cz hunspell_de_de hunspell_en_us hunspell_fr

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_ru_ru-
RPMPIGSTY1.01817161514hunspell_ru_ru_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-ru-ru-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_ru_ru 扩展的 RPM / DEB 包:

pig build pkg hunspell_ru_ru         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_ru_ru 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_ru_ru;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_ru_ru -v 18  # PG 18
pig ext install -y hunspell_ru_ru -v 17  # PG 17
pig ext install -y hunspell_ru_ru -v 16  # PG 16
pig ext install -y hunspell_ru_ru -v 15  # PG 15
pig ext install -y hunspell_ru_ru -v 14  # PG 14
dnf install -y hunspell_ru_ru_18       # PG 18
dnf install -y hunspell_ru_ru_17       # PG 17
dnf install -y hunspell_ru_ru_16       # PG 16
dnf install -y hunspell_ru_ru_15       # PG 15
dnf install -y hunspell_ru_ru_14       # PG 14
apt install -y postgresql-18-hunspell-ru-ru   # PG 18
apt install -y postgresql-17-hunspell-ru-ru   # PG 17
apt install -y postgresql-16-hunspell-ru-ru   # PG 16
apt install -y postgresql-15-hunspell-ru-ru   # PG 15
apt install -y postgresql-14-hunspell-ru-ru   # PG 14

创建扩展

CREATE EXTENSION hunspell_ru_ru;

用法

hunspell_ru_ru: PostgreSQL 的俄语 Hunspell 词典

用于 PostgreSQL 全文搜索的俄语 Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_ru_ru;

SELECT ts_lexize('russian_hunspell', 'рассказы');

SELECT to_tsvector('russian_hunspell', 'рассказы');

该扩展提供 russian_hunspell 词典和文本搜索配置。

75 - hunspell_ru_ru_aot

Hunspell俄语全文检索词典(来自AOT.ru小组)

概览

扩展包名版本分类许可证语言
hunspell_ru_ru_aot1.0FTSPostgreSQLData
ID扩展名BinLibLoadCreateTrustReloc模式
2279hunspell_ru_ru_aot-
相关扩展hunspell_ne_np hunspell_nn_no hunspell_pt_pt hunspell_ru_ru hunspell_cs_cz hunspell_de_de hunspell_en_us hunspell_fr

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514hunspell_ru_ru_aot-
RPMPIGSTY1.01817161514hunspell_ru_ru_aot_$v-
DEBPIGSTY1.01817161514postgresql-$v-hunspell-ru-ru-aot-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
el8.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
el9.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
el9.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
el10.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
el10.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

您可以使用 pig build 命令构建 hunspell_ru_ru_aot 扩展的 RPM / DEB 包:

pig build pkg hunspell_ru_ru_aot         # 构建 RPM / DEB 包

安装

您可以直接安装 hunspell_ru_ru_aot 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hunspell_ru_ru_aot;          # 当前活跃 PG 版本安装
pig ext install -y hunspell_ru_ru_aot -v 18  # PG 18
pig ext install -y hunspell_ru_ru_aot -v 17  # PG 17
pig ext install -y hunspell_ru_ru_aot -v 16  # PG 16
pig ext install -y hunspell_ru_ru_aot -v 15  # PG 15
pig ext install -y hunspell_ru_ru_aot -v 14  # PG 14
dnf install -y hunspell_ru_ru_aot_18       # PG 18
dnf install -y hunspell_ru_ru_aot_17       # PG 17
dnf install -y hunspell_ru_ru_aot_16       # PG 16
dnf install -y hunspell_ru_ru_aot_15       # PG 15
dnf install -y hunspell_ru_ru_aot_14       # PG 14
apt install -y postgresql-18-hunspell-ru-ru-aot   # PG 18
apt install -y postgresql-17-hunspell-ru-ru-aot   # PG 17
apt install -y postgresql-16-hunspell-ru-ru-aot   # PG 16
apt install -y postgresql-15-hunspell-ru-ru-aot   # PG 15
apt install -y postgresql-14-hunspell-ru-ru-aot   # PG 14

创建扩展

CREATE EXTENSION hunspell_ru_ru_aot;

用法

hunspell_ru_ru_aot: PostgreSQL 的俄语(AOT)Hunspell 词典

用于 PostgreSQL 全文搜索的俄语(AOT 变体)Hunspell 词典和文本搜索配置。

CREATE EXTENSION hunspell_ru_ru_aot;

SELECT ts_lexize('russian_aot_hunspell', 'рассказы');

SELECT to_tsvector('russian_aot_hunspell', 'рассказы');

该扩展提供 russian_aot_hunspell 词典和文本搜索配置。

76 - fuzzystrmatch

确定字符串之间的相似性和距离

概览

扩展包名版本分类许可证语言
fuzzystrmatch1.2FTSPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2380fuzzystrmatch-
相关扩展pg_similarity smlar pg_trgm unaccent pg_bigm citext btree_gist btree_gin
下游依赖postgis_tiger_geocoder

版本

PG18PG17PG16PG15PG14
1.21.21.21.21.2

安装

提示:这是 PostgreSQL 内核自带的 contrib 扩展

CREATE EXTENSION fuzzystrmatch;

用法

fuzzystrmatch: 判断字符串之间的相似度和距离

fuzzystrmatch 模块提供了判断字符串之间相似度和距离的函数。

CREATE EXTENSION fuzzystrmatch;

Soundex

将字符串转换为 Soundex 编码(适用于匹配发音相似的名称):

SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');
-- A500, A500, 4

SELECT soundex('Anne'), soundex('Andrew'), difference('Anne', 'Andrew');
-- A500, A536, 2

SELECT soundex('Anne'), soundex('Margaret'), difference('Anne', 'Margaret');
-- A500, M626, 0

difference 函数返回 0-4,其中 4 表示最相似。

Daitch-Mokotoff Soundex

返回 Daitch-Mokotoff soundex 编码集合(对非英语名称效果更好):

SELECT daitch_mokotoff('George');
-- {595000}

SELECT daitch_mokotoff('John');
-- {160000,460000}

-- 查找发音类似 'Schwartzenegger' 的名称
SELECT * FROM s WHERE daitch_mokotoff(nm) && daitch_mokotoff('Schwartzenegger');

支持 GIN 索引:

CREATE INDEX ON s USING gin (daitch_mokotoff(nm) gin__int_ops);

Levenshtein 距离

计算两个字符串之间的编辑距离(插入、删除、替换):

SELECT levenshtein('GUMBO', 'GAMBOL');
-- 2

SELECT levenshtein('GUMBO', 'GAMBOL', 2, 1, 1);
-- 3(自定义代价:插入=2,删除=1,替换=1)

-- 有界版本(更快,提前终止)
SELECT levenshtein_less_equal('extensive', 'exhaustive', 2);
-- 3(实际距离超过阈值,返回实际值)

SELECT levenshtein_less_equal('extensive', 'exhaustive', 4);
-- 4

Metaphone

返回字符串的 metaphone 编码:

SELECT metaphone('GUMBO', 4);
-- KM

Double Metaphone

返回主要和备选编码(处理更多名称变体):

SELECT dmetaphone('gumbo');
-- KMP

SELECT dmetaphone_alt('gumbo');
-- KMP

77 - pg_trgm

文本相似度测量函数与模糊检索

概览

扩展包名版本分类许可证语言
pg_trgm1.6FTSPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2390pg_trgm-
相关扩展pg_similarity pg_bigm fuzzystrmatch unaccent smlar pgroonga_database rum citext

版本

PG18PG17PG16PG15PG14
1.61.61.61.61.6

安装

提示:这是 PostgreSQL 内核自带的 contrib 扩展

CREATE EXTENSION pg_trgm;

用法

pg_trgm: 基于三元组的文本相似度度量和索引搜索

pg_trgm 模块提供了基于三元组匹配来确定字母数字文本相似度的函数和运算符,以及用于快速字符串相似度搜索的索引运算符类。

CREATE EXTENSION pg_trgm;

三元组是从字符串中提取的三个连续字符组。如果两个字符串共享许多三元组,则它们是相似的。

函数

函数说明
similarity(text, text)real返回 0 到 1 之间的相似度
show_trgm(text)text[]返回字符串中所有三元组的数组
word_similarity(text, text)real第一个字符串与第二个中最相似词的相似度
strict_word_similarity(text, text)real类似但词边界匹配更严格
show_limit()real(已弃用) 返回 pg_trgm.similarity_threshold
set_limit(real)real(已弃用) 设置 pg_trgm.similarity_threshold
SELECT similarity('word', 'two words');
-- 0.36363637

SELECT show_trgm('word');
-- {"  w"," wo",ord,"rd ",wor}

运算符

运算符说明
text % textboolean相似度 > pg_trgm.similarity_threshold 时为 true
text <% textboolean词相似度 > pg_trgm.word_similarity_threshold 时为 true
text %> textboolean<% 的交换子
text <<% textboolean严格词相似度 > 阈值时为 true
text %>> textboolean<<% 的交换子
text <-> textreal距离(1 - 相似度)
text <<-> textreal词距离(1 - 词相似度)
text <->> textreal<<-> 的交换子
text <<<-> textreal严格词距离
text <->>> textreal<<<-> 的交换子

GUC 参数

参数默认值说明
pg_trgm.similarity_threshold0.3% 运算符的阈值
pg_trgm.word_similarity_threshold0.6<%%> 运算符的阈值
pg_trgm.strict_word_similarity_threshold0.5<<%%>> 运算符的阈值

索引支持

GiST 和 GIN 索引支持相似度运算符:

-- GIN 索引(查找更快,构建更慢)
CREATE INDEX trgm_idx ON test_trgm USING GIN (t gin_trgm_ops);

-- GiST 索引(支持 KNN 的距离运算符)
CREATE INDEX trgm_idx ON test_trgm USING GIST (t gist_trgm_ops);

-- 自定义签名长度的 GiST 索引
CREATE INDEX trgm_idx ON test_trgm USING GIST (t gist_trgm_ops(siglen=32));

文本搜索示例

使用三元组索引加速 LIKE / ILIKE / 正则查询:

SELECT t, similarity(t, 'word') AS sml
FROM test_trgm
WHERE t % 'word'
ORDER BY sml DESC, t;

-- 使用距离运算符的 KNN 搜索
SELECT t, t <-> 'word' AS dist
FROM test_trgm
ORDER BY dist
LIMIT 10;

GIN 和 GiST 三元组索引也能自动加速 LIKEILIKE~~* 查询。

78 - citus

Citus 分布式数据库

概览

扩展包名版本分类许可证语言
citus14.0.0OLAPAGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
2400cituspg_catalog
2401citus_columnarpg_catalog
相关扩展pg_partman plproxy columnar pg_fkpart timescaledb pg_duckdb tablefunc hll
下游依赖documentdb_distributed

conflict with hydra

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY14.0.01817161514citus-
RPMPIGSTY14.0.01817161514citus_$v-
DEBPIGSTY14.0.01817161514postgresql-$v-citus-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PIGSTY 13.0.0
el8.x86_64.pg14 : citus_14
citus_14-13.0.0-1PIGSTY.el8.x86_64.rpm PIGSTY · 13.0.0 · 807.0KiB citus_14-13.0.0-1PGDG.rhel8.x86_64.rpm PGDG · 13.0.0 · 814.2KiB citus_14-12.1.6-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.6 · 813.6KiB citus_14-12.1.5-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.5 · 812.5KiB citus_14-12.1.4-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.4 · 812.5KiB citus_14-12.1.3-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.3 · 812.3KiB citus_14-12.1.2-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.2 · 811.1KiB citus_14-12.1.1-1PGDG.rhel8.x86_64.rpm PGDG · 12.1.1 · 811.0KiB citus_14-12.1.0-2PGDG.rhel8.x86_64.rpm PGDG · 12.1.0 · 810.5KiB citus_14-12.0.0-1PGDG.rhel8.x86_64.rpm PGDG · 12.0.0 · 813.4KiB citus_14-11.3.0-2.rhel8.x86_64.rpm PGDG · 11.3.0 · 796.7KiB citus_14-11.2.1-1.rhel8.x86_64.rpm PGDG · 11.2.1 · 776.9KiB citus_14-11.2.0-1.rhel8.x86_64.rpm PGDG · 11.2.0 · 776.0KiB citus_14-11.1.5-1.rhel8.x86_64.rpm PGDG · 11.1.5 · 765.6KiB citus_14-11.1.4-1.rhel8.x86_64.rpm PGDG · 11.1.4 · 765.3KiB citus_14-11.1.3-1.rhel8.x86_64.rpm PGDG · 11.1.3 · 765.1KiB citus_14-11.1.2-1.rhel8.x86_64.rpm PGDG · 11.1.2 · 764.4KiB citus_14-11.1.1-1.rhel8.x86_64.rpm PGDG · 11.1.1 · 762.6KiB citus_14-11.0.6-1.rhel8.x86_64.rpm PGDG · 11.0.6 · 701.4KiB citus_14-11.0.5-1.rhel8.x86_64.rpm PGDG · 11.0.5 · 700.3KiB citus_14-11.0.4-1.rhel8.x86_64.rpm PGDG · 11.0.4 · 699.6KiB citus_14-11.0.3-1.rhel8.x86_64.rpm PGDG · 11.0.3 · 699.5KiB citus_14-11.0.2-1.rhel8.x86_64.rpm PGDG · 11.0.2 · 698.6KiB citus_14-10.2.5-1.rhel8.x86_64.rpm PGDG · 10.2.5 · 618.5KiB citus_14-10.2.4-1.rhel8.x86_64.rpm PGDG · 10.2.4 · 618.6KiB citus_14-10.2.3-1.rhel8.x86_64.rpm PGDG · 10.2.3 · 618.5KiB citus_14-10.2.2-1.rhel8.x86_64.rpm PGDG · 10.2.2 · 615.3KiB citus_14-10.2.1-1.rhel8.x86_64.rpm PGDG · 10.2.1 · 614.8KiB citus_14-10.2.0-1.rhel8.x86_64.rpm PGDG · 10.2.0 · 614.0KiB
el8.aarch64
el9.x86_64
PIGSTY 13.0.0
el9.x86_64.pg14 : citus_14
citus_14-13.0.0-1PIGSTY.el9.x86_64.rpm PIGSTY · 13.0.0 · 801.9KiB citus_14-13.0.0-1PGDG.rhel9.x86_64.rpm PGDG · 13.0.0 · 803.4KiB citus_14-12.1.6-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.6 · 802.9KiB citus_14-12.1.5-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.5 · 800.4KiB citus_14-12.1.4-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.4 · 800.6KiB citus_14-12.1.3-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.3 · 800.1KiB citus_14-12.1.2-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.2 · 798.9KiB citus_14-12.1.1-1PGDG.rhel9.x86_64.rpm PGDG · 12.1.1 · 798.9KiB citus_14-12.1.0-2PGDG.rhel9.x86_64.rpm PGDG · 12.1.0 · 798.9KiB citus_14-12.0.0-1PGDG.rhel9.x86_64.rpm PGDG · 12.0.0 · 802.0KiB citus_14-11.3.0-2.rhel9.x86_64.rpm PGDG · 11.3.0 · 787.6KiB citus_14-11.2.1-1.rhel9.x86_64.rpm PGDG · 11.2.1 · 767.2KiB citus_14-11.2.0-1.rhel9.x86_64.rpm PGDG · 11.2.0 · 766.5KiB citus_14-11.1.5-1.rhel9.x86_64.rpm PGDG · 11.1.5 · 756.8KiB citus_14-11.1.4-1.rhel9.x86_64.rpm PGDG · 11.1.4 · 755.9KiB citus_14-11.1.3-1.rhel9.x86_64.rpm PGDG · 11.1.3 · 755.8KiB citus_14-11.1.2-1.rhel9.x86_64.rpm PGDG · 11.1.2 · 755.4KiB citus_14-11.1.1-1.rhel9.x86_64.rpm PGDG · 11.1.1 · 754.1KiB citus_14-11.0.6-1.rhel9.x86_64.rpm PGDG · 11.0.6 · 691.3KiB citus_14-11.0.5-1.rhel9.x86_64.rpm PGDG · 11.0.5 · 690.5KiB citus_14-11.0.4-1.rhel9.x86_64.rpm PGDG · 11.0.4 · 690.0KiB citus_14-11.0.3-1.rhel9.x86_64.rpm PGDG · 11.0.3 · 689.8KiB citus_14-11.0.2-1.rhel9.x86_64.rpm PGDG · 11.0.2 · 689.0KiB citus_14-10.2.5-1.rhel9.x86_64.rpm PGDG · 10.2.5 · 612.1KiB citus_14-10.2.4-1.rhel9.x86_64.rpm PGDG · 10.2.4 · 613.7KiB citus_14-10.2.3-1.rhel9.x86_64.rpm PGDG · 10.2.3 · 613.7KiB
el9.aarch64
el10.x86_64PIGSTY MISS
el10.aarch64PIGSTY MISS
d12.x86_64
d12.aarch64
d13.x86_64PIGSTY MISS
d13.aarch64
PIGSTY 14.0.0
PIGSTY 14.0.0
PIGSTY 14.0.0
PIGSTY 13.2.0
PIGSTY MISS
u22.x86_64
u22.aarch64
PIGSTY 14.0.0
PIGSTY 14.0.0
PIGSTY 14.0.0
PIGSTY 13.2.0
PIGSTY 13.0.0
u24.x86_64
u24.aarch64
PIGSTY 14.0.0
PIGSTY 14.0.0
PIGSTY 14.0.0
PIGSTY 13.2.0
PIGSTY 13.0.0

构建

您可以使用 pig build 命令构建 citus 扩展的 RPM / DEB 包:

pig build pkg citus         # 构建 RPM / DEB 包

安装

您可以直接安装 citus 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install citus;          # 当前活跃 PG 版本安装
pig ext install -y citus -v 18  # PG 18
pig ext install -y citus -v 17  # PG 17
pig ext install -y citus -v 16  # PG 16
dnf install -y citus_18       # PG 18
dnf install -y citus_17       # PG 17
dnf install -y citus_16       # PG 16
apt install -y postgresql-18-citus   # PG 18
apt install -y postgresql-17-citus   # PG 17
apt install -y postgresql-16-citus   # PG 16

预加载配置

shared_preload_libraries = 'citus';

创建扩展

CREATE EXTENSION citus;

用法

citus: 面向多租户和实时分析的分布式 PostgreSQL

Citus 将 PostgreSQL 转变为分布式数据库,通过在多个节点间分片表来实现水平扩展。它支持多租户 SaaS 工作负载、实时分析和高吞吐量事务场景,同时保留完整的 PostgreSQL 功能集。

核心文档:

快速开始

启用扩展并添加工作节点:

CREATE EXTENSION citus;

-- 将协调节点添加到集群
SELECT citus_set_coordinator_host('coord-host', 5432);
SELECT * FROM citus_add_node('worker-1', 5432);
SELECT * FROM citus_add_node('worker-2', 5432);

-- 验证集群状态
SELECT * FROM citus_get_active_worker_nodes();

创建分布式表

通过指定分布列(分片键)来分布表。具有相同键值的行会被协同定位在同一个分片上。

CREATE TABLE events (
    tenant_id   INT,
    event_id    BIGSERIAL,
    event_time  TIMESTAMPTZ DEFAULT now(),
    event_type  TEXT,
    payload     JSONB,
    PRIMARY KEY (tenant_id, event_id)
);

-- 按 tenant_id 进行哈希分布(默认:32 个分片)
SELECT create_distributed_table('events', 'tenant_id');

可以控制分片数量:

SELECT create_distributed_table('events', 'tenant_id', shard_count := 64);

引用表

需要与分布式表进行连接的小型查找表应创建为引用表。引用表会被完整复制到每个节点。

CREATE TABLE countries (
    code CHAR(2) PRIMARY KEY,
    name TEXT NOT NULL
);

SELECT create_reference_table('countries');

引用表可以与任何分布式表进行无限制的连接。

协同定位

基于相同列类型和分片数量进行分布的表会自动协同定位,即具有匹配分布键的行存储在同一节点上。这使得高效的本地连接成为可能。

CREATE TABLE tenants (
    id   INT PRIMARY KEY,
    name TEXT
);
SELECT create_distributed_table('tenants', 'id');

CREATE TABLE orders (
    tenant_id  INT REFERENCES tenants(id),
    order_id   BIGSERIAL,
    amount     NUMERIC,
    PRIMARY KEY (tenant_id, order_id)
);
SELECT create_distributed_table('orders', 'tenant_id');

-- 此连接被下推到各节点执行(无跨分片流量)
SELECT t.name, sum(o.amount)
FROM tenants t JOIN orders o ON t.id = o.tenant_id
GROUP BY t.name;

也可以显式指定协同定位组:

SELECT create_distributed_table('orders', 'tenant_id',
    colocate_with := 'tenants');

分布式查询

Citus 尽可能将查询下推到各个分片。过滤分布列的查询会被路由到单个分片:

-- 单分片查询(快速,只访问一个节点)
SELECT * FROM events WHERE tenant_id = 42;

跨分片查询会在所有工作节点上并行执行:

-- 跨所有分片的并行聚合
SELECT event_type, count(*), avg(payload->>'duration')::numeric
FROM events
WHERE event_time > now() - INTERVAL '1 hour'
GROUP BY event_type
ORDER BY count DESC
LIMIT 10;

分布式连接

协同定位表之间基于分布列的连接在每个分片上本地执行:

-- 协同定位连接:高效,无数据移动
SELECT e.*, o.amount
FROM events e JOIN orders o
    ON e.tenant_id = o.tenant_id
WHERE e.tenant_id = 42;

与引用表的连接可从任何分布式表发起:

SELECT e.*, c.name AS country_name
FROM events e JOIN countries c ON e.payload->>'country' = c.code;

节点管理

-- 添加新节点
SELECT * FROM citus_add_node('worker-3', 5432);

-- 移除节点(先将分片迁移到其他节点)
SELECT * FROM citus_drain_node('worker-1', 5432);
SELECT * FROM citus_remove_node('worker-1', 5432);

-- 临时禁用节点
SELECT * FROM citus_disable_node('worker-2', 5432);
SELECT * FROM citus_activate_node('worker-2', 5432);

-- 查看当前集群状态
SELECT * FROM citus_get_active_worker_nodes();

分片再平衡

添加或移除节点后,通过再平衡分片来均匀分配数据:

-- 再平衡所有分布式表
SELECT citus_rebalance_start();

-- 监控再平衡进度
SELECT * FROM citus_rebalance_status();

-- 再平衡特定表
SELECT rebalance_table_shards('events');

分片管理

-- 查看分片分布
SELECT * FROM citus_shards;

-- 查看分片大小
SELECT table_name, shard_count, citus_total_relation_size(table_name::text)
FROM citus_tables;

-- 将特定分片迁移到另一个节点
SELECT citus_move_shard_placement(shard_id, 'source-host', 5432, 'dest-host', 5432);

配置参数

用于调优 Citus 的关键 GUC 参数:

-- 多分片查询时每个节点的并行连接数
SET citus.max_adaptive_executor_pool_size = 4;

-- 分片复制因子(默认 1;无流复制时可设为 2 以实现高可用)
SET citus.shard_replication_factor = 1;

-- 控制执行器行为
SET citus.multi_shard_modify_mode = 'parallel';   -- 或 'sequential'
SET citus.enable_repartition_joins = on;           -- 启用重分区连接

-- 任务分配策略
SET citus.task_assignment_policy = 'round-robin';  -- 或 'greedy'、'first-replica'

-- 记录分布式查询日志
SET citus.log_multi_join_order = on;
SET citus.explain_all_tasks = on;

示例:多租户 SaaS 模式

典型的多租户模式将所有租户相关的表按 tenant_id 进行分布:

CREATE TABLE tenants (
    tenant_id   INT PRIMARY KEY,
    name        TEXT,
    plan        TEXT DEFAULT 'free',
    created_at  TIMESTAMPTZ DEFAULT now()
);
SELECT create_distributed_table('tenants', 'tenant_id');

CREATE TABLE users (
    tenant_id   INT,
    user_id     BIGSERIAL,
    email       TEXT,
    PRIMARY KEY (tenant_id, user_id)
);
SELECT create_distributed_table('users', 'tenant_id');

CREATE TABLE projects (
    tenant_id   INT,
    project_id  BIGSERIAL,
    name        TEXT,
    owner_id    BIGINT,
    PRIMARY KEY (tenant_id, project_id)
);
SELECT create_distributed_table('projects', 'tenant_id');

-- 共享查找表:复制到每个节点
CREATE TABLE plans (
    name TEXT PRIMARY KEY,
    max_users INT,
    max_projects INT
);
SELECT create_reference_table('plans');

-- 所有限定在单个租户范围内的连接都是协同定位的,查询速度快
SELECT u.email, p.name AS project
FROM users u
JOIN projects p ON u.tenant_id = p.tenant_id AND u.user_id = p.owner_id
WHERE u.tenant_id = 7;

示例:实时分析

用于仪表板和分析的分布式聚合:

CREATE TABLE page_views (
    site_id      INT,
    url          TEXT,
    view_time    TIMESTAMPTZ DEFAULT now(),
    user_agent   TEXT,
    country      CHAR(2)
);
SELECT create_distributed_table('page_views', 'site_id');

-- 实时汇总:跨分片并行执行
SELECT
    date_trunc('minute', view_time) AS minute,
    count(*)                        AS views,
    count(DISTINCT country)         AS countries
FROM page_views
WHERE site_id = 1
  AND view_time > now() - INTERVAL '1 hour'
GROUP BY minute
ORDER BY minute DESC;

-- 所有站点的热门页面(跨分片并行查询)
SELECT url, count(*) AS views
FROM page_views
WHERE view_time > now() - INTERVAL '24 hours'
GROUP BY url
ORDER BY views DESC
LIMIT 20;

79 - citus_columnar

Citus 列式存储引擎

概览

扩展包名版本分类许可证语言
citus14.0.0OLAPAGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
2400cituspg_catalog
2401citus_columnarpg_catalog
相关扩展columnar pg_parquet timescaledb pg_analytics pg_mooncake pg_duckdb duckdb_fdw orioledb

conflict with hydra columnar, no pg18

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY14.0.01817161514citus-
RPMPIGSTY14.0.01817161514citus_$v-
DEBPIGSTY14.0.01817161514postgresql-$v-citus-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0
el8.aarch64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0
el9.x86_64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0
el9.aarch64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0
el10.x86_64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY MISS
el10.aarch64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY MISS
d12.x86_64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0
d12.aarch64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0
d13.x86_64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY MISS
d13.aarch64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY MISS
u22.x86_64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0
u22.aarch64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0
u24.x86_64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0
u24.aarch64PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 14.0.0PIGSTY 13.2.0PIGSTY 13.0.0

构建

您可以使用 pig build 命令构建 citus 扩展的 RPM / DEB 包:

pig build pkg citus         # 构建 RPM / DEB 包

安装

您可以直接安装 citus 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install citus;          # 当前活跃 PG 版本安装
pig ext install -y citus -v 18  # PG 18
pig ext install -y citus -v 17  # PG 17
pig ext install -y citus -v 16  # PG 16
dnf install -y citus_18       # PG 18
dnf install -y citus_17       # PG 17
dnf install -y citus_16       # PG 16
apt install -y postgresql-18-citus   # PG 18
apt install -y postgresql-17-citus   # PG 17
apt install -y postgresql-16-citus   # PG 16

创建扩展

CREATE EXTENSION citus_columnar;

用法

citus_columnar: PostgreSQL 的列式存储访问方法

Citus Columnar 为 PostgreSQL 提供列式存储引擎。它以列式格式存储数据并自动压缩,非常适合在仅追加数据上执行分析工作负载,这类查询通常只读取部分列。

核心文档:

创建列式表

创建表时使用 USING columnar 子句:

CREATE TABLE events (
    event_id    BIGINT,
    event_time  TIMESTAMPTZ,
    event_type  TEXT,
    user_id     INT,
    payload     JSONB
) USING columnar;

压缩选项

可按表配置压缩方式。支持的方法:zstd(默认)、lz4pglznone

ALTER TABLE events SET (
    columnar.compression = zstd,
    columnar.compression_level = 3
);

块组和条带设置

列式存储将数据组织为条带(stripe),每个条带包含多个块组(chunk group)。调整这些参数会影响压缩率和查询性能。

ALTER TABLE events SET (
    columnar.stripe_row_limit = 150000,    -- 每个条带的最大行数(默认 150000)
    columnar.chunk_group_row_limit = 10000 -- 每个块组的行数(默认 10000)
);

适用场景

列式存储最适合以下场景:

  • 分析和报表:查询只读取宽表中的少数列
  • 仅追加工作负载(如日志、事件、时序归档)
  • 大型事实表:需要批量扫描和聚合
  • 冷数据归档:高压缩率非常有价值

限制

  • 不支持 UPDATE 或 DELETE:列式表仅支持追加
  • 不支持索引:仅支持顺序/列式扫描
  • 不支持 TOAST:大值内联存储
  • 不支持作为发布端的逻辑复制
  • 不支持 tid 扫描

列投影和块组跳过

列式存储自动仅读取查询中引用的列(列投影),并跳过 min/max 元数据与查询条件不匹配的块组:

-- 仅读取 event_type 和 event_time 列;跳过不相关的块组
SELECT event_type, count(*)
FROM events
WHERE event_time > '2025-01-01'
GROUP BY event_type;

监控列式存储

查看条带和块组的元数据:

-- 查看列式表的条带信息
SELECT * FROM columnar.stripe WHERE relation = 'events'::regclass;

-- 查看块组详情
SELECT * FROM columnar.chunk_group WHERE relation = 'events'::regclass;

-- 检查存储大小和压缩率
SELECT pg_size_pretty(pg_total_relation_size('events')) AS total_size;

堆表和列式表之间的转换

将现有堆表转换为列式表:

-- 创建列式副本
CREATE TABLE events_columnar (LIKE events) USING columnar;
INSERT INTO events_columnar SELECT * FROM events;

-- 或使用 ALTER TABLE(Citus 11+)
SELECT alter_table_set_access_method('events', 'columnar');

将列式表转换回堆表:

SELECT alter_table_set_access_method('events', 'heap');

与分区结合使用

将列式存储与分区结合,保持近期数据在堆表中(支持更新/索引),将较旧的分区归档为列式存储:

CREATE TABLE events (
    event_time TIMESTAMPTZ,
    data       JSONB
) PARTITION BY RANGE (event_time);

-- 近期数据:堆表(支持索引和更新)
CREATE TABLE events_current PARTITION OF events
    FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');

-- 归档数据:列式表(压缩存储,读取优化)
CREATE TABLE events_archive PARTITION OF events
    FOR VALUES FROM ('2024-01-01') TO ('2025-01-01')
    USING columnar;

80 - columnar

开源列式存储扩展

概览

扩展包名版本分类许可证语言
hydra1.1.2OLAPAGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
2410columnar-
相关扩展citus citus_columnar pg_mooncake timescaledb pg_analytics pg_parquet pg_duckdb duckdb_fdw

conflict with citus columnar, obsolete, no longer maintained

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.1.21817161514hydra-
RPMPIGSTY1.1.21817161514hydra_$v-
DEBPIGSTY1.1.21817161514postgresql-$v-hydra-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY MISSPIGSTY MISS
el8.aarch64PIGSTY MISSPIGSTY MISS
el9.x86_64PIGSTY MISSPIGSTY MISS
el9.aarch64PIGSTY MISSPIGSTY MISS
el10.x86_64PIGSTY MISSPIGSTY MISS
el10.aarch64PIGSTY MISSPIGSTY MISS
d12.x86_64PIGSTY MISSPIGSTY MISS
d12.aarch64PIGSTY MISSPIGSTY MISS
d13.x86_64PIGSTY MISSPIGSTY MISS
d13.aarch64PIGSTY MISSPIGSTY MISS
u22.x86_64PIGSTY MISSPIGSTY MISS
u22.aarch64PIGSTY MISSPIGSTY MISS
u24.x86_64PIGSTY MISSPIGSTY MISS
u24.aarch64PIGSTY MISSPIGSTY MISS

构建

您可以使用 pig build 命令构建 hydra 扩展的 RPM / DEB 包:

pig build pkg hydra         # 构建 RPM / DEB 包

安装

您可以直接安装 hydra 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hydra;          # 当前活跃 PG 版本安装
pig ext install -y hydra -v 16  # PG 16
pig ext install -y hydra -v 15  # PG 15
pig ext install -y hydra -v 14  # PG 14
dnf install -y hydra_16       # PG 16
dnf install -y hydra_15       # PG 15
dnf install -y hydra_14       # PG 14
apt install -y postgresql-16-hydra   # PG 16
apt install -y postgresql-15-hydra   # PG 15
apt install -y postgresql-14-hydra   # PG 14

创建扩展

CREATE EXTENSION columnar;

81 - pg_analytics

由 DuckDB 驱动的数据分析引擎

概览

扩展包名版本分类许可证语言
pg_analytics0.3.7OLAPPostgreSQLRust
ID扩展名BinLibLoadCreateTrustReloc模式
2420pg_analyticsparadedb
相关扩展pg_duckdb pg_mooncake duckdb_fdw pg_parquet columnar citus_columnar orioledb citus

archived, no longer maintained

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.3.71817161514pg_analytics-
RPMPIGSTY0.3.71817161514pg_analytics_$v-
DEBPIGSTY0.3.71817161514postgresql-$v-pg-analytics-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY MISS
el8.aarch64PIGSTY MISS
el9.x86_64PIGSTY MISS
el9.aarch64PIGSTY MISS
el10.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
el10.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
d12.x86_64PIGSTY MISS
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
d12.aarch64PIGSTY MISS
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
d13.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
d13.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
u22.x86_64PIGSTY MISS
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
u22.aarch64PIGSTY MISS
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
u24.x86_64PIGSTY MISS
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
u24.aarch64PIGSTY MISS
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7
PIGSTY 0.3.7

安装

您可以直接安装 pg_analytics 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_analytics;          # 当前活跃 PG 版本安装
pig ext install -y pg_analytics -v 17  # PG 17
pig ext install -y pg_analytics -v 16  # PG 16
pig ext install -y pg_analytics -v 15  # PG 15
pig ext install -y pg_analytics -v 14  # PG 14
dnf install -y pg_analytics_17       # PG 17
dnf install -y pg_analytics_16       # PG 16
dnf install -y pg_analytics_15       # PG 15
dnf install -y pg_analytics_14       # PG 14
apt install -y postgresql-17-pg-analytics   # PG 17
apt install -y postgresql-16-pg-analytics   # PG 16
apt install -y postgresql-15-pg-analytics   # PG 15
apt install -y postgresql-14-pg-analytics   # PG 14

预加载配置

shared_preload_libraries = 'pg_analytics';

创建扩展

CREATE EXTENSION pg_analytics;

用法

https://github.com/paradedb/pg_analytics

示例:从 S3 读取 Parquet 文件:

CREATE EXTENSION pg_analytics;
CREATE FOREIGN DATA WRAPPER parquet_wrapper HANDLER parquet_fdw_handler VALIDATOR parquet_fdw_validator;

-- 提供 S3 凭证
CREATE SERVER parquet_server FOREIGN DATA WRAPPER parquet_wrapper;

-- 创建外部表并自动生成表结构
CREATE FOREIGN TABLE trips ()
SERVER parquet_server
OPTIONS (files 's3://paradedb-benchmarks/yellow_tripdata_2024-01.parquet');

-- 完成!现在可以像查询普通 PostgreSQL 表一样查询远程 Parquet 文件
SELECT COUNT(*) FROM trips;
  count
---------
 2964624
(1 row)

该外部数据包装器目前仅支持只读操作。


Iceberg 支持

CREATE EXTENSION pg_analytics;

CREATE FOREIGN DATA WRAPPER iceberg_wrapper
    HANDLER iceberg_fdw_handler
    VALIDATOR iceberg_fdw_validator;

CREATE SERVER iceberg_server
    FOREIGN DATA WRAPPER iceberg_wrapper;

-- 请将示例中的占位结构替换为实际的表结构定义
CREATE FOREIGN TABLE iceberg_table (x INT)
    SERVER iceberg_server
    OPTIONS (files 's3://bucket/iceberg_folder');

-- 完成!现在可以查询 Iceberg 表了
SELECT COUNT(*) FROM iceberg_table;

82 - pg_duckdb

在PostgreSQL中的嵌入式DuckDB扩展

概览

扩展包名版本分类许可证语言
pg_duckdb1.1.1OLAPMITC++
ID扩展名BinLibLoadCreateTrustReloc模式
2430pg_duckdbpublic
相关扩展pg_mooncake duckdb_fdw pg_analytics pg_parquet columnar citus citus_columnar orioledb
下游依赖pg_mooncake

conflict with duckdb_fdw

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.1.11817161514pg_duckdb-
RPMPIGSTY1.1.11817161514pg_duckdb_$v-
DEBPIGSTY1.1.11817161514postgresql-$v-pg-duckdb-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
d13.aarch64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u22.x86_64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u22.aarch64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u24.x86_64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u24.aarch64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1

构建

您可以使用 pig build 命令构建 pg_duckdb 扩展的 RPM / DEB 包:

pig build pkg pg_duckdb         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_duckdb 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_duckdb;          # 当前活跃 PG 版本安装
pig ext install -y pg_duckdb -v 18  # PG 18
pig ext install -y pg_duckdb -v 17  # PG 17
pig ext install -y pg_duckdb -v 16  # PG 16
pig ext install -y pg_duckdb -v 15  # PG 15
pig ext install -y pg_duckdb -v 14  # PG 14
dnf install -y pg_duckdb_18       # PG 18
dnf install -y pg_duckdb_17       # PG 17
dnf install -y pg_duckdb_16       # PG 16
dnf install -y pg_duckdb_15       # PG 15
dnf install -y pg_duckdb_14       # PG 14
apt install -y postgresql-18-pg-duckdb   # PG 18
apt install -y postgresql-17-pg-duckdb   # PG 17
apt install -y postgresql-16-pg-duckdb   # PG 16
apt install -y postgresql-15-pg-duckdb   # PG 15
apt install -y postgresql-14-pg-duckdb   # PG 14

预加载配置

shared_preload_libraries = 'pg_duckdb';

创建扩展

CREATE EXTENSION pg_duckdb;

用法

pg_duckdb 文档

主题说明
函数所有可用函数的完整参考
语法指南与注意事项常见 SQL 模式与注意事项速查
类型支持的数据类型与类型映射
扩展DuckDB 扩展的安装与使用
配置配置选项与参数
事务事务行为与限制

快速上手

使用 pig 安装 pg_duckdb:

pig repo set
pig install pg_duckdb

编辑 postgresql.conf,然后重启使配置生效

shared_preload_libraries = 'pg_duckdb'
duckdb.allow_community_extensions = true

加速查询

通过 DuckDB 可以直接查询现有的 PostgreSQL 表,无需做任何修改:

-- pgbench -is 1000  # 使用 pgbench 初始化一些测试数据
CREATE EXTENSION pg_duckdb;

-- 默认行为,使用 PostgreSQL 原生引擎
SET duckdb.force_execution = false;
EXPLAIN ANALYZE SELECT count(*) FROM pgbench_accounts;

-- 现在查询将由 pg_duckdb 执行
SET duckdb.force_execution = true;
EXPLAIN ANALYZE SELECT count(*) FROM pgbench_accounts;

在本地笔记本电脑的 4 核虚拟机上,查询耗时从 8 秒降至 4 秒:

postgres@el9:5432/postgres=# SET duckdb.force_execution = true;
EXPLAIN ANALYZE SELECT count(*) FROM pgbench_accounts;
SET
Time: 0.206 ms
                                              QUERY PLAN
------------------------------------------------------------------------------------------------------
 Custom Scan (DuckDBScan)  (cost=0.00..0.00 rows=0 width=0) (actual time=0.001..0.001 rows=0 loops=1)
   DuckDB Execution Plan:

 ┌─────────────────────────────────────┐
 │┌───────────────────────────────────┐│
 ││    Query Profiling Information    ││
 │└───────────────────────────────────┘│
 └─────────────────────────────────────┘
 EXPLAIN ANALYZE  SELECT count(*) AS count FROM pgduckdb.public.pgbench_accounts
 ┌────────────────────────────────────────────────┐
 │┌──────────────────────────────────────────────┐│
 ││               Total Time: 3.89s              ││
 │└──────────────────────────────────────────────┘│
 └────────────────────────────────────────────────┘
 ┌───────────────────────────┐
 │           QUERY           │
 └─────────────┬─────────────┘
 ┌─────────────┴─────────────┐
 │      EXPLAIN_ANALYZE      │
 │    ────────────────────   │
 │           0 rows          │
 │          (0.00s)          │
 └─────────────┬─────────────┘
 ┌─────────────┴─────────────┐
 │    UNGROUPED_AGGREGATE    │
 │    ────────────────────   │
 │        Aggregates:        │
 │        count_star()       │
 │                           │
 │           1 row           │
 │          (0.00s)          │
 └─────────────┬─────────────┘
 ┌─────────────┴─────────────┐
 │         TABLE_SCAN        │
 │    ────────────────────   │
 │           Table:          │
 │      pgbench_accounts     │
 │                           │
 │      100,000,000 rows     │
 │          (3.88s)          │
 └───────────────────────────┘

数据湖

以下示例演示如何使用本地 MinIO 实例操作数据湖:

SELECT duckdb.create_simple_secret(
    type := 'S3', key_id := 's3user_data', secret := 'S3User.Data',
    endpoint := 'https://sss.pigsty:9000', url_style := 'path'
);

83 - pg_mooncake

PostgreSQL列式存储表

概览

扩展包名版本分类许可证语言
pg_mooncake0.2.0OLAPMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
2440pg_mooncake-
相关扩展pg_duckdb pg_duckdb duckdb_fdw pg_analytics columnar citus_columnar pg_parquet orioledb timescaledb

unpublished release

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.2.01817161514pg_mooncakepg_duckdb
RPMPIGSTY0.2.01817161514pg_mooncake_$v-
DEBPIGSTY0.2.01817161514postgresql-$v-pg-mooncake-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
d12.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
d13.x86_64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
d13.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
u22.x86_64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
u22.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
u24.x86_64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
u24.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0
PIGSTY 0.2.0

构建

您可以使用 pig build 命令构建 pg_mooncake 扩展的 RPM / DEB 包:

pig build pkg pg_mooncake         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_mooncake 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_mooncake;          # 当前活跃 PG 版本安装
pig ext install -y pg_mooncake -v 18  # PG 18
pig ext install -y pg_mooncake -v 17  # PG 17
pig ext install -y pg_mooncake -v 16  # PG 16
pig ext install -y pg_mooncake -v 15  # PG 15
pig ext install -y pg_mooncake -v 14  # PG 14
dnf install -y pg_mooncake_18       # PG 18
dnf install -y pg_mooncake_17       # PG 17
dnf install -y pg_mooncake_16       # PG 16
dnf install -y pg_mooncake_15       # PG 15
dnf install -y pg_mooncake_14       # PG 14
apt install -y postgresql-18-pg-mooncake   # PG 18
apt install -y postgresql-17-pg-mooncake   # PG 17
apt install -y postgresql-16-pg-mooncake   # PG 16
apt install -y postgresql-15-pg-mooncake   # PG 15
apt install -y postgresql-14-pg-mooncake   # PG 14

预加载配置

shared_preload_libraries = 'pg_duckdb, pg_mooncake';

创建扩展

CREATE EXTENSION pg_mooncake CASCADE;  -- 依赖: pg_duckdb

用法

pg_mooncake 是一个 Postgres 扩展,能够为表创建 Iceberg 格式的列存镜像,设计为 pg_duckdb 的子扩展。

pg_mooncake 文档:https://docs.mooncake.dev/

快速上手

使用 pig 安装 pg_duckdb 和 pg_mooncake:

pig repo set
pig install pg_duckdb pg_mooncake

编辑 postgresql.conf,然后重启使配置生效

shared_preload_libraries = 'pg_duckdb,pg_mooncake'
duckdb.allow_community_extensions = true
wal_level = logical

入门示例

-- 连同 pg_duckdb 一起创建扩展
CREATE EXTENSION pg_mooncake CASCADE;

-- 接下来,创建一张普通的 Postgres 表 trades:
CREATE TABLE trades(
  id bigint PRIMARY KEY,
  symbol text,
  time timestamp,
  price real
);

-- 然后,创建一个列存镜像 trades_iceberg,与 trades 保持同步:
CALL mooncake.create_table('trades_iceberg', 'trades');

-- 现在,向 trades 中插入一些数据:
INSERT INTO trades VALUES
    (1,  'AMD', '2024-06-05 10:00:00', 119),
    (2, 'AMZN', '2024-06-05 10:05:00', 207),
    (3, 'AAPL', '2024-06-05 10:10:00', 203),
    (4, 'AMZN', '2024-06-05 10:15:00', 210);

-- 最后,使用 duckdb 进行查询
EXPLAIN
    SELECT avg(price) FROM trades_iceberg WHERE symbol = 'AMZN';

执行计划中将显示 DuckDBScan:

                         QUERY PLAN
------------------------------------------------------------
 Custom Scan (DuckDBScan)  (cost=0.00..0.00 rows=0 width=0)
   DuckDB Execution Plan:

 ┌───────────────────────────┐
 │    UNGROUPED_AGGREGATE    │
 │    ────────────────────   │
 │    Aggregates: avg(#0)    │
 └─────────────┬─────────────┘
 ┌─────────────┴─────────────┐
 │         PROJECTION        │
 │    ────────────────────   │
 │   CAST(price AS DOUBLE) │                           │
 │          ~0 rows          │
 └─────────────┬─────────────┘
 ┌─────────────┴─────────────┐
 │       MOONCAKE_SCAN       │
 │    ────────────────────   │
 │   Table: trades_iceberg   │
 │     Projections: price    │
 │                           │
 │          Filters:         │
symbol='AMZN' │                           │
 │          ~0 rows          │
 └───────────────────────────┘

84 - storage_engine

带向量化执行的 colcompress 与 rowcompress 表访问方法

概览

扩展包名版本分类许可证语言
storage_engine1.0.7OLAPAGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
2450storage_engineengine

release 1.0.7; SQL v1.0

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.0.71817161514storage_engine-
RPMPIGSTY1.0.71817161514storage_engine_$v-
DEBPIGSTY1.0.71817161514postgresql-$v-storage-engine-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
PIGSTY 1.0.7
el9.aarch64.pg17 : storage_engine_17