Начиная с версии 2.2.3 Sphinx обеспечивает возможность фасетного поиска с помощью FACET
:
SELECT * FROM idx_item FACET brand_id FACET categories;
yii\sphinx\Query
поддерживает композицию этого предложения, а также выборку фасетных результатов. Вы можете указать фасеты через yii\sphinx\Query::facets
. Чтобы получать результаты с фасетами, вам нужно использовать метод yii\sphinx\Query::search()
.
Для примера:
use yii\sphinx\Query;
$query = new Query();
$results = $query->from('idx_item')
->facets([
'brand_id',
'categories',
])
->search($connection); // получить все строки и фасеты
$items = $results['hits'];
$facets = $results['facets'];
foreach ($results['facets']['brand_id'] as $frame) {
$brandId = $frame['value'];
$count = $frame['count'];
...
}
Note: убедитесь, что вы используете сервер Sphinx версии 2.2.3 или выше, прежде чем пытаться использовать особенности фасетов.
Вы можете указать дополнительные опции фасета, такие как select
или order
используя формат массива:
use yii\db\Expression;
use yii\sphinx\Query;
$query = new Query();
$results = $query->from('idx_item')
->facets([
'price' => [
'select' => 'INTERVAL(price,200,400,600,800) AS price', // using function
'order' => ['FACET()' => SORT_ASC],
],
'name_in_json' => [
'select' => [new Expression('json_attr.name AS name_in_json')], // необходимо использовать `Expression`, чтобы избежать ненужного цитирования
],
])
->search($connection);
Note: если вы укажете пользовательский выбор для фасета, убедитесь, что в названии фасета имеется соответствующий столбец внутри оператора select. Например, если вы указали фасет с именем 'my_facet', его оператор select должен содержать атрибут 'my_facet' или выражение связанное как 'my_facet' ('expr() AS my_facet').