MySql Veri Tabanını İle Tam Metin Arama (FultextSearch)
Tam metin arama seçeneği sadece Mysql' ait bir özellikdir. Binlerce kayıtdan oluşan bir tablo üzerinde bu özelliği kullanarak ilgili kaydı kolayca bulabiliriz.

Öncelikle mysql monitörüne girelim ve arama isminde bir veritabanı oluşturalım.

mysql> create database arama;
Query OK, 1 row affected (0.09 sec)

Oluşturduğumuz bu veritabanını kullanacağımızı MySql ye bildirelim.

mysql> use arama;
Database changed

Şimdi örnek tablomuzu oluşturalım.Diyelim ki bir adres defteri oluşturuyoruz:

mysql> create table testTable
-> (
-> SiraNo int auto_increment not null,
-> Adi varchar(20),
-> Soyadi varchar(20),
-> Yasi int,
-> Adres text,
-> primary key(SiraNo),
-> unique id(SiraNo),
-> fulltext(Adi, Soyadi, Adres)
-> );

Query OK, 0 rows affected (0.08 sec)

Eğer sizin zaten bir tablonuz varsa ve bu tabloya fulltext index eklemek istiyorsanız ALTER TABLE fonksiyonu kullanarak ekleyebilirsiniz. Örnek:

 ALTER TABLE myTable ADD FULLTEXT(field1, field2);

Yukarıdaki test tablomuzda Adi, Soyadi ve Adres için fulltext index oluşturduk.Fultext indexleri sadece Varchar,char ve Text alanları için oluşturabilirsiniz.Tablo tip iMyISAM olmalıdır.

Şimdi adres defterimizi bazı verilerle dolduralım.


mysql> insert into testTable values(0, 'Ali', 'Demirci', 29, ' Ali Demirci Kayal
ar isimli web hosting şirketinde genel müdür olarak görev yapar, mesleğinde çok
başarılıdır. evli ve 2 çocukludur.');

Query OK, 1 row affected (0.14 sec)

mysql>
mysql> insert into testTable values(0, 'Beyaz', 'Bulut', 19, 'Beyaz Bulut Lise S
on sınıfta okuyan bir öğrencidir, ingilizcesi haric diğer dersleri çok iyidir.Ge
lcek sene üniversite sınavlarına girmeyi düşünüyor.');

Query OK, 1 row affected (0.00 sec)

mysql>
mysql> insert into testTable values(0, 'Kamber', 'kumlu', 19, ' Kamber Kumlu PHP
ve MySQL üzerinde çok deneyim sahibidir');

Query OK, 1 row affected (0.00 sec)

mysql>
mysql> insert into testTable values(0, 'Altan', 'Aktar', 25, 'Atan Aktar linux/
Apache administrator olarak çalışır.C# ve Windows Net konusunu da merak ediyor.'
);

Query OK, 1 row affected (0.01 sec)

mysql>
mysql> insert into testTable values(0, 'Serpil', 'Sarpkaya', 23, 'Serpil Sarpkaya
 bir bankada kredi kartı dağıtımı işinde çalışıyor. Bu konuda Dört yıl deneyimi
vardır.');

Query OK, 1 row affected (0.02 sec)

Artık Fulltext aramayı yapabiliriz.


mysql> select adi from testTable where match(adi, soyadi, Adres) against('iyidir
');

+-------+
| adi    |
+-------+
| Beyaz |
+-------+
1 row in set (0.04 sec)

Görüldüğü gibi Mathc kelimesinden sonra fultext indexe dahil olan tüm alanları yazmamız gerekiyor, against kelimesinden sonra ise bu alanlarda aranacak kelimeyi yazıyoruz.

Yukarıdaki komutu normal SQL komut olarak aşağıdaki şeklde yazabilir ve aynı sonucu alabiliriz.

mysql> select adi from testTable where adres like '%iyidir%';
+-------+
| adi    |
+-------+
| Beyaz |
+-------+
1 row in set (0.00 sec)

Fakat binlerce hatta milyonlarca kayıt olduğunu düşünürseniz, son örneği epey beklemek zorunda kalacaksınızdır.

Mysql de Fulltext search özelliği eğer aranan kelime  tablodaki her satırda varsa hiç bir değer döndürmeyecektir.İstenen de zaten budur.

Aşağıda ilk örnek normal sql, sonraki örnek ise fulltext search özelliği ile arama yapmaktadır.


mysql> select adi from testTable where adres like '%isimli%';
+----------+
| adi        |
+----------+
| Ali        |
| Beyaz    |
| Kamber |
| Altan    |
| Serpil   |
+---------+
5 rows in set (0.00 sec)

mysql> select adi from testTable where match(adi, soyadi, Adres) against('isimli

'> '
-> );

Empty set (0.00 sec) görüldüğü gibi hiç bir değer döndürmemiştir.

Fulltext search ile kelimenin tamamı varsa bulunur, yani sağında veya solunda boşluk olmalı veya nokta,virgül vs. gibi bir işaret olmalı. Örneğin 'iyidir' kelimesini "iyid" olarak arayalım.


mysql> select adi from testTable where match(adi, soyadi, Adres) against('iyid')
;

Empty set (0.00 sec) //görüldüğü gibi hiç bir değer döndürmeyecektir.

Fulltext search özelliğinde aranan kelime en az dört karekter olmalı, yoksa değer döndürmez. Fakat En fazla istenildiği kadar kelime yazılabilir.

Örnek:

mysql> select adi from testTable where match(adi, soyadi, Adres) against('Son');
Empty set (0.00 sec) //son kelimesi geçtiği halde değer döndürmeyecektir.

Aranan kelimenin büyük küçük harf olmazı fark etmez.Fakat Türkçe İ,ÇŞ,ı, gibi ingilizcede olmayan karakterler için sorun olabilir.

Fulltext Search ile IN BOOLEAN modunda Arama:

mysql> select adi from testTable where match(soyadi, Adres) against('+isimli -is
minde' in boolean mode);

+----------+
| adi        |
+----------+
| Ali         |
| Beyaz    |
| Kamber |
| Altan     |
| Serpil    |
+----------+
5 rows in set (0.00 sec)

Yukarıdaki Querye dikkat edecek olursak Mahtch içinde "Adi" alanı bulunmamaktadır, demekki boolean modda arama yaparken tüm fulltext index alanlarını eklemek zorunda değiliz, hangi alanda arama yapılacaksa onu ekliyoruz.Yukarıdaki Queryin anlamı soyad ve adres alanlarında "isimli" kelimesi olan ve "isminde" kelimesi olmayan kayıtları döndür demek istiyor.

Boolean modda İşaretlerin anlamları:

+ (artı) :Önüne konulan kelime varsa o kaydı döndürür.
- (eksi) : Önünde konulan kelimenin olmadığı kaydı döndürür.
Bir kelimenin önünde "+" veya "-" işareti yoksa arama MATCH() ... AGAINST() gibi davranır, benzerliği en fazla olandan başlayarak kayıtları döndürür Boolean mod yokmuş gibi davranır.

< >   : Bu iki karekter kelimenin benzerlik oranına(relevance) katkısını azaltır veya arttırır. < işreti katkıyır azaltır, > işareti katkıyı arttırır.

(  )  : Bir alt String (kelimeler dizesi) içinde bir grup kelimeyi aramada kullanılır.

~   : Bir kelimenin benzeşme oranına katkısı negatifse bu kelimelerin olduğu kayıtları döndürmez. Özellikle gürültü oluşturan kelimelerin ayıklanmasında kullanılır.

*    : Bir kelimenin sonuna eklendiğinde kelimenin sonuı ne olursa olsun o kelimenin olduğu kaydı döndürür. Normal SQL deki "%" işareti gibi düşünün Fakat * işareti sadece kelime sonuna eklenmelidir..

"    :Çift tırnak içinde yazılan bir cümle harfi harfine yazıldığı gibi aranır, büyük-küçük harfe yine duyarlı değildir, fakat aradaki gürültü kelimeleri varsa bu kayıt dönmez..

Örnekler:

elma  armut :Bu kelimelerden en az birini içeren kayıt dönecektir.(işaretsiz.)

+elma +armut: İki kelimeyi birden kapsayan kayıtlar dönecektir.

+elma armut :Kayıttda mutlaka elma olmalı, "armut" kelimesi için ise benzeşme oranı en yüksek olan kayıt dönecektir.

+elma +(>duvardan <hoşaf): Dönecek kayıtta "elma" ve "duvardan" veya "elma" ve "hosaf" mutlaka olmalı ama "elma suyu" kelimesinin rankı "elma hoşaf" kelimesinin rankından daha büyük olan kayıtlar dönecektir.

elma* : elma,elmalar, elmacı, elmadan, elmamı vs. gibi kelimeleri kapsayan kayıtlar dönecektir.

"Beyaz elma" : ' Bir Beyaz elma zor yetişir' cümlesi dönecek ama ' Bir Beyaz ve güzel elma olsa da yesem' cümlesi dönmeyecektir. Aradaki gürültülü kelimeler varsa o kayıt dönmez.

+uzun +(boylu* armut): içinde uzun ve boylu.. veya uzun ve armut olan kayıtları gösterir.

+uzun +boylu* -armut: Uzun ve boylu kelimesi olan armut kelimesi olmayan kayıtları döndürür.