Implementing Search Functionality

1. Implementing Basic Search Logic

SELECT id, title FROM articles
WHERE title ILIKE '%' || :q || '%'
   OR body  ILIKE '%' || :q || '%'
LIMIT 50;
Warning: Leading-wildcard LIKE prevents B-tree index use; switch to FTS or trigram index for scale.

Example: PostgreSQL tsvector

ALTER TABLE articles ADD COLUMN tsv tsvector
  GENERATED ALWAYS AS (
    setweight(to_tsvector('english', title), 'A') ||
    setweight(to_tsvector('english', body),  'B')
  ) STORED;
CREATE INDEX articles_tsv_idx ON articles USING GIN(tsv);

SELECT id, title, ts_rank(tsv, q) AS rank
FROM articles, plainto_tsquery('english', :q) q
WHERE tsv @@ q
ORDER BY rank DESC LIMIT 20;

3. Implementing Search Indexing

ModeDetail
SynchronousIndex inside write transaction; simple but slows writes
Async (outbox)Write event, process to index
CDCDebezium → Elasticsearch sink
Reindex jobPeriodic full rebuild

4. Implementing Search Filters

TypeDetail
TermExact match (status, category)
RangeDate / numeric ranges
GeoWithin radius / bounding box
Boolean combosAND/OR/NOT
Multi-selectFacets

5. Implementing Search Pagination

MethodDetail
from + sizeOK to ~10k results
search_afterDeep pagination, cursor-based
scrollSnapshot iteration (export)
PIT (point in time)Modern stable cursor

6. Implementing Search Ranking

FactorDetail
TF-IDF / BM25Default relevance scoring
Field boostsTitle weighted > body
RecencyDecay function on date
PopularityClick/view signals
PersonalizationUser preferences boost
Learning to RankML on engagement signals

Example: Elasticsearch aggregations

{
  "query": { "match": { "title": "laptop" } },
  "aggs": {
    "brand":    { "terms": { "field": "brand.keyword", "size": 20 } },
    "price":    { "histogram": { "field": "price", "interval": 100 } },
    "in_stock": { "filter": { "term": { "in_stock": true } } }
  }
}

8. Implementing Auto-Complete

ApproachDetail
Edge n-gramsIndex prefixes
Completion suggesterElasticsearch FST-based, very fast
Trie in RedisLightweight self-managed
Top-N popularBoost by query frequency

9. Implementing Search Suggestions

TypeDetail
Did-you-meanLevenshtein distance
PhoneticSoundex, Metaphone
SynonymsSynonym filter at index time
Related queriesCo-occurrence in session logs

10. Implementing Search Result Highlighting

Example: Elasticsearch highlight

{
  "query": { "match": { "body": "performance" } },
  "highlight": {
    "fields": { "body": { "fragment_size": 120, "number_of_fragments": 2 } },
    "pre_tags":  ["<mark>"],
    "post_tags": ["</mark>"]
  }
}

11. Implementing Search Analytics

TrackUse
Top queriesTrends
Zero-result rateIdentify gaps
CTR per positionRank quality
Refinement rateInitial relevance
Latency p99Performance

12. Integrating Search Engines (Elasticsearch)

ComponentRole
Index templateMappings + settings per index pattern
ILMLifecycle: hot → warm → cold → delete
AliasesZero-downtime reindex
PipelinesIngest-time enrichment
Java clientelasticsearch-java typed API