Cumartesi, 18 Şubat 2012

Sphinx Kurulumu ve Uygulaması

 

Sürekli içeriği büyüyen web sitesi içinde kapsamlı arama yapmak gün geçtikçe karmaşıklaştığı için bu soruna karşılık veren arama motorları geliştirilmiştir. Sphinx isimli arama motorunun kurulumunu ve CodeIgniter üzerine uygulanmasını bizlere Remzi Yüzüak anlattı. Yazının sonunda tüm anlatılan kodların bulunduğu dosyayı indirebilirsiniz.

Sphinx SQL, yazı tabanlı aramaları hızlı bir şekilde yapmanızı sağlayan bir arama motorudur. Bu yazıda Sphinx`i nasıl kuracağınız ve CodeIgniter ile bunu nasıl konuşturacağınızı en basit şekilde anlatacağım. Test platformumuz için Ubuntu kullandım ki versiyonu farketmiyor sadece Sphinx`in hangi versiyonunu kurduğunuzu bilin yeterlidir. Bunu farklı bir Linux versiyonuyla da deneyebilirsiniz. Sadece Sphinx`in data klasörüne dikkat etmelisiniz.

Komut satırından aşağıdaki kodu çalıştırabilir:

#sudo apt-get install sphinxsearch

Ya da Software Center`ı açıp `sphinx` şeklinde arattığınızda `sphinxsearch` başlıklı açıklamasında da `Fast standalone full-text SQL search engine` yazan paketi kurmalısınız.

Kurulumdan hemen sonra örnek config dosyasını sphinx.conf olarak kopyalayınız.`sphinx.conf.dist` ya da bunun `sphinx.sample.com` versiyonları olabilir. Hepsi aynıdır. Bu işlem için komut aşağıdadır:

#cp /etc/sphinxsearch/sphinx.conf.dist /etc/sphinxsearch/sphinx.conf

Config dosyasını oluşturduktan sonra içinde bulunan test1 araması için bir kaç ayar yapmalısınız. Ama öncelikle test database`inde basit bir tablo açıp içine veri girelim. Bunun için phpmyadmin ya da farklı bir sql prgramı ile test database`i oluşturup aşağıdaki ZIP paketindeki documents.sql dosyasını import edin.

Başlangıç için config dosyanızda (sphinx.conf dosyası) fazla değişiklik yapmadan sadece source src1{} içindeki database bilgilerinizi değiştiriniz.

sql_host= localhost
sql_user= username
sql_pass= ***********
sql_db  = test

index test1{} içindeki path alanınız /var/lib/sphinxsearch/data/test1 ise çalışacaktır. Aşağıdaki ZIP paketindeki örnek sphinx.conf isimli config dosyasını database username ve password`u değiştirdikten sonra kullanabilirsiniz.

Sphinx için son işlem indexlemesi için aşağıdaki komutu çalıştırın aşağıdaki gibi çıktı verdiyse herşey yolunda demektir.

#indexer --rotate test1

Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff

using config file `/etc/sphinxsearch/sphinx.conf`...
indexing index `test1`...
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.133 sec, 1446.89 bytes/sec, 29.99 docs/sec
rotating indices: succesfully sent SIGHUP to searchd (pid=1086).

Eğer sphinx çalışmıyor ise durumuna bakıp servisi başlatın.ilk komut ile versiyonlarınızıda kontrol edebilirsiniz:

# sudo /etc/init.d/sphinxsearch status
# sudo /etc/init.d/sphinxsearch start

Şimdi işin keyifli tarafı CodeIgniter`a gelelim. Ben bu dokumantasyonu hazırlarken CodeIgniter 2.1.0 ile Sphinx 0.9.8.1 versiyonuna göre sphinxapi.php dosyasını indirip hazırladım . Eğer farklı versiyon bir Sphinx kurmuşsanız buradaki adresten versiyona göre api indirip siz de benim yaptığım işlemleri yapabilirsiniz. Böyle bir durum ile karşılaşırsanız `warning` kısmında şuna benzer ibr mesaj görürsünüz : `client version is higher than daemon version(client is v.1.23, daemon is v.1.19)`

Api`deki tanımlanmış define`lar ile bir Sphinx config`i tanımlayalım. Bunun için `/application/config/` dizininde `sphinx.php` dosyası oluşturun ve içine tanımlanmış define`ları ZIP paketinde örnek verilen application_config_sphinx.php dosyasındaki gibi ekleyiniz.

Api`deki class`ın üzerinde bulunan iki fonksiyonu alıp düzenli olması için bir helper yaratalım. `/application/helpers/` klasöründe `sphinx_helper.php` isimli bir dosya oluşturup ZIP paketinde örnek verilen application_helpers_sphinx_helper.php dosyasındaki gibi ekleyiniz.

Şimdi de `/application/libraries/` klasöründe `Sphinx.php` isimli bir dosya olşturun ve indirdiğimiz apinin class ile başlayan yerinden alıp ZIP paketinde örnek verilen application_libraries_Sphinx.php dosyasındaki gibi ekleyiniz.

Şimdi bir controller yazacağız. `/application/libraries/` `test.php` isimli bir dosya oluşturun ve ZIP paketinde örnek olarak verilen Dosya: application_controller_test.php dosyası içindekileri yazın:

<!--?php if ( ! defined(`BASEPATH`)) exit(`No direct script access allowed`);

class Test extends CI_Controller {

 public function __construct()
    {
     parent::__construct(); 
     $this--->load->library(`Sphinx`);
     $this->load->helper(`sphinx`);
     
    } 
 public function index()
 {
 
  $this->sphinx->SetServer("localhost", 3312);    
  $this->sphinx->SetMatchMode(SPH_MATCH_ALL);
  $this->sphinx->SetLimits(0, 100);   //Sphinx set limit
  $this->sphinx->SetFilter(`group_id`, array(1,2)); //Sphinx set group_id filter
  
  $sphinx["result"] = $this->sphinx->Query(``, `test1`);  //Sphinx Query Result

  $this->load->view(`sphinx_test`,$sphinx);  //assign result to view
 }
}

/* End of file test.php */
/* Location: ./application/controllers/test.php */

Son olarak da bir view dosyası yazıp çıktıyı üretelim. `/application/views/` klasöründe `sphinx_test.php` isimli bir dosya oluşturup ZIP paketinde örnek olarak verilen application_views_sphinx_test.php dosyası içindekileri ekleyin:

<!--?php print_r($result["matches"]);?-->

Hata almamanız için `/application/config/` de bulunan `routes.php` deki default controlleri değiştirebilirsiniz:

$route[`default_controller`] = "test";

Kodu çalıştırmak istediğinizde url`niz : http://localhost/test/CI_sphinx/

Eğer kodunuz çalışmış ise querylerinizi tablolarınızı geliştirip CodeIgniter üzerinden Sphinx`i kullanmaya devam edebilirsiniz. Ancak şu tavsiyede bulunabilirim: mümkün olduğunca basit örnekler üzerinden gidip temelini aldıktan sonra büyük tablolara giriş yapın. Bu kaynak basitçe yapıyı anlamanıza imkan verecektir.

Uygulamada anlatılan tüm dosyaları buradan indrebilirsiniz.

Remzi Yüzüak

Yorumlar

Merhaba, 


Burada Full-Text search yaptığımız sql leri nasıl uyarlayabiliriz. Sphix de where şartı varmı bu örnekleri genişletebilirmiyiz?

codeigniter.gen.tr ne zaman bir foruma kavuşacak acaba? Böyle bir düşünce var mı? Çok daha aktif kullanılabilir gibi geliyor bana, ve herkes içni çok daha faydalı olur.

@Hasan Akdeniz: CodeIgniter türkçe forum sayfaları için Google Groupsu kullanmaktayız.

Serveri yormaya yönelik flood ataklarıda engelleyebilir mi?

Yorum Ekle



Captcha: