Sphinx – Full Text Search

Standard

Herkese merhaba, yeni ama aslında eski bir konu ile karşınızdayım.. Sphinx.. Full Text Search..

Günümüzde her ne kadar Elastic Search işinizi fazla fazla görecek ve Sphinx e ihtiyaç duymayacak olsanız bile gireceğiniz şirketler alt yapısını eskiden kurmuşlarsa eğer karşılaşacağınız bir metin arama sunucusudur yani orjinal tabiri ile Full text search Server…

Sphinx ‘in optimizasyon ayağında bir ton ayar var, bir sürü kuralları vs.  Kurulum işlemine bilare değineceğim ama önce kullanımına basitce değinmek isterim..

Önce Sphinx class’ından instance oluşturalım.

//sphinx e bağlanalım
$cl = new SphinxClient();
$cl->SetServer($config->sphinxServer, $config->sphinxPort);

Sonuçları array yada obje olarak almak için ayar çekelim

$cl->SetArrayResult ( true ); //array
//$cl->SetArrayResult ( false); //obje

Limitlerin belirtilmesi

$cl->setLimits($offset, $limit, $maxmatch);

Burada max sayınız 1000 i geçmezse iyi olur.. Zira kendileri arama yapılırken Ram de adedi temsil eder. $offset başlayacağı, $limit de kaç adet getireceğini temsil eder.

Burada sayfalama yapabilirsiniz kendinize tümünü tek seferde çekmek yerine..

Arama sorgusunun gönderilmesi

$result = $cl->Query ( "mavi", "urunler" );

Yukarıda gönderdiğimiz parametrelerden ilki aranan kelime, 2.si ise bir sphinx.conf da oluşturduğumuz index in adı.

Ve son olarak Sonuçların alınması

// dönen datalarım artık elimde -> $result['matches']
foreach($result['matches'] as $urun_id => $match) {

//$urun_id ile elinizde dönen kayıtlar.. istediğiniz gibi basabilirsiniz

}

 Eşleşme Türünü Ayarlama:

Aramanın nasıl yapılacağını ile ilgili ayarlamadır. Yani kelimenin tamamı geçsin, bir kelime olsada olur vb.

$cl->setMatchMode(SPH_MATCH_ALL);

Ve / Veya İşlemleri

/* AND işlemi */

// arabası olanlar
$s->SetFilter('has_car', array(1));
 
// evi olanlar
$s->SetFilter('has_home', array(1));

/* OR işlemi */
// 'buy' adında geçici bir alan oluşturup değerini IF fonksiyonunda belirleyelim.
$s->setSelect('*, IF(has_car = 1 OR has_home = 1, 1, 0) AS buy');
 
// filtreyi, on the fly oluşturduğumuz 'buy' alanı için uygulayalım.
$s->setFilter('buy', array(1));

Not:  Bir alanın hem indexlenmesini hem de attribute gibi davranmasını istiyorsanız sql_field_string kullanabilirsiniz

Eşleşme Modları
Sabit Açıklama
SPH_MATCH_ALL Tüm Kelimeleri Eşleştir (Default mod).
SPH_MATCH_ANY Herhangi bir kelimeyi eşleştir
SPH_MATCH_PHRASE Bir cümle olarak eşleştir, mükemmel sonuç sağlar
SPH_MATCH_BOOLEAN Boolean ifade olarak ara.
SPH_MATCH_EXTENDED Sorguyu ifade olarak eşleştir.
SPH_MATCH_FULLSCAN Full taramayı etkinleştir
SPH_MATCH_EXTENDED2 SPH_MATCH_EXTENDED ile aynı sayılır, artı olarak yeter sayısı destekler.

Sphinx indexlerini yenilemek istiyorsanız:

sphinx indexer

 

Sphinx üzerinde sorgulama yapabilmek için şöyle bi yol izleyebilirsiniz:

sphinx terminal

Burada –prompt parametresi kullandım, bağlandığınız zaman sphinxQL> şeklinde olarak prompt, şaşırmayın 🙂

Daha bilgi için http://php.net/sphinx adresini ziyaret edebilirsiniz.

İyi çalışmalar dilerim..

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir