Apa itu Full-Text Search?
Full-text search (FTS) memungkinkan pencarian teks yang lebih cerdas daripada LIKE. FTS memahami kata, stemming, dan ranking relevansi.
LIKE vs Full-Text Search
-- LIKE: sederhana tapi lambat dan terbatas
SELECT * FROM articles WHERE body LIKE '%database%';
-- ❌ Tidak bisa ranking
-- ❌ Tidak memahami "databases", "databased"
-- ❌ Lambat tanpa index (full table scan)
-- Full-text search: cerdas dan cepat
SELECT * FROM articles
WHERE to_tsvector('indonesian', body) @@ to_tsquery('database');
-- ✅ Memahami stemming
-- ✅ Bisa ranking berdasarkan relevansi
-- ✅ Bisa di-index
PostgreSQL Full-Text Search
-- Buat kolom tsvector untuk pencarian cepat
ALTER TABLE articles ADD COLUMN search_vector tsvector;
-- Update search vector
UPDATE articles SET search_vector =
setweight(to_tsvector('indonesian', coalesce(title, '')), 'A') ||
setweight(to_tsvector('indonesian', coalesce(body, '')), 'B');
-- Index pada search vector
CREATE INDEX idx_articles_search ON articles USING GIN(search_vector);
-- Query dengan ranking
SELECT title,
ts_rank(search_vector, query) AS rank
FROM articles,
to_tsquery('database & design') query
WHERE search_vector @@ query
ORDER BY rank DESC;
Alternatif Full-Text Search
- PostgreSQL FTS — built-in, cukup untuk kebanyakan kasus
- Elasticsearch — powerful, distributed, real-time. Untuk skala besar
- Meilisearch — cepat, mudah setup, typo-tolerant. Cocok untuk search bar
- Algolia — hosted, sangat cepat, tapi berbayar
Laravel whereFullText()
Laravel menyediakan method whereFullText() untuk full-text search menggunakan MATCH AGAINST (MySQL) atau tsvector (PostgreSQL):
// Buat fulltext index di migration
$table->fullText(["title", "body"]);
// Query dengan whereFullText
Article::whereFullText(["title", "body"], "database design")->get();
Tips
- Gunakan weighting — title lebih penting dari body
- Gunakan GIN index untuk performa
- Pertimbangkan trigram index untuk pencarian fuzzy/typo