MySQL’de “Daha” Akıllı Arama Yapma




Klasik arama yöntemlerinde SQL’in bizlere sağlamış olduğu “Where Like” operatörünü hepimiz kullanmışızdır. Bu arama yönteminde metin alanlarının içinde bulunan kelimelere odaklanarak arama yapar. Bunu örneklerle açıklamak gerekirse:

SELECT * FROM Table_Name
WHERE Column LIKE ‘Kırmızı’

Bu örnekte Like komutu tam eşleşme aramaktadır. Sütun içinde yalnızca “Kırmızı” bulunmalıdır.

Yukarıdaki örnek üzerinden devam edelim. Arama yapacağımız alanın sadece başlangıç değerini biliyoruz gerisini tam olarak bilmiyorsak eğer:

SELECT * FROM Table_Name
WHERE Column LIKE ‘Kırmızı%’

Sonuç:
Kırmızı Ayakkabı
Kırmızı Pantolon

% işareti Kırmızı ile başlayan tüm kayıtları bize listeler. Kayıtların sadece Kırmızı ile başlaması gerekmektedir. Tam tersi olarak sonu Kırmızı ile biten kayıtları listelemek istersek eğer;

SELECT * FROM Table_Name
WHERE Column LIKE ‘%Ayakkabı’

Sonuç:
Kırmızı Ayakkabı

Burada da % işaretini baş tarafa yazmış olduk. Bu sorgu ile sonu Kırmızı ile biten tüm kayıtlar listelenecektir. Başlangıç değeri ya da bitiş değerine göre değilde içerisinde geçen bir değere göre arama yapmak isteyebilirsiniz. Bunun için arama yapacağınız harf ya da kelimenin başına ve sonuna % ifadesini koymamız gerekecetir. En sık kullanılan yöntemi olduğunu da söyleyebiliriz.

SELECT * FROM Table_Name
WHERE Column LIKE ‘%Kırmızı%’

Sonuç:
Kırmızı Ayakkabı
Kırmızı Pantolon
Mavi-Kırmızı Gömlek

Buraya kadar olan bölümde Where Like operatörünü incelemiş olduk. Where Like operatöründe 3. yöntem de dahil olmak üzere bazı arama sonuçlarında sonuç veremediği, yani tıkandığı olmaktadır. Örnek olarak “Mavi Gömlek” aramasına sonuç vermeyecektir. Mavi gömlek örneği gibi spesifik bir çok alana etki etmektedir. Teknolojik ürünlerin listelendiği bir sql sorgusunda ürün başlıkları standart olarak akıllı telefonlar marka model isimleri ile listelenir. Kategorisel olarak akıllı telefon kategorisinde bulunan “Apple iPhone 7 32GB” başlıklı bir ürün “iPhone 32GB” aramasında bulunabilmelidir.

Bunun için imdadımıza “Boolean Full-Text Searches” operatörleri yetişmektedir.

İlgili arama sonuçlarına göre, aramanızı bir veritabanındaki tüm alanlara genişletir ve MySQL’de bulanık aramaları berraklaşrıabilir.

Veritabanı ne kadar büyük ve karmaşık olursa arama yeteneklerinin de o kadar fazla olması gerekir. Bu arama tekniği MySQL aramalarının döndürdüğü sonuçları aranacak öebeğe odaklamayı sağlar.

Bir veritabanı, aradıkları verileri bulamazlarsa kullanıcılara hiçbir şey veremez. Veritabanı öğeleri ne kadar geniş ve karmaşık olursa, aramalarınızın ihtiyacınız olan bilgiyi döndürmek için o kadar basit olması gerekir.

Peki bu akıllı arama nedir nasıl çalışır?

Arama yapılan öbeği tablo içinde belirtilen sütunlarda arar. Şöyleki “Apple iPhone 7 32GB” başlıklı bir ürünü “iPhone 32GB” arama sonuçlarında listeleyebilirsiniz. Hızlıca örnekleyelim.

Tablomuz “Articles” tablosu. Bunu hızlıca yazdıralım. Burada önemli bir ayrıntı bulunmaktadır. Arama yapacağımız sütunların İndex değeri FULLTEXT olarak işaretlenmelidir.

____________________________________________________

CREATE TABLE IF NOT EXISTS `articles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`body` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `title` (`title`,`body`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
____________________________________________________

Kayıtlarımız da rastgele olarak şu şekilde ekleyelim:

____________________________________________________

INSERT INTO `articles` (`id`, `title`, `body`) VALUES
(1, ‘MySQL Tutorial’, ‘DBMS stands for DataBase …’),
(2, ‘How To Use MySQL Well’, ‘After you went through a …’),
(3, ‘Optimizing MySQL’, ‘In this tutorial we will show …’),
(4, ‘1001 MySQL Tricks’, ‘1. Never run mysqld as root. 2. …’),
(5, ‘MySQL vs. YourSQL’, ‘In the following database comparison …’),
(6, ‘MySQL Security’, ‘When configured properly, MySQL …’);
____________________________________________________

Sql sorgumuz şu şekilde;

____________________________________________________

SELECT *, MATCH(title,body)
AGAINST(‘MySQL database’ in boolean mode) as score
FROM articles
order by score desc

____________________________________________________

Çıktısı şu şekilde olacaktır:

____________________________________________________

id title body score
1 MySQL Tutorial DBMS stands for DataBase … 0.22764469683170319
5 MySQL vs. YourSQL In the following database comparison … 0.22764469683170319
6 MySQL Security When configured properly, MySQL … 0.000000003771856604828372
2 How To Use MySQL Well After you went through a … 0.000000001885928302414186
3 Optimizing MySQL In this tutorial we will show … 0.000000001885928302414186
4 1001 MySQL Tricks 1. Never run mysqld as root. 2. … 0.000000001885928302414186

 

Bu çıktının bize sağlamış olduğu sıralama en alakalı sonuç en yüksek dereceye sahip şekilde listelenmektedir. Bunu örneğimizde derece en yüksek olan ilk gelecek şekilde sıralamasını yaptık. Siz de bu dereceye göre kendi aramalarını alakalandırabilirsiniz.

1 comment

Add yours

Leave a Reply to alex Cancel reply