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.