Mysql Fulltext Arama Sorgusu

blink1337dagger

Kadim Üye
7 Kas 2011
5,261
43
Chicago İL
Arama sorgularında genellikle like komutu kullanılır. Bunun nedeni like ın (=) den daha esnek bir yapıda olmasıdır. Mysql içinde arama yapılırken genelde tercih edilen yöntem içeriğin içindeki kelimelerin veya harf dizilimlerinin içinde arana kelimenin veya harf dizisinin geçmesidir . Yani mevcut içerikteki herhangi bir kelimede, aradığımız kelime başata,ortada veya sonda var ise o içeriği doğru içerik olarak alırız. Temel olarak arama sorgusunun mantığı budur. Bir örnek verecek olursak.
PHP:
$sql = "select * from `table` where `abc` like '%$aranan%'";
şeklinde olur. % işaretleri joker karakterlerdir. Aradığımız kelime veritabanındaki metnin içindeki bir kelimienin herhengi bir yerinde (başında, sonunda, ortasında) mevcut ise o satır seçilecektir. Basit bir arama scriptini yazmada like işimiz igörebilir, fakat biz daha fazlasını istiyorsak fulltext indexleri imdadımıza koşacaktır.
LIKE tan farklı olarak fulltext indekslerini de kullanabiliriz. MySQL fulltext indeksleri arama sorguları için LIKE fonksiyonundan daha fonksiyoneldir.Diğer bir artısı da arama sonuçlarını önem sırasına göre dizmesidir. fulltext arama tablolardaki VAR,TEXT ve VARCHAR alanlarını fulltext indeks olarak atayıp MATCH fonksiyonunu kullanarak bunlarda arama yapmak olarak özetlenebilir. Fulltext içeriğe sahip alanları bulunan bir tabloyu şöyle yaratabiliriz.
PHP:
    CREATE TABLE konu (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY  KEY,baslik VARCHAR(100),icerik TEXT, FULLTEXT (baslik,icerik));
Böylece konu adında bir tablo oluşturmuş olduk ve bu tablonun baslik ve icerik alanlarını fulltext olarak atıyoruz. Arama yapılacak alanları tablo oluşturulduktan sonrada fulltext index olarak da belirleyebiliriz. Bunuda şöyle yapabiliriz.
PHP:
ALTER TABLE `konu` ADD FULLTEXT `fulltextindex` (`baslik`,`icerik`).
İçeriklerimizi fulltext yaptıktan sonra tablomuzun şekline şöyle bir bakalım. +----id-------+-----baslik----+-----icerik-----+ 1 Mysql Fulltext arama
PHP:
  SELECT * FROM konu  WHERE MATCH (baslik,icerik) AGAINST ('arama');
sorgusu "arama" geçen icerik yada baslik alanlarına sahip satırları elde etmemizi sağlayacaktır . MATCH fonksiyonu her satıra bir puan verir. Yani aranan kelimenin içeriklerde geçme sayısına göre her satıra bir puan verir ve puanı en yüksek satırı (yani kelimenin en çok geçtiği) en üste gelecek şekilde sıralar. MATCH fonksiyonu AGAINST ten sonra verilen kelimeyi kendinden sonraki fulltext indekslerde arar. Fulltext indexlerde MATCH ile arama yapılırken küçük büyük harfin önemi yoktur. Yani kelime ile KELime aynı kelimedir.
PHP:
  SELECT id,baslik,MATCH (baslik,icerik) AGAINST ('arama') AS puan FROM konu  WHERE MATCH (baslik,icerik) AGAINST ('arama');
Sorgusu içinde "arama" geçen satırların id ve baslik alanlarını ve puanları döner.
fulltext aramanın fonksiyonelliği sadece bunlarla bitmiyor. Fulltext arama bazı operatörleri kullanmamıza olanak sağlar. Bu operatörler aranan kelimenin nasıl aranması gerektiği hakkında mysqle bilgi sağlar.
("+") kelimenin mutlaka bulunması gerektiğini belirtir Örnek: +php
("-") kelimenin aramada bulunmamasi yani harici tutulmasi gerektiğini belirtir Örnek: +php "mysql php geçen mysql geçmeyen satırlar çekilir
("< >") operatörleri kelimenin puana olan etkisini belirlemenizi sağlar.
( ) kelimeleri gruplamanızı sağlar.
("~") kelimenin aramada bulunması puanı ters yönde etkiler. Yani ("-") operatörü gibi ama arama sonuçları gösterilir.
("*") sonuna geldiği kelimenin ekli bir şekilde bulunabileceğini belirtir
''çift tırnak'' kelime grubunu arar Örnek: "ışın kılıcı"
fulltext aramada her satır için bir puan döndüğün ve sonuçları bu puana göre sıraladığını söylemiştik. IN BOOLEAN MODE özelliğini kullanarak puana göre sıralama işlemini kapatabiliriz.
PHP:
SELECT * FROM konu WHERE MATCH (baslik,icerik) AGAINST ('+mysql -php' IN BOOLEAN MODE);
Sorgusu içinde mysql geçen ama php geçmeyen satırları getirir. Ama sıralamayı puan göre değil de tablodaki sıralarına göre getirir.
İyi çalışmalar.


Kaynak
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.