Компонент SphinxSearch: поисковая система
Компонент SphinxSearch предназначен для организации поиска на сайте с использованием поисковой системы Sphinx. Программый интерфейс компонента аналогичен интерфейсу компонента FTSearch.
Это означает, что для каждого компонента, материалы которого должны попасть в индекс, необходимо описать методы индексации сущностей. Подробнее об этом можно почитать в статье о копмоненте FTSearch.
Установка
Перед установкой компонента необходимо установить сам Sphinx и Sphinx API для PHP.
Для установки Sphinx в Debian-based дистрибутивах достаточно одной команды:
sudo apt-get install sphinxsearch
Sphinx API проще всего установить при помощи менеджера зависимостей Composer. Для этого нужно добавить в composer.json следующее:
// composer.json { "require": { ... "nilportugues/sphinx-search": "dev-master" }, ... }
И запустить установку:
composer.phar install
После этого можно установить компонент SphinxSearch из репозитория и подключить его в index.php вместе с установленными через Composer библиотеками:
//www/index.php include('../vendor/autoload.php'); ... Core::load('Component.SphinxSearch');
Настройка
Основные настройки компонента находятся в файле config/sphinxsearch.php:
// components/SphinxSearch/config/sphinxsearch.php return array( 'url' => '/search/', 'perpage' => 10, 'time_limit' => 300, 'sphinxapi_host' => '127.0.0.1', 'sphinxapi_port' => '9312', 'sphinxql_host' => '127.0.0.1', 'sphinxql_port' => '9306', );
где,
- url - URL, по которому будет доступен поисковый механизм.
- perpage - вывод количества материалов на странице при выдаче результата. По умолчанию 10.
- time_limit - ограничение времени выполнения скрипта PHP в мс, которое устанавливается при запуске переиндексации сайта через административный интерфейс. По умолчанию 300 мс.
- sphinxapi_host и sphinxapi_port - хост и номер порта, на которых будет работать стандартное API Sphinx.
- sphinxql_host и sphinxql_port - хост и номер порта, на которых будет работать API SphinxQL.
Настройки по умолчанию применимы для одного сайта на одном сервере. Если на одном сервере будет работать несколько сайтов, использующих компонент SphinxSearch, необходимо изменить номера портов так, чтобы для всех сайтов и между собой они были различны.
Использование
При первой загрузке компонент, на основании настроек, создаст в каталоге проекта подкаталог /sphinxsearch/, где собраны все файлы Sphinx, относящиеся к данному проекту, включая файл конфигурации sphinx.conf. Этот файл генерируется из шаблона views/sphinx_conf.phtml, поэтому для изменения настроек Sphinx достаточно переопределить его.
Запуск Sphinx с этим конфигурационным файлом осуществляется следующим образом:
searchd --config /path/to/project/sphinxsearch/sphinx.conf
Эта команда должна быть запущена либо из командной строки, либо на рабочем сервере её необходимо добавить в автозапуск, для чего проще всего использовать cron, запустив команду crontab -e и добавив запись такого вида:
@reboot searchd --config /path/to/project/sphinxsearch/sphinx.conf
После этого механизм поиска будет готов к использованию. Для переиндексации сайта можно воспользоваться соответствующим пунктом меню в интерфейсе администратора.
Язык запросов
Оператор логического И позволяет искать материалы, в которых присутсвуют оба слова запроса:
привет & мир
Оператор логического ИЛИ - материалы, в которых присутсвуют одно из слов:
привет | мир
Логический оператор НЕ исключает материалы, в которых присутсвуют отмеченное им слово:
привет -мир привет !мир
С помощью круглых скобок () можно группировать логические операторы:
(привет & мир) | (скатертью & дорога)
Оператор поиска в полях позволяет указать, в каких полях нужно искать слова. В компоненте SphinxSearch имеются только два поля - title
и content
.
@title привет @content мир
Для поля можно указать позицию, начиная с которой нужно проводить поиск:
@content[50] привет
Можно указать несколько полей, в которых нужно осуществлять поиск:
@(title,content) привет мир
Или искать во всех полях:
@* привет
Для поиска целой фразы можно взять её в кавычки:
"hello world"
Оператор близости позволяет указать количество прочих слов, которые могут находиться между словами фразы:
"hello world"~10
Оператор кворума позволяет искать материалы, в которых встречается указанное количество слов из фразы:
"этот мир чудесен"/2
При использовании оператора строгого порядка более релевантными будут материалы, в которых указанные слова встречаются именно в такой последовательности:
привет << чудесный << мир
Оператор точной формы позволяет искать точные вхождения слов, включая морфологическую форму:
поиск с =покером и =куртизанками
С помощью операторов начала и конца поля можно искать материалы, начинающиеся или заканчивающиеся указанными словами:
^привет мир$
Обобщённый оператор близости позволяет указать, сколько прочих слов может находиться между указанными словами или выражениями:
привет NEAR/3 мир NEAR/4 "бла бла бла"
При помощи оператора предложения можно указать слова или фразы, которые должны встречаться в пределах одного предложения:
все SENTENCE слова SENTENCE "в одном предложении"
Аналогично, слова или фразы, объединённые оператором абзаца, должны находиться в пределах одного абзаца:
"Билл Гейтс" PARAGRAPH "Стив Джобс"
Оператор зоны поиска позволяет искать в пределах какого-либо тега:
ZONE:(h3,h4) только в соответствующих заголовках
Нужно отметить, что последние два оператора работают с HTML, а если проиндексированный контент является простым текстом, они не дадут должного эффекта.
CLI-команды
В компоненте определены следующие CLI-команды:
- sphinxsearch_config - повторная генерация конфигурационного файла.
- sphinxsearch_reindex - полная переиндексация сайта.
- sphinxsearch_clean - очистка индекса Sphinx. Не рекомендуется использовать без крайней необходимости.