pg_textsearch
pg_textsearch : Full-text search with BM25 ranking
Overview
| ID | Extension | Package | Version | Category | License | Language |
|---|---|---|---|---|---|---|
| 2180 | pg_textsearch | pg_textsearch | 1.2.0 |
FTS | PostgreSQL | C |
| Attribute | Has Binary | Has Library | Need Load | Has DDL | Relocatable | Trusted |
|---|---|---|---|---|---|---|
| --sLd-- | No | Yes | Yes | Yes | no | no |
| Relationships | |
|---|---|
| See Also | pg_search pg_bestmatch vchord_bm25 pg_fts pgroonga pg_rrf psql_bm25s pgcontext vectorize |
Packages
| Type | Repo | Version | PG Major Compatibility | Package Pattern | Dependencies |
|---|---|---|---|---|---|
| EXT | PIGSTY | 1.2.0 |
18 17 16 15 14 | pg_textsearch |
- |
| RPM | PIGSTY | 1.2.0 |
18 17 16 15 14 | pg_textsearch_$v |
- |
| DEB | PIGSTY | 1.2.0 |
18 17 16 15 14 | postgresql-$v-textsearch |
- |
| Linux / PG | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|
| el8.x86_64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| el8.aarch64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| el9.x86_64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| el9.aarch64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| el10.x86_64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| el10.aarch64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| d12.x86_64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| d12.aarch64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| d13.x86_64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| d13.aarch64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| u22.x86_64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| u22.aarch64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| u24.x86_64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| u24.aarch64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| u26.x86_64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
| u26.aarch64 | PIGSTY 1.2.0 | PIGSTY 1.2.0 | N/A | N/A | N/A |
Source
github.com/timescale/pg_textsearch
pg_textsearch-1.2.0.tar.gz
Install
Make sure PGDG and PIGSTY repo available:
Install this extension with pig:
Config this extension to shared_preload_libraries:
Create this extension with:
Usage
Sources: README v1.2.0, v1.2.0 release notes
pg_textsearch provides BM25-ranked full-text search for PostgreSQL with a bm25 access method and the <@> scoring operator. Upstream marks v1.2.0 as production ready.
v1.2.0 supports PostgreSQL 17 and 18. Prebuilt release assets are published for both PostgreSQL versions on Linux and macOS. The extension must be loaded through shared_preload_libraries before CREATE EXTENSION.
Enable the Extension
Install the new binary and restart PostgreSQL before running an extension upgrade:
The v1.2.0 release adds physical replication support and correctness fixes for update-heavy workloads. Install the matching binary and run the SQL extension upgrade before relying on the new version.
Build and Query BM25 Indexes
<@> returns the negative BM25 score because PostgreSQL operator index scans are ascending; lower values are better matches. Use ORDER BY ... LIMIT for fast top-k searches.
For an explicit index reference, use to_bm25query():
The main documented SQL surface is:
text <@> 'query'to score text with planner-detected index context.text <@> bm25queryto score with an explicitbm25query.to_bm25query(text)for ORDER BY use with planner-selected index context.to_bm25query(text, text)for query text plus index name.bm25query = bm25queryfor equality checks.
Index Options and Data Shapes
Index options are text_config (required), k1 (default 1.2), and b (default 0.75). Text search configurations such as english, simple, french, and german use PostgreSQL text search configuration names.
The extension supports native array input for text[], varchar[], and bpchar[] columns; array elements are concatenated before tokenization.
Expression indexes support immutable text expressions, including JSONB extraction, text transformations, and multi-column concatenation:
Partial indexes scope search to a subset of rows. Query them with an explicit index name:
Operations and GUCs
bm25_force_merge(index_name) consolidates all segments into one and is best used after bulk loads, not during steady write traffic. bm25_memory_usage() reports shared memory usage for memtables.
Documented pg_textsearch GUCs in v1.2.0 include:
pg_textsearch.default_limitpg_textsearch.compress_segmentspg_textsearch.segments_per_levelpg_textsearch.memory_limitpg_textsearch.bulk_load_thresholdpg_textsearch.memtable_spill_threshold(deprecated; usememory_limitfor new deployments)
pg_textsearch.memory_limit defaults to 2GB and caps dynamic shared memory used by memtables. The README also documents bm25_spill_index(index_name), bm25_dump_index(index_name), and bm25_summarize_index(index_name) as development or diagnostic helpers.
Caveats
pg_textsearchrequiresshared_preload_libraries = 'pg_textsearch'and a PostgreSQL restart beforeCREATE EXTENSION.- The
bm25access method name conflicts withpg_searchandvchord_bm25; avoid installing those BM25 access-method extensions into the same database. - Inside PL/pgSQL and stored procedures, the implicit
text <@> 'query'form does not use planner hooks; upstream says to useto_bm25query()with an explicit index name there. - Phrase queries are not native because the index stores term frequencies, not term positions; use BM25 ranking plus a post-filter for phrase-like matching.
- Partial indexes require
to_bm25query()with the index name because the implicit query form skips them. - BM25 indexes on partitioned tables use partition-local statistics, so cross-partition scores may not be directly comparable.
- Words longer than PostgreSQL’s
tsvectorword length limit are ignored during tokenization. pg_textsearchuses fixed LWLock tranche IDs 1001-1008; another extension using the same fixed IDs can make wait-event names inaccurate.