Sphinx и yii2 интеграция. Пример работы со sphinx на yii2

29.10.2015

Статья является сопутствующей двум предыдущим по sphinx. 

1) Установка и настройка sphinx на Debina 7

2) Создание альтернативного запуска sphinx. Сценарий инициализации sphinx. Debian 7

 

И так если два первых шага выполнено, значит трудное (вовсе нет:) ) уже позади. Осталось включить yii2 в работу со sphinx. К счастью есть уже готовый пакет для нашего фреймворка, поэтому сперва ставим расширение yii2-sphinx

Добавляем в секцию require файла composer.json:

"yiisoft/yii2-sphinx": "~2.0.0" (версия может отличаться)

После установки настраиваем расширение на подключение к sphinx:

Добавляем в секцию components файла config/main.php:

'sphinx' => [
    'class' => 'yii\sphinx\Connection',
    'dsn' => 'mysql:host=127.0.0.1;port=9313;', // Обязательно укажите порт, который Вы задали в конфигурационном файле sphinx, секция searchd параметр listen
    'username' => '',
    'password' => '',
],

Вот и все. Можно приступать к полнотекстовому поиску на сайте. Пример:

use yii\sphinx\Query; // обязательно используем sphinx вместо стандартной yii\db\Query
$query_search  = new Query();
$search_result = $query_search->from('siteSearch')->match($q)-all();  // поиск осуществляется по средством метода match с переданной поисковой фразой.

В ответ нам будет приходить уникальный id записи в базе sphinx! Если присмотреться по внимательней к моей статье в шапке этой статьи (пункт 1), можно заметить в источнике данных (source) у меня дополнительно указаны поля которые возвращаются вместе с id. 

Часть конфига sphinx:

source blog : site1
{
    sql_query = SELECT b.id*10+1, 1 as source_id, CONCAT_WS('(*_!_*)',b.title, b.text, CONCAT('/blog/',c.alias,'/',b.alias)) as data FROM blog as b \
                LEFT JOIN blog_categories AS c ON b.catid = c.id

    sql_attr_uint    = source_id
    sql_field_string = data
}

Если не указывать в конфиге:

sql_attr_uint    = source_id
sql_field_string = data

То при поиске вернется только id записи в sphinx (b.id*10+1). Чтобы этот id не переводить обратно, и не делать еще один запрос уже в нашу mysql для доп. данных, я указал что мне нужно вернуть source_id (в моем случае он равен 1 это сделано для того, чтобы понять какому источнику данных принадлежит запись) и data где я собрал в строку необходимые мне данные. 

При запросе в результате получим id, source_id и data. Распарсим data на массив:

$content = explode('(*_!_*)',$data['data']);

Вот и все. Примеры использования расширения sphinx можно глянуть все там же yii2-sphinx.

 

comments powered by HyperComments