Use a dedicated search engine — Elasticsearch/OpenSearch built on an inverted index — fed from your source DB via CDC, and shard the index for scale. Your primary database (Postgres/MySQL) can't do relevance-ranked text search over hundreds of millions of rows; a LIKE '%term%' scans every row. A search engine inverts the problem.
Source DB ─▶ CDC (Debezium) ─▶ Kafka ─▶ Indexer ─▶ Elasticsearch/OpenSearch
(Postgres) (change stream) ├─ Shard 0 (inverted index) + replicas
├─ Shard 1
Query ─▶ Coordinator ─▶ scatter to shards ─▶ gather ─┴─ Shard N ── ranked by BM25
