Yii2 → Sphinx реализуем поиск по сайту
Задача: реализовать полнотекстовый поиск по сайту с помощью Sphinx.
1. Устанавливаем Sphinx
Устанавливаем через sudo apt-get install sphinxsearch либо по инструкции из документации для вашей ОС.
Далее правим настройки поискового демона /etc/default/sphinxsearch изменяем на START=yes , для авто-запуска.
2. Настраиваем Sphinx и запускаем
Правим /etc/sphinxsearch/sphinx.conf по своим нуждам. Настройку конфига не описываю, очень объемно. Из основного: описываем запрос на получения данных и указываем дополнительно атрибуты (зачем описано чуть ниже):
Когда конфиг отредактирован и сохранен запускаем индексацию и стартуем поисковый демон:
Дальнейшую переиндексацию можно проводить с помощью команды indexer —rotate —all без перезапуска. Для периодической индексации новых материалов можно добавить задание в /etc/crontab:
В старых версиях проверить поиск можно было в консоли:
search -q поисковый запрос , в новых выпилили.
Известные ошибки
Если при проверке sphinx не возвращает результатов на русском, убедитесь что в конфиге имеется строка sql_query_pre = SET NAMES utf8 которая задает кодировку подключения.
Проверьте какая версия Sphinx у вас. Если у вас релиз ниже r3340, например Sphinx 2.0.4-id64-release (r3135). То обновите версию Sphinx до последней актуальной. Ошибка исправлена в релизе r3340.
3. Работа с Sphinx в Yii2
Устанавливаем расширение через Composer
Добавляем в конфигурацию:
В контроллере используем по аналогии с привычным компонентом Query:
Где index — поисковый индекс настроенный вами в конфигурации. Метод match() по умолчанию экранирует все спецсимволы. На выходе будет сформирован SQL-подобный запрос, содержащий конструкцию MATCH .
Резульатом мы получим массив с id, и другими атрибутами заданными в конфигурации sphinx, которые удовлетворяют нашему запросу.
Зачем нужно задавать атрибуты? По-умолчанию в сфинксе fulltext-поля хранить и получать не возможно (потому что они просто нигде не хранятся в виде полного значения). Sphinx возвращает не данные, а только ID найденных запиcей, после чего необходимо делать запрос к БД для получения записей по ID.
Если вам необходимо иметь возможность дополнительно производить фильтрацию по полям типа type_id или вы хотите выводить их без повторного обращения к БД, то вы можете указать их в виде атрибутов в конфигурации: sql_attr_uint , sql_attr_float , sql_attr_string и т.д.
The raw text of Fields is NOT stored, and can NOT be retrieved from the sphinx index. The text is broken into words, hashed, and stored in an inverted index.
Attributes are stored as is in the index. Because the content is stored, they can be used for filtering, sorting and grouping. Can also include the content of the attribute(s) in the result-set.
Добрый день.
пытаюсь разобраться с расширением и со sphinx в целом.
установил sphinx. протестил через консоль. все хорошо.
а вот когда уже на сайте запускаю, то вижу ошибку Can’t connect to MySQL server on ‘127.0.0.1’ (111)
что это может быть?
использую DigitalOcean + VestaCP
решилось тем, что поигрался со статусами сфинкса. то остановил, то рестартнул. заменил права на один файлик. и все. теперь работает.
Как реализовать поиск по разделам сайта на yii2?
Я прошу за ранее. не бросаться помидорами в коментах(
Хочу сделать поиск на сайте, вкусить так сказать как это делается. На сайте имеется 10 разделов, хочу сделать поиск по всем не посредственно. Но на данный момент код прописан так что оно ищет только в одной категории, а в других не ищет
Вот код,
Как мне преобразить, точнее как мне добавить еще условия для поиска? Если добавлять щас как есть, то оно будет перезаписывать переменную. Как мне добавить еще условий для поиска по остальным разделам?
- Вопрос задан более трёх лет назад
- 533 просмотра
Средний 2 комментария
- Вконтакте


Вам нужно какое-то отдельное хранилище (таблица в БД), в котором будут лежать такие данные:
1. тип сущности (по сути имя соответствующей таблицы или модели)
2. id сущности
3. текст по которому будет выполняться поиск
Поля тип и id сущности нужны чтобы связать найденные элементы с реальными страницами вашего сайта.
В качестве такого места для поиска может выступать как отдельная табличка в БД, так и отдельная база данных типа Elasticsearch.
Вам нужно будет 1 раз наполнить эту таблицу разово и потом обновлять ее каждый раз, при изменении данных по которым нужно выполнять поиск.
- Вконтакте


Иван Лыков, это может быть отдельная таблица в той же БД, где и остальные данные хранятся, а может быть вообще другая база.
Пример: У вас есть новости и записи в блогах. Вы хотите искать по всем сразу.
Вы может выполнить поиск отдельно по новостям и отдельно по блогам, потом каким-то образом объединить результаты и вывести пользователю.
Либо, вы можете сделать отдельную табличку в БД наподобие следующей и по ней выполнять поиск сразу по всем записям.
1, тип=новость, id-новости = 5, заголовок + текст
2, тип=запись блога, id-записи = 6, заголовок + текст
3, тип=новость, id-новости = 7, заголовок + текст
Допустим, у вас нашлись записи с и 2. При выводе первой записи вы делаете ссылку на новости с При выводе второй записи делаете ссылку на запись в блоге с >
Можно еще упростить и в этой самой отдельной таблице сразу хранить все необходимые данные для вывода списка найденных результатов на странице поиска. Например ссылки на страницы и их краткое описание.
Yii2 Advanced шаблон, делаем поиск Sphinx на своем сайте.
Решил я прикрутить удобный поиск по своему блогу на шаблоне Advanced от Yii2. Официальная документация Yii2 советует Sphinx.
- Устанавливаем сам Sphinx. Открываем Installation, в инструкции всего одна команда: php composer.phar require —prefer-dist yiisoft/yii2-sphinx
- Выполним ее на нашем сервере Бегета, в терминале, в папке нашего проекта.

Установка прошла успешно. - Настраиваем компонент поиска в конфигурации приложения. Мне нужен поиск только в frontend окружении , поэтому настраиваю конфигурацию только для него, в файле конфигурации: /frontend/config/main.php .
- Дальше начинается самое интересное. В Бегете поиск Sphinx платный. Переходим в сервисы и включаем его:

- Дальше нужно настроить конфиг Sphinx:
- Нужно создать индекс и включить поисковывй сервер:

- После этого поиск с подсветкой запроса можно делать так:
- Или, если не нужна подсветка так:
Как правильно оформить поиск по сайту?
Скорее всего проблема в кодировке, символ I(Елизавета I), если бы вы использовали цифру 1 вместо латинской I то по моему был бы успех. Хотя я не уверен ,по моему должно было работать.
Я тебе советую использовать fulltext index.
MySQL 5.5 пользовался движком MyISAM, если у вас версия выше то движок InnoDB уже поддерживает fulltext.
ниже я приведу пример моего кода ,которым я не раз пользовался.
- Создать процедуру с именем search_result
- Создать в нем таблицу если ее нету на движке MyISAM
- Повесить на колонки по которым будет выборка fulltext index
- заполнить таблицу на основе выборки из таблицы данных которые нас интересуют
- морфологическая выборка по fulletext с использованным коэффициента совпадения
- Потом почистить данные из нее повесив на движок blackhole
- после запустить процедуру
И у нас будет полноценный морфологический поиск
$sql = call search_result(‘aaa bbb ccc’), call search_result(‘Елизавета I’)
$sql = call search_result(‘Елизавета I’) выведет Елизавета I,I Елизавета .