MySQL’de SOUNDS LIKE ve SOUNDEX

Merhaba arkadaşlar, bu yazımda ve videomda sizlere LIKE dışında kullanabileceğiniz 2 alternatifi göstermek istiyorum. Öncelikle neden ne için kullanmamız gerek onu bir açıklayayım.

Örnek vermek gerekirse sizin bir e-ticaret siteniz olsun. Ve kullanıcı ürün aramak için arama input’une iphone yazıp arattı. Ama oda ne? Bir başka kullanıcı iphone yazmayı beceremedi ve “iphon” ya da “iphom” gibi kelimeler yazdı. Bu durumda sizin şu basit mysql sorgunuz ne döndürecektir sizce?

SELECT * FROM products
WHERE brand LIKE '%iphom%'

Ben söyleyeyim, hiçbir veri bulunamayacak. Eğer kullanıcı “ipho” yazıp bıraksaydı bulunabilirdi ama “iphom” yazınca “iphone” kelimesinden bağımsız bir hal aldı. Ama baktığınızda kulağa hala iphone gibi geliyor değil mi? İşte bu kulağa gelene göre arama yapmak istersek SOUNDS LIKE ve SOUNDEX kullanmamız gerekecek. Şimdi gelelim bu arkadaşlara..

SOUNDS LIKE

Bunu türkçede “.. gibi geliyor” olarak çevirebiliriz. Örnek bir sorgu yapalım.

SELECT * FROM products
WHERE brand SOUNDS LIKE 'iphome'

Bu sorgunun sonucunda iphone markası altında bir ürün var ise gelecektir. Ancak SOUNDS LIKE’ın bir dezavantajı var, eğer kullanıcı “ipho” yazıp aratırsa SOUNDS LIKE çalışmaz çünkü tam olarak kelime kadar yazıp kelimeleri yanlış yazarsanız çalışıyor. Yani mevcut kelimeyi bir şeye benzetemediği için bulamıyor. Bu bağlamda SOUNDS LIKE bize arifeyi gösterdi, ama bayramı göstermedi..

Ama durun! daha bitmedi. Sizin sorununuzu çözecek arkadaş, birkaç yardımcı fonksiyon kullanımıyla SOUNDEX olacak. Ama önce gelin bu SOUNDEX nedir bir anlayalım..

SOUNDEX

SOUNDEX sesin İngilizce telaffuzundan sonra isimleri endekslemek için kullanılan fonetik bir algoritmadır. Yani kelimeleri belli bir algoritmada aramamızı sağlıyor. Şimdi örnek vermek gerekirse;

SELECT SOUNDEX('iphone'), SOUNDEX('iph');

Bu sorguyu çalıştırdığımızda bize I150 ve I100 değerlerin verecek. O zaman “iphone” ifadesinin SOUNDEXdeğeri I150 imiş. Şimdi “iph” kelimesinin ise I100’müş. Aslında burada 0’ları kaldırdığımızda I1 kalıyor. Yani “iphone” kelimesinin I150 SOUNDEX değeriyle başlangıç değerleri aynı. Yani iki ifade birbiriyle uyuşuyor demek oluyor. O zaman sorguyu yazmadan önce mysql’de TRIM fonksiyonunu kullanarak 0 değerini kaldırmayı öğrenelim.

SELECT TRIM(TRAILING '0' FROM 'I100')

Bu sorgu bize sonuç olarak I1 değerini döndürecek. TRAILING ifadesi “sondaki” demektir. Yani sondaki “0” değerlerini kaldırmış olduk. Şimdi bunları toplayıp sorgumuzu yazalım.

SELECT * FROM products
WHERE SOUNDEX(brand) LIKE CONCAT(TRIM(TRAILING '0' FROM SOUNDEX('iphome')), '%');

Not: CONCAT() fonksiyonu 2 ifadeyi birleştirip tek ifade haline getirmek için kullanılıyor.

Sonuç olarak kullanıcınız “iphome” yazdığında iphone markasına ait ürünleri listeleyecek bu sorgumuz. Kullanıcı “iphone”,”ivhone”, “iphane”, “iphano” gibi ifadelerle arama yapsada yine de inatla “iphone” markasına ait ürünler listelenecektir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir