- One column per index — Create a separate TIN index for each searchable column (or expression). Combine columns in a query with multiple
==>predicates.tin.score(ctid)combines scores across those fields. - Partitioned tables — TIN indexes on partitioned tables are supported, and querying the parent works when every partition has a TIN index. BM25 scores are computed per partition (each partition has its own corpus statistics), so ordering by score across partitions mixes scores from different subsets. Some query shapes that pass
tin.scorethrough aggregates or window functions against the parent are refused with an error that names the workaround: compute the score in aMATERIALIZEDCTE (or query a single partition) and consume it above. - Index relation size — The index relation grows to a high-water mark and does not shrink on its own. Space freed by deleted and updated rows is reused internally, and
REINDEXis the only way to shrink it. Measure it withpg_relation_size('<index name>').CREATE INDEX CONCURRENTLY,REINDEX, andREINDEX CONCURRENTLYare supported. - Tokenizer — Tokenization is configured per index via
WITH (…)(see Index options). After changing analysis options on a populated index,REINDEXso existing rows are re-tokenized.tin.tokenizeaccepts the same arguments. - Read replicas — On physical standbys, set
hot_standby_feedback = on. Standby results are exact. Under heavy replay a query can be cancelled with SQLSTATE40001(serialization failure) and should be retried.
Reference
Limitations
Constraints on TIN indexes.

