cornernote/yii-sphinx

Yii extension for Sphinx Search.

Installs: 30

Dependents: 0

Watchers: 2

Forks: 2

Language: PHP

1.0.0 2014-06-13 03:16 UTC

README

Yii extension for Sphinx Search

forked from http://www.yiiframework.com/extension/dgsphinxsearch/

return array(
    'aliases' => array(
        'sphinx' => realpath(VENDOR_PATH . '/cornernote/yii-sphinx/sphinx'),
    ),
    'components' => array(
        'sphinx' => array(
            'class' => 'sphinx.components.ESphinxSearch',
            'server' => '127.0.0.1',
            'port' => 9312,
            'maxQueryTime' => 3600,
            'enableProfiling' => YII_DEBUG,
            'enableResultTrace' => YII_DEBUG,
        ),
       'dbSphinx' => array(
            'class' => 'sphinx.components.ESphinxDbConnection',
            'connectionString' => 'mysql:host=127.0.0.1;port=9306',
            'emulatePrepare' => true,
            'charset' => 'utf8',
            'schemaCachingDuration' => 3600,
            'enableProfiling' => YII_DEBUG,
            'enableParamLogging' => YII_DEBUG,
        ),
     ),
);

Search by criteria Object:

// create the criteria
$searchCriteria = new ESphinxCriteria();
$searchCriteria->select = 'id';
$searchCriteria->filters = array('status' => 1);
$searchCriteria->query = 'keywords';
$searchCriteria->from = 'product';
$searchCriteria->groupby = 'id';
$searchCriteria->orders = array('name' => 'ASC');
$searchCriteria->paginator->pageSize = 1000;
$searchCriteria->fieldWeights = array(
    'name' => 20,
    'description' => 1,
);

// get the result
$resIterator = Yii::app()->sphinx->search($searchCriteria); // interator result
// or
$resArray = Yii::app()->sphinx->searchRaw($searchCriteria); // array result

Search by SQL-like syntax:

$search->select('*')->
    from($indexName)->
    where($expression)->
    filters(array('project_id' => $this->_city->id))->
    groupby($groupby)->
    orderby(array('f_name' => 'ASC'))->
    limit(0, 30);
$resIterator = $search->search(); // interator result
/* OR */
$resArray = $search->searchRaw(); // array result

Search by SphinxClient syntax:

$search = Yii::App()->search;
$search->setSelect('*');
$search->setArrayResult(false);
$search->setMatchMode(SPH_MATCH_EXTENDED);
$search->setFieldWeights($fieldWeights)
$resArray = $search->query( $query, $indexName);

Combined Method:

$search = Yii::App()->search->
    setArrayResult(false)->
    setMatchMode(SPH_MATCH_EXTENDED);
$resIterator = $search->select('field_1, field_2')->search($searchCriteria);

Finding Models:

$ids = array_keys($resArray['matches']);
$criteria = new CDbCriteria;
$criteria->addInCondition('id', $ids);
$criteria->order = 'FIELD(t.id, ' . implode(', ', $ids) . ')'; // order by weight
$products = Product::model()->findAll($criteria);

Real-Time Index via ActiveRecord:

class Product extends CActiveRecord
{

    public function tableName()
    {
        return 'product';
    }

    public function afterSave() 
    {
        ProductIndex::model()->updateIndex($this);
        parent::afterSave();
    }

    public function afterDelete() 
    {
        ProductIndex::model()->deleteIndex($this);
        parent::afterDelete();
    }

}


class ProductIndex extends ESphinxActiveRecord
{

    public function tableName()
    {
        return 'product';
    }

    public function truncateIndex()
    {
        $this->dbConnection->createCommand('TRUNCATE RTINDEX ' . ProductIndex::model()->tableName())->execute();
    }

    public function deleteIndex($product)
    {
        $this->dbConnection->createCommand("DELETE FROM " . ProductIndex::model()->tableName() . " WHERE id = " . $product->id)->execute();
    }

    public function updateIndex($product)
    {
        $productIndex = new ProductIndex();
        $productIndex->id = $product->id;
        $productIndex->name = $product->name;
        $productIndex->description = $product->description;
        $productIndex->status = $product->status;
        $productIndex->save(false);
    }

}