Sphinx‘de indexlenecek veriye, arama sırasında filtreleme yapmak için özellikler (attributes) tanımlayabiliyoruz. Bu özellikler full-text olarak indexlenmiyor (*), sadece aramayı filtreleme amaçlı kullanılıyor ve arama sonucunda dönen veri setine dahil oluyor.
sphinx.conf dosyasındaki source tanımlaması basitçe şöyle:
source main { # bağlantı bilgileri, pre query'ler vs.. # query sql_query = \ SELECT id, name, work_saturday, work_sunday \ FROM users # bu özellikler sadece filtre için kullanılır, indexlenmezler sql_attr_uint = work_saturday sql_attr_uint = work_sunday }
PHP tarafında SetFilter methodu ile filtre uygulayabiliyoruz. Aşağıda Cumartesi günü çalışan kullanıcılar aranıyor:
<?php // sphinx client init $s = new SphinxClient; $s->setServer('localhost', 3312); // cumartesi günü çalışan kullanıcılar $s->SetFilter('work_saturday', array(1)); // boş string gönderelim, tüm üyelerde arama yapsın, sadece filtreyi kullansın $result = $s->Query('');
SetFilter ile uygulanan her filtre AND koşulu ile işlem görür. Yani aşağıdaki gibi bir filtre uygularsak;
<?php // cumartesi günü çalışan kullanıcılar $s->SetFilter('work_saturday', array(1)); // pazar günü çalışan kullanıcılar $s->SetFilter('work_sunday', array(1));
arama sonucunda bize hem Cumartesi hem de Pazar günü çalışan kullanıcılar dönecektir.
Eğer bize Cumartesi veya Pazar günü çalışan kullanıcılar gerekiyorsa aşağıdaki gibi bir yol izleyebiliriz:
<?php // 'work_weekend' adında geçici bir alan oluşturup değerini IF fonksiyonunda belirleyelim. $s->setSelect('*, IF(work_saturday = 1 OR work_sunday = 1, 1, 0) AS work_weekend'); // filtreyi, on the fly oluşturduğumuz 'work_weekend' alanı için uygulayalım. $s->setFilter('work_weekend', array(1));
NOT
* Bir alanın hem indexlenmesini hem de attribute gibi davranmasını istiyorsanız sql_field_string kullanabilirsiniz.