Sphinx Filtrelerinde ‘OR’ Koşulu Kullanımı

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.