Составление инструкции 'MATCH'

Использование Sphinx не имеет смысла, если вы не используете его полнотекстовый поиск. В SphinxQL он предоставляется с помощью инструкции 'MATCH'. Вы всегда можете составить его вручную как часть условия 'where', но если вы используете yii\sphinx\Query, вы можете сделать это через yii\sphinx\Query::match():

use yii\sphinx\Query;

$query = new Query();
$rows = $query->from('idx_item')
    ->match($_POST['search'])
    ->all();

Пожалуйста обратите внимание, что аргумент инструкции Sphinx 'MATCH' использует сложный внутренний синтаксис для лучшей настройки. По умолчанию yii\sphinx\Query::match() будет избегать всех специальных символов, связанных с этим синтаксисом, из его аргумента. Поэтому, если вы хотите использовать сложный оператор 'MATCH', вы должны использовать yii\db\Expression для этого:

use yii\sphinx\Query;
use yii\db\Expression;

$query = new Query();
$rows = $query->from('idx_item')
    ->match(new Expression(':match', ['match' => '@(content) ' . Yii::$app->sphinx->escapeMatchValue($_POST['search'])]))
    ->all();

Note: если вы создаете аргумент 'MATCH', обязательно используйте \yii\sphinx\Connection::escapeMatchValue() для правильного экранирования каких-либо специальных символов, которые могут сломать запрос.

Начиная с версии 2.0.6 вы можете использовать yii\sphinx\MatchExpression для композиции утверждения 'MATCH'. Он позволяет создавать выражение 'MATCH' с использованием заполнителей аналогично связанным параметрам, значения которых будут автоматически экранированы с помощью yii\sphinx\Connection::escapeMatchValue(). Например:

use yii\sphinx\Query;
use yii\sphinx\MatchExpression;

$rows = (new Query())
    ->match(new MatchExpression('@title :title', ['title' => 'Yii'])) // value of ':title' will be escaped automatically
    ->all();

Вы можете использовать [[match()], andMatch() и orMatch() для объединения нескольких условий. Каждое условие может быть задано с использованием синтаксиса массива, аналогичного тому, который используется для \yii\sphinx\Query:where. Например:

use yii\sphinx\Query;
use yii\sphinx\MatchExpression;

$rows = (new Query())
    ->match(
        // produces '((@title "Yii") (@author "Paul")) | (@content "Sphinx")' :
        (new MatchExpression())
            ->match(['title' => 'Yii'])
            ->andMatch(['author' => 'Paul'])
            ->orMatch(['content' => 'Sphinx'])
    )
    ->all();

Вы также можете составлять выражения со специальными операторами, такими как 'MAYBE', 'PROXIMITY' и т.д. Например:

use yii\sphinx\Query;
use yii\sphinx\MatchExpression;

$rows = (new Query())
    ->match(
        // produces '@title "Yii" MAYBE "Sphinx"' :
        (new MatchExpression())->match([
            'maybe',
            'title',
            'Yii',
            'Sphinx',
        ])
    )
    ->all();

$rows = (new Query())
    ->match(
        // produces '@title "Yii"~10' :
        (new MatchExpression())->match([
            'proximity',
            'title',
            'Yii',
            10,
        ])
    )
    ->all();