Dediğim gibi performansı kötü etkiler. PHP'de çok basitçe yapabileceğini düşünüyorum. while ile döndürürken dediğim gibi pozisyon alma işlemi yaparsın. X ve Y match ise, skor 1 verirsin, değilse 0. Sonra array'e alırsın, array'i skora göre sıralarsın. Çözemezsen örnek atayım.

Zahmet olmazsa süper olur.

Ayrıca bunu php ile de döndürerek skorlayabilirsin. Ben genelde çok komplike skorlama gerektiren şeylerde, tek query ile tüm datayı array'e alıp, php de döndürerek skorlayarak formata sokuyorum. Çok daha hızlı olur. SQL'de strpos, replace, levenshtein gibi olaylar php ye nazaran çok daha yavaş işliyor doğal olarak.

sorgularken on iki or on or iki gibi bir kod kullanıyorum diyelim. Arama sonuçlarında ilk önce on iki ile aradıklarım gelsin daha sonra on ile aradıklarım en sonda iki ile aranılanlar bu şekilde nasıl sıralama yapabilirim. hepsi aynı sütünda aranacak.

Ozcan' Alıntı:

Angelo aramayı like ile on or iki şeklinde yaptırıyorum. İki sütunda birisi başlık birisi mesaj alanları. 50 bin kayıt var. Arama sonuçlarını or la ayırdığım için alakasız mesajlar ilk sıralara geliyor bunun için ilk önce konu ile alakası daha yakın olan örnekteki gibi on iki lerin ilk sıraya gelmesini sağlamaya çalışıyorum.

LIKE ile mi yapıyorsun, tablo büyükse performansı fena yapar. Full Text Matching daha mantıklı. Like ile or'layarak sıralıyorsan illa yapılabilecek bir kaç şey var. INSTR ya da POSITION ile tek tek kelime1, kelime2 ve kelime1+kelime2 ye göre pozisyon alırsın, kelime1+kelime2 ye göre pozisyon 0'dan büyükse bir score column'u açarsın. Sonra o column'a göre DESC sıralarsın. SELECT INSTR AS pozisyon; mysql syntax'ini tam bilmiyorum postgre de şöyle birşey yazılabilir SELECT CASE WHEN STRPOS != '0' THEN '1' END as match1; Ikinci bir yaklaşım eğer uzun satırlar değilse bunlar, ne bliyim isim içinde arıyorsan mesela, soundex veya Levenshtein uzaklığı da kullanılabilir. Tabi en iyisi full matching, bunlar çok performans gerektiren lüzumsuz işlemler.

iyinet' Alıntı: