İlk önce bu ihtiyaç sphinx ile doğdu onu söylim, Sphinxten aldığım ID’ler RANK ve ORDER moda göre zaten dizilmiş, fakat bunu mysql’e gönderdikten sonra bir ORDER işlemi yapmıyorsak, tablomuzun varsayılan dizilişine göre geliyor, yani elimizde ilk 10 oluyor, fakat bu ilk 10 arasındaki sıralamayı sphinx yapmış da biz bunu mysql’e gönderdikten sonra order değişiyor, sphinx gibi dizmek istediğimizde ne yapabiliriz diye araştırıyordum, ilk akla gelen her ID için tekrar veritabanına gitmek, tekrar gitmemek için bir çözüm de uniuon, ama ikisi de performansın taban yaptığı işlemler, mysqlde bunun çok güzel bir çözümü var,
0 | FIELD() |
php’deki array_search getirebilir akıllara ama fonksiyonun tam olarka nasıl çalıştığını anlamak için şunu deneyebilirsiniz
0 | SELECT FIELD(1,0,2,3,1,5,6) |
ilk değerin sonraki kaçıncı parametre olduğunu dönüyor, yani yukarıdakinin sonucu 4, 0 id gelirse bu 1, buna göre dizdiğimiz de gerçekten satır istediğimiz sırada geliyor, aklımızda Search to Item, countlarını tutarak bir populerite sistemi vardı, bu populeriteye bunu da eklediğimizde kesinlikle daha kaliteli sonuçlar alacağız.
Örnek bir php kodu
0 1 2 3 4 5 6 7 8 9 10 11 12 | $sp = new SphinxClient(); $sp->SetServer('localhost',3312); $sp->SetMatchMode(SPH_MATCH_ANY); $sp->SetRankingMode(SPH_RANK_WORDCOUNT); $sp->SetLimits(0,10); $result = $sp->Query('hello world'); if($result['total_found'] > 0) { $found_ids = implode(',',array_keys($result['matches'])); $q_result = $db->query("SELECT * FROM items WHERE id in({$found_ids}) ORDER BY FIELD(id,{$found_ids})"); } |
gerçek bir order oldu tşkler mysql (:
Bu fonksiyonu array_search’e benzetmemden dolayı bir deneme daha yaptım (:
0 | SELECT FIELD('test','t','te','tes','test') |
sonucun burda da 4 gelmesi fonksiyonu anladığımızı gösteriyor.








