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. |