Benim kullandığım yol ise MySQL Full-Text Search. Herhangi bir tabloya eklemek için migrasyona (ya da migrasyon varsa ayrı bir migrasyonla) şöyle ekleyebilirsiniz:
DB::statement('ALTER TABLE siteler ADD FULLTEXT search(site_url, site_adi, site_tanitimi, keywords)');
Daha sonra arama yapmak için örneğin
// Arama kelime(leri)
$q = $request->get('q');
// Kelimeleri parçalayalım
$words = explode(' ', $q);
// Tekrar eden kelimeleri temizleyelim
$words = array_unique(array_filter($words));
// Her kelimenin başına + ekleyelim (Full-Text arama operatörü)
$words = '+' . implode(' +', $words);
$result = Siteler::with('kategories')
->whereRaw("MATCH(site_url, site_adi, site_tanitimi, keywords) AGAINST(? IN BOOLEAN MODE)", [$words])
->selectRaw("MATCH(site_url, site_adi, site_tanitimi, keywords) AGAINST (?) as relevance", [$q])
->orderBy('relevance', 'DESC')
->paginate(5);
Bunun hız, daha isabetli sonuçlar elde etme ve bunun gibi birçok avantajı var.
Örneğin üstte
selectRaw("MATCH(site_url, site_adi, site_tanitimi, keywords) AGAINST (?) as relevance", [$q]) kısmında
relevance alanı size bir float değer veriyor ve bu aranan kelimelere göre sonucun ne kadar isabetli olduğunu gösteriyor.
Bu değer ne kadar yüksek ise arama kelimeleri ile sonuç o kadar alakalı demektir. Ben onu kullanarak DESC ile tersten sıraladığım için en alakalı sonuçlar en önde çıkıyor.
Doğal olarak aradığım bir kelime bir içerikte 10 kere diğerinde 5 kere geçiyorsa 10 kere geçeni önce görmek isterim.
Arama modları, arama operatörler vs için:
https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html
Bu da burada dursun, biri sorarsa bu posta link veririm artık