Прикручиваем Sphinx к своему поиску на сайте

Установка, задание конфигурации и запуск службы на Ubuntu для высокоскоростного поиска. Быстрый гайд


Сам недавно столкнулся с этим, нужно было по быстрому реализовать его работу в этом блоге на yii2, поэтому решил написать краткую заметку, в целях систематизации этих шагов в одном месте. Может кому то еще пригодится, кому, кто также пойдет на оф. сайт сфинкс и утонет в море информации по нюансам настройки и запуска поиска.

Оказывается организовать поиск проще простого с расширением yii2-sphinx. Если у вас сайт на каком то другом фреймворке или же cms, то скорее всего там тоже есть модули для работы со сфинксом, надо будет установить их и следовать инструкциям. Если же у вас проект на нативном php или другом языке, то для него есть API, посредством которого идет взаимодействие.

Но перед тем как поиск заработает, мало для сфинкса настроить апи или установить расширение. Первым делом программу нужно установить себе на сервер, а потом еще запустить поискового «демона», у меня Ubuntu, поэтому примеры показываю для него:

sudo add-apt-repository ppa:builds/sphinxsearch-rel22
sudo apt-get update
sudo apt-get install sphinxsearch

Конфигурируем файл \etc\sphinxsearch\sphinx.conf, исходим из того что у нас бд mysql. Всю конфигурацию я приводить не буду, смысла в этом нет, так как файл автоматически генерируется при установке с параметрами по умолчанию. Приведу лишь те простые, которые нужно задать, чтобы все заработало. Если какие то строки не указываю, значит они установлены по умолчанию уже.

Конфигурация поделена на части. В первой задаем основные параметры подключения к бд и запроса:

source blog
{
   type = mysql

	#####################################################################
	## SQL settings (for 'mysql' and 'pgsql' types)
	#####################################################################

	# some straightforward parameters for SQL source types
	sql_host = 127.0.0.1
	sql_user = root
	sql_pass = #пароль от субд root
	sql_db =    #название бд
	sql_port = 3306	# optional, default is 3306

        mysql_connect_flags = 32

        sql_query_pre = SET NAMES utf8
        sql_query  =  \
	             SELECT id, title, text, excerpt, date_create, ispublish \
	             FROM posts

        sql_attr_uint = ispublish
}

source src1throttled : blog
{
	sql_ranged_throttle	= 100
}

index blog
{
        source = blog
        ondisk_attrs = 1
        morphology = stem_en, stem_ru, soundex
        min_word_len = 1
        html_strip	 = 1
}

index test1stemmed : blog
{
	path = /var/lib/sphinxsearch/data/test1stemmed
	morphology = stem_en
}

indexer
{
        mem_limit = 128M
}

searchd
{
        listen = 9312
	listen = localhost:9306:mysql41
}

Поисковая служба может быть запущена так:

sudo service sphinxsearch start

searchd может быть запущен так:

searchd

Остановлен так:

searchd --stop

После всего этого мы должны запустить индексирование нашей таблицы posts, где хотим осуществлять полнотекстовый поиск, с учетом морфологии. Т.е., грубо говоря, сфинксу нужно дать спарсить все те данные, что у нас хранятся по нашим заметкам. А как он понимает что «схавать»? Вот по этому запросу из конфига:

sql_query  =  \
	             SELECT id, title, text, excerpt, date_create, ispublish \
	             FROM posts

Запуск индексирования:

indexer --config /etc/sphinxsearch/sphinx.conf --all

Такой командой он все проиндексирует. А если нужно переиндексировать (например, при добавлении новой статьи), то чтобы он искал по актуальным данным, выполняем:

indexer --config /etc/sphinxsearch/sphinx.conf --all --rotate

Но вообще, чтобы это все работало в автоматическом режиме, нужно задать расписание. Выполняем crontab -e и дописываем в конец файла:

## sphinxsearch
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all

Проверим, работает ли система:

mysql -h0 -P9306
SELECT * FROM blog WHERE MATCH('поиск');

У меня тут же нашел совпадения, а значит работает: Clip2net_170209015254.png

Вот теперь устанавливаем расширения или включаем поддержку сфинкса в ваших любимых cms (например в битрикс одной галочкой). У меня же это было так, установить Sphinx Extension for Yii 2:

php composer.phar require --prefer-dist yiisoft/yii2-sphinx

Прописать в web конфигурации приложения:

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

И в нужном экшене матчить запросы и передавать во вью, а там уже выводить результаты поиска списком заметок:

use yii\helpers\Html;
use yii\sphinx\Query;

/* Controller */

        /*
         * ... some code ...
         * */

/* actionSearch */

        /*
         * ... some code ...
         * */

$s = Html::encode(Yii::$app->request->get('s'));
$query = new Query();
$rows = $query
            ->from('blog')
            ->match($s)
            ->all();

return $this->render('search', ['rows' => $rows]);

В метод from объекта $query, являющегося экземпляром класса Query данного расширения, нужно передать наш индекс. В моем случае это строка blog.

Вот и все, осталось только представить найденные данные и вывести их пользователю. Еще нужно отметить, что возвращать этот объект будет только id и параметр группировки, который был задан в конфиге, ispublish. То есть, дополнительно надо будет делать запрос на выборку данных по id, но это уже другая задача, а сфинкс со своей справился на ура.



Похожие заметки:

Вывод комментариев с пагинацией

Выводим все комменты на WordPress из базы данных с пагинацией

Открыть здесь

Конвертация таблиц БД

Иногда возникает необходимость произвести конвертацию всех таблиц в базе данных из одной кодировки в другую, например из cp1251_general_ci (Windows 1251) в utf8_general_ci (UTF-8). Рассмотрим по порядку, как это быстро и безболезненно реализовать

Открыть здесь


Перед тем как писать комментарии, рекомендую ознакомиться:

Markdown синтаксис »

Оформление кода »

Нужна аватарка »

Комментарии


2
avatar

Админ

Роман Жариков сказал 10-02-2017 в 20:52

   В ответ на комментарии автора ...

Скрин:

Clip2net_170210194457.png

Query входит в поставку фреймворка.

Возможно имеешь ввиду yii\db\Query (см. скриншот выше), а тот что выделен красной рамкой yii\sphinx\Query уже идет в составе расширения yii2-sphinx. В свою очередь yii\sphinx\Query наследует \yii\db\Query, но вместе с этим объявляет ряд новых методов, в частности match( $query ):

yii\sphinx\Query, строка 281:

public function match($query)
    {
        $this->match = $query;
        return $this;
    }

avatar

olegpro сказал 11-02-2017 в 00:06

   В ответ на комментарии автора Роман Жариков

Ах вот оно что.