Поиск по сайту (Sphinx)

Установка Sphinx

Sphinx устанавливается через команду ниже.

sudo apt-get install sphinxsearch

Затем надо создать файл /etc/sphinxsearch/sphinx.conf.

sudo cp /etc/sphinxsearch/sphinx.conf.dist /etc/sphinxsearch/sphinx.conf

В данном файле содержатся настройки Sphinx:

source src1
{
    type = mysql # Тип базы данных
    sql_host = localhost
    sql_user = root
    sql_padd = db_pass
    sql_db = table_name
    sql_port = 3306

    sql_query_pre = SET NAMES utf8
    sql_query = SELECT id,title,content FROM post

    sql_field_string = title
    sql_field_string = content
}

index idx_posts
{
    source = src1
}

Параметр sql_query выберет данные, которые будут сохранены в Sphinx и по которым будет происходить поиск.

По умолчанию Sphinx возвращает только ИД записей. Указать дополнительные данные можно через параметр sql_field_{type}. На примере показаны параметры sql_field_string, которые добавляют к выводу название страниц и контент.

Также надо обратить внимание на раздел index idx_posts. Данный индекс будет указываться для поиска данных.

Надо убедиться, что в разделе «searchd» указан параметр как на примере ниже.

searchd
{
    listen = localhost:9306:mysql41
    # …
}

По умолчанию Sphinx отключён. Включить его можно в файле /etc/default/sphinxsearch, указав параметр START=yes.

Теперь Sphinx можно запустить через команду ниже.

sudo /etc/init.d/sphinxsearch start

Добавить или обновить данные в индексе можно через команду ниже:

sudo indexer --all --rotate

Данную команду рекомендуется добавить в крон и выполнять каждый час.

0 * * * * sudo indexer --all --rotate >> /dev/null 2>&1

Интеграция Sphinx с Yii 2

Сначала надо установить библиотеку «yii2-sphinx».

composer require --prefer-dist yiisoft/yii2-sphinx

И в файле config/web.php добавить следующий код:

# config/web.php

return [
    // …
    'components' => [
        'sphinx' => [
            'class' => 'yii\sphinx\Connection',
            'dsn' => 'mysql:host=127.0.0.1;port=9306;',
            'username' => '',
            'password' => '',
        ],
    ],
];

Поиск по сайту

Поиск происходит через метод match().

use yii\sphinx\Query;
// …

$posts = (new Query())->from('idx_posts')->match('строка для поиска')->all();

Параметр idx_posts является индексом, который был указан в настройках Sphinx в index idx_posts.

Если для поиска передать строку «Установка Yii», то Sphinx найдёт записи «Установка Yii», «Yii установка», «Установка и настройка Yii» и другие.