İçeriğe atla

Mysql’de arama – 1

Yazı yazmayalı çok uzun zaman oldu, bu arada birçok yoğunluk, koşuşturma oldu ama güzel bir tatil geçirme imkanı da buldum. Geri geldiğimde karşıma çıkan bir problem, “mysql ile nasıl arama yapılır?” nasıl arama yapılırın cevabı kolay ama yapılan aramanın sonuçları ne kadar tatmin edici olur? Bir nevi arama motoru sorusu. Arama motorları da size milyarlarca sonuç gösterebilir ama arkada yatan zekaya sorulan soru “milyarlarca sonucun arasından insanların ‘işte buldum’ diyeceği sonucu göstermek”. Olmak yada olmamak gibi birşey.

Ben de bu soruları düşünürken bulduğum öncelikli mysql arama fonksiyonunu yazmak istedim.

1- Select like % % ve regular expressions (düzenli ifadeler) kullanarak arama:

Mysql’de basit string aramalarında kullanacağımız fonksiyon bir select ifadesi.

Örn: select * from wp_users where users_email like '%hotmail.com%';

Bu şekilde içinde hotmail.com ifadesi geçen bütün satırları alabiliyorsunuz. Örneğin aradığınız şeyin satırın başında yada sonunda olmasını istiyorsanız:

Örn: select * from wp_users where users_email like 'mehmet%';

Bu şekilde mysql’de arama yaptığınız zaman, mehmet ile başlayan bütün satırları istiyorsunuz. Satır içinde arama yaptığınız ifadenin nerede olduğunu ‘%%’ ile oynayarak yapabilirsiniz.

2- Select match against ile arama yapmak:

İşte bu noktaya geldiğiniz zaman artık birkaç basamak çıkmış oluyorsunuz. Bu ifadede match against diye kullandığımız fonksiyon, mysql mühendisleri tarafından tasarlanmış bir algoritmaya göre size benzerlik puanı çıkartıyor.

Örneğin:
Arama yapılan ifade: mysql arama
Satır 1: mysql’de arama yapmak, yapmamak, olmak yada olmamak
Satır 2: mysql’de gelmek gitmek dalmak çıkmak, olmak yada olmamak

Select match against ile yaptığınız bir sorguda, veritabanındaki herbir satır için size bir puan skalası çıkartılıyor. Gerçek bir sorgu satırı ekliyorum çünkü bu fonksiyon çok önemli:

select match(title_tag) against('Mysql\'de arama yapıyorum') as arama_puani from mysql where match(title_tag) against('Mysql\'de arama yapıyorum') > 7

Burada match() fonksiyonun syntax’i şu şekilde:
match(veritabanındaki_kolon) against(‘arama yaptığınız ifade’)

İpler sizin elinizde tabi biraz araştırma yapmanız gerekiyor. İplerin elinizde olması şöyle, mysql size match against kalıbını kullandığınızda bütün satırlar için bir puan çıkartıyor. Bu rakam 0’dan 50’ye, 100’e kadar çıkabiliyor. Bu çıkan sonuçları sizin nasıl bir sonuç istediğinize göre şekillendirmeniz gerekiyor. Örneğin ben puanı 3’ün altında çıkan satırları hiç önemsemiyorum diyebilirsiniz.

WordPress Related Posts (benzer yazılar) eklentisi
Bu sitede ve wordpress’te çok kullanılan “related posts” (benzer yazılar) eklentisi bu mantığa dayanıyor. Ziyaretçinin okuduğu yazının _content kısmı, aynı tablonun aynı kolonuna match against yapılıyor. Orada belirttiğiniz benzerlik puanına göre (örneğin ben 5 kullanıyorum) eğer çıkan sonuçlar 5’in üstündeyse, ilk 5 taneyi gösteriyorum. Eğer 5’in altındaysa, “Benzer yazı bulunamadı” diye bir not çıkıyor.

Related posts eklentisinden bakarsanız karşınıza şöyle bir sorgu çıkıyor:
$sql = "SELECT ID, post_title, post_content,"
. "MATCH (post_name, post_content) "
. "AGAINST ('$terms') AS score "
. "FROM $wpdb->posts WHERE "
. "MATCH (post_name, post_content) "
. "AGAINST ('$terms') "
. "AND post_date < = '$now' " . "AND (post_status IN ( 'publish', 'static' ) && ID != '$post->ID') ";

Sonuç:

Mysql’in sağladığı arama fonksiyonlarından bence en yakın olanı bu gözüküyor. Örneğin şöyle bir senaryo düşünebilirsiniz. Sitenize bir ziyaretçi geldi ve “mysql’de arama” diye arattı. Bunu öncelikli olarak sadece bir like ” içinde kullanmak daha sonra da like ‘%%’ içinde kullanmak mantıklı olur. Buradan çıkan iki sonucu harmanladınız. Ekstra olması için son 4-5 sonucu da, mysql match against ile doldurmak güzel olur. Böylelikle aranan kelimelerin;
-direk yazının tamamında olup olmadığına
-yazının bir kısmında geçip geçmediğine
-alternatif olabilecek benzerlikteki yazılara

göre kıyaslamasını yapmış olursunuz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.

css.php