22 Jan

Aramanın Yapılması – Site İçi Arama Motoru

1
2
3
4
5
6
7
8
$sphinx = new SphinxClient;
$sphinx->setServer('localhost',9312);
$sphinx->setMatchMode(SPH_MATCH_EXTENDED);
$sphinx->setMaxQueryTime(30);
$sphinx->setLimits(1,6);  
echo '<pre>',
          print_r($sphinx->query($arananKelime,"indexAdi"),true),
          '</pre>';

Sphinx ile yapılan aramalar direkt veritabanı tabloları üzerinde olmamaktadır, Sphinx kurulumunda belirttiğimiz index üzerinde bir SQL oluştururuz. Bu SQL, Sphinx in indeksleyeceği verileri veritabanından almasını sağlar, bu verileri bizim belirleyeceğiniz aralıklarda alarak indeksi günceller.

Arama işlemini yapmak için yukarıdaki kodlar çalıştırılmalıdır. Kodlar sade ve anlaşılır.
Sınıfımızı oluşturuyor,sunucu adresimizi ve portunu ayarlıyoruz (genelde yukarıda belirtilen portta çalışır, siz farklı bir port belirtmedikçe). Sonrasında arama modu, toplam sorgu zamanı ve limit değerlerini ayarladıktan sonra sorgumuzu çalıştırıyoruz.

Bu sorgu sonucunda aşağıdakine benzer bir sonuç elde edersiniz (eğer aramanızdan sonuç dönmezse null döner) :

Array
(
    [error] => 
    [warning] => 
    [status] => 0
    [fields] => Array
        (
            [0] => name
            [1] => short_description
            [2] => description
            [3] => meta_description
        )

    [attrs] => Array
        (
            [type_id] => 1
            [language] => 1
        )

    [matches] => Array
        (
            [507] => Array
                (
                    [weight] => 1
                    [attrs] => Array
                        (
                            [type_id] => 1
                            [language] => 1
                        )

                )

            [508] => Array
                (
                    [weight] => 1
                    [attrs] => Array
                        (
                            [type_id] => 12
                            [language] => 1
                        )

                )

            [509] => Array
                (
                    [weight] => 1
                    [attrs] => Array
                        (
                            [type_id] => 1
                            [language] => 1
                        )

                )

            [510] => Array
                (
                    [weight] => 1
                    [attrs] => Array
                        (
                            [type_id] => 1
                            [language] => 1
                        )

                )

            [511] => Array
                (
                    [weight] => 1
                    [attrs] => Array
                        (
                            [type_id] => 12
                            [language] => 1
                        )

                )

            [512] => Array
                (
                    [weight] => 1
                    [attrs] => Array
                        (
                            [type_id] => 1
                            [language] => 4
                        )

                )

        )

    [total] => 1000
    [total_found] => 28214
    [time] => 0
)

Yukarıda dönen sonucu açıklayayım :
error, warning, status, fields, attrs alanlarını açıkalamaya gerek yok şimdilik, çünkü adlarından anlaşıldığı gibi, sorgu ile ilgili gerekli bazı bilgilerin döndürülmesini sağlar.
Burda en önemli anahtar matches dır. Bu anahtar altında, aranan kelimeye uygun kayıtların ID’leri döndürülür.

 [511] => Array
                (
                    [weight] => 1
                    [attrs] => Array
                        (
                            [type_id] => 12
                            [language] => 1
                        )

                )

Burdaki kaydın anlatmaya çalıştığı şey şudur : aradığınız kelime 511 nolu kayıtda mevcut ve bu kaydın attributleri şunlardır, bu kelimenin arama ağırlığı şudur vb. Burdaki attrs, index oluşturulması sırasında bizim tarafımızdan belirlenir. Eğer herhangi bir attribute belirtmezsek buradaki attrs anahtarı altında hiçbir kayıt olmayacaktır.
Attribute tanımlamanın temel amacı, aranan kelimeyi filtereleyebilmektir.

Bunların dışında kalan total kısmı, bir defada listelenebilecek veri miktarını.
Total found, arama sonucu bulunan toplam kayıt miktarını temsil eder.

Daha önce belirttiğimiz gibi, sorgu direkt olarak veritabanı üzerindeki tablo üzerinde çalıştırılmaz, arama motoru sunucusu verileri aldıktan sonra bağımsız olarak çalışarak, bu verileri en hızlı sonuç verecek şekilde indeksler. Sonra siz sorgu yaptığınızda, belirtmiş olduğunuz tabloda, aradığınız metne uyan kayıdın ID sini ve yaptığınız ayarlamaya göre diğer sonuçları döndürür (yukarıdaki örnek sonuç gibi).

Sonrasında yapmanız gereken, dönen SPhinx sonuçlarından IDleri ayıklayarak veritabanı üzerindeki tabloya sorgu yapmak :

$sorgu='SELECT*FROM books where id in(507,508,509,510,511,512)';

Burda vermiş olduğum örnek döküm, bilgisayarımda çalışan Sphinx sunucusunda oluşturduğum indexde yapılan arama sonucu dönen veridir. Sizin oluşturacağınız indexlerde yapacağınız aramalarda, yukarıdakine benzer sonuç alamayabilirsiniz. Ama ana bölümler aynıdır.

Bu seriye ait diğer yazılar :

Metin Bazlı Arama ? Site İçi Arama Motoru
Aramanın Yapılması ? Site İçi Arama Motoru
Sphinx nedir ?
Sphinx Kurulumu
Sphinx’in Ayarlanması ve Kullanımı