pg_sift 1.0.0: the first release, an exact BM25 full-text index access method (USING sift) for PostgreSQL 18.

Highlights

  • Search: @@> queries with AND, OR, NOT, phrases, prefix, wildcard, regex and fuzzy terms; exact BM25 scores and top-k with ORDER BY sift.score(ctid) DESC LIMIT k, and count(*) straight from the index.
  • Fast and small: two-level bitmap postings by heap ctid with block-max pruning. On 218k Wikipedia articles the default index is 48 MiB against pg_search’s 183 MiB; AND/OR run 2.35x / 1.84x and joins 3.7x faster. Phrases and count(*) are behind (0.74x / 0.70x) with the default index; the optional phrase_index = pairs wins them (3.6x / 3.2x) at a 267 MiB index.
  • Plain PostgreSQL: case and accent folding, stemming, expression indexes, parallel CREATE INDEX, VACUUM, REINDEX CONCURRENTLY, pg_dump, same-major pg_upgrade, crash-safe and physical-replica safe (generic WAL), no shared_preload_libraries.

Compatibility

  • PostgreSQL 18 only; x86-64; build from source with make USE_PGXS=1 (no packages for this release).
  • Known limits: no multicolumn, unique or non-text indexes, no index-only scans, sift.score() through a partitioned parent is not supported (fixed in 1.1.0).

Benchmarks (shared, loaded host; reproduce with bench/bench all). Every change: CHANGELOG.md.