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
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 üzerinde sorgulama yapabilmek için şöyle bi yol izleyebilirsiniz:
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..