Установка Sphinx под Linux - строим свой поисковый сервер
Sphinx - поисковый сервер и открытым исходным кодом (Open Source Search Server) для индексации контента из баз данных и осуществления полнотекстового поиска, разработанный Андреем Аксеновым. В статье пошагово рассказано как установить и настроить поисковый сервер Sphinx на сервер под управлением операционной системы Linux (Ubuntu/Dedian). Приведены примеры, советы и ссылки которые будут полезны как администраторам так и разработчикам.
Прежде чем приступить к пошаговому мануалу по установке и настройке поискового сервера Sphinx хочу вам рассказать как я познакомился с данной системой и что послужило толчком к ее использованию.
Вступление
С самого начала, когда только начинал программировать на PHP и писал несложные сайты, я использовал собственный самописный поисковый движок с простой логикой. Он воспринимал одно и несколько слов в поисковой фразе и выдавал те записи в которых было обнаружено вхождение. Сначала делал с индексированием контента и кешированием индекса, потом делал полнотекстовый поиск на PHP.
Конечно же данная реализация не лишена недостатков, основной недостаток - это не достаточно релевантная поисковая выдача поскольку мой движок не учитывал морфологию слов, а искал только прямые вхождения поисковых фраз с простым анализом распределенности по статье. Писать мощный поисковый модуль со сложной логикой и оптимизациями "на стероидах" у меня не было ни времени ни особого желания.
Поиск от Яндекса и его минусы
Позже я узнал про поиск от Яндекса, который без особого труда можно прикрутить к своему сайту используя Yandex XML Search API. К моему движку был написан модуль для осуществления поиска используя Yandex XML Search API и казалось бы все просто супер но со временем меня начали не устраивать некоторые ограничения и неудобства при работе с Yandex XML Search.
Вот что мне показалось неудобным при использовании Yandex XML Search API:
- ограничение на количество запросов в сутки, а потом еще сделали график ограничений для разного времени суток. Хотите уменьшить ограничения. отправьте СМС на номер. шутка, можно стать партнером Яндекса, для аккаунта зарегистрироваться в партнерской сети Яндекс Директ (РСЯ), связаться с поддержкой Яндекса и рассказать им зачем вам нужно большое количество запросов к Yandex XML Search API.
- поиск производится только по контенту, который проиндексирован Яндексом. Если странички нет в индексе Яндекса - ее вы никогда не увидите в поисковой выдаче своего сайта.
- привязка сайта к стороннему сервису, зависимость поиска от него.
Поисковый движок Sphinx
И тут я вспомнил что читал когда-то на Хабре и еще на каком-то блоге по HighLoad-проектам о мощном бесплатном поисковом движке с расширенным анализом и множеством возможностей по настройке и интеграции. Назывался этот движок Sphinx(сфинкс). Очень удачное название, хорошо запоминается и легко ищется в Google/Yandex.
Основные характеристики и возможности Sphinx:
- индексирование: до 10-15Мб на каждое ядро микропроцессора;
- поиск: 150-250 поисковых запросов в секунду на каждое ядро при 1Млн документов в индексе;
- высокая масштабируемость;
- распределенный поиск;
- поддержка до 32 и более полей при полнотекстовом поиске;
- поддержка дополнительный атрибутов для каждого из индексируемых документов;
- возможность использовать стоп слова;
- поддержка однобайтовых (СЗ1251 и т.п) и двухбайтовых кодировок (UTF-8);
- морфологический поиск с модулями для разных языков;
- поддержка MySQL и PostgreSQL из коробки;
- поддержка других ODBC совместимых баз данных;
- кроссплатформенность;
- готовые к использованию решения API для языков PHP, Python, Java.
Сфинкс используется на многих высоконагруженных проектах, к примеру это Хабрахабр, Викимапия и другие. Система себя зарекомендовала с наилучшей стороны, известно что существует поисковый кластер в котором проиндексировано около 3 миллиардов документов и который осуществляет более 50 миллионов поисковых запросов в сутки.
Полистав документацию и прочитав бегло несколько русских/английских статей по установке в уме быстро очертил себе четкий алгоритм действий. Со своим опытом установки и настройки Sphinx я хочу сейчас познакомить тебя, мой дорогой читатель.
Как это работает
На сервер ставится поисковый демон Sphinx, который индексирует через заданный промежуток времени статьи и контент вашего сайта - создает поисковый индекс.
На вашем сайте подключается Sphinx API, который есть для Java, PHP, Ruby (можно написать реализацию и для других языков), пишется поисковый модуль который делает несложные запросы к демону(сервису) Sphinx - searchd.
При запросе поисковой фразы с поисковой формы сайта через Sphinx API делается обращение к демону searchd, который нам возвращает ID записей с нужной сортировкой и фильтрацией. Дальше имея ID публикаций мы делаем один запрос к БД сайта и получаем всю информацию о наших статьях, остается только красиво вывести список найденных элементов.
Установка и настройка Sphinx на Linux
Предполагается что у вас уже установлена ОС Linux, на которой будет работать (или уже работает ) сайт или сервис, на котором нужно будет использовать Sphinx Search API.
Обновляем источники пакетов и ставим нужный софт:
Идем по ссылке http://sphinxsearch.com/downloads/release/ и качаем архив с исходными кодами для последнего стабильного релиза ( Get Source tarball tar.gz ). Потом распаковываем архив и переходим в разархивированную папку. Вот к примеру я качал 2.1.3-release:
Теперь компилируем наш Сфинкс с поддержкой MySQL (есть поддержка и других БД, смотри док.), поскольку весь полезный контент сайта хранится в БД MySQL:
Копируем шаблон файла с настройками и редактируем его содержимое под наши нужды:
В конфигурационном файле достаточно много настроек и все они заключены в секции где для каждого источника индексируемых данных описываются свои специфические опции и данные для доступа.
Приводить полное описание всех настроек я не буду, в шаблонном файле все хорошо документировано, а также в официальной документации (смотри ссылки в конце статьи) все понятно изложено. Чтобы все изначально прояснить приведу здесь текст своего конфигурационного файла с подробными комментариями:
Запускаем индексацию наших данных:
В случае успешного индексирования получим примерно вот такие строки:
Запускаем поискового демона:
В случае успешного запуска должны увидеть примерно вот такой вывод:
Делаем тестовый поисковый запрос, где YOUR_QUERY_STRING - ваша поисковая фраза:
После запуска будет выведена длинная простыня записей что отвечают критериям поиска.
Проверяем работу поиска с использованием PHP API. Внимание: PHP должен быть установлен на сервере! "YOUR_QUERY_STRING" - ваш поисковый запрос
Надеюсь у вас все получилось.
Скрипт автозапуска searchd для init.d
Теперь нужно сделать так чтобы демон searchd стартовал при загрузке/перезагрузке операционной системы. Ниже приведен пример создания и настройки скрипта для Debian/Ubuntu GNU/Linux без использования systemd.
Откроем для редактирования новый скрипт инициализации в папке "/etc/init.d":
Копируем и вставляем следующий текст (CTRL+C, CTRL+V) в скрипт /etc/init.d/searchd :
Установим права на скрипт запуска и зарегистрируем его в автозапуске:
Для надежности можете перезагрузить свой сервер и проверить запустился ли демон searchd:
Скрипт автозапуска searchd для systemd
В более новых версиях GNU/Linux уже присутствует такой мощный набор управления системой как systemd. Чтобы добавить наш демон searchd в автозапуск системы с использованием systemd нужно проделать несколько несложных операций.
Откроем для редактирования новый файл будущего скрипта для управления запуском searchd:
Копируем в редактор следующий текст скрипта:
Устанавливаем права на запуск скрипта:
Создаем конфигурационный файл для нашее службы (демона):
Копируем в редактор следующее содержимое:
Все должно работать!
Настройка автоматической переиндексации
Добавляем в системный планировщик заданий (крон, crontab) запуск индексатора через каждые сутки:
Добавляем в конец содержимого файла следующую строчку:
Все готово! Вы установили и настроили поисковый сервер .
Защита служебных портов
После настройки и запуска поискового сервера Sphinx важно помнить что его демн открывает порты 9312, 9306 (указанные в настройках) и делает их доступными на всех интерфейсах. Настоятельно рекомендую закрыть их от внешнего мира при помощи файрвола на внешнем интерфейсе (интернет). Вот два простых правила для IPTABLES:
Где eth0 - имя сетевого интерфейса, который смотрит в интернет.
Пример взаимодействия со Sphinx на PHP
Итак, сервер настроен все проиндексировано, работоспособность проверена. Качаем себе Sphinx API класс для работы в PHP:
Помещаем скрипт sphinxapi.php в свой проект и подключаем этот скрипт при помощи include/require.
Вот простая реализация подключения и выборки при помощи PHP(код для примера):
Заключение
Ниже привожу полезные ссылки по поисковому серверу Sphinx. Этой информации с лихвой достаточно чтобы во всем разобраться и настроить под себя.
-
- официальный сайт. - документация. - Wiki документация по Sphinx на одной странице. - Wiki документация по PHP API для Sphinx.
UPD: последняя версия Sphinx с открытым исходным кодом - 2.3.2-beta. В последующих версиях код автором теперь не предоставляется, есть только готовые сборки с бинарными файлами.
Рекомендую обратить свое внимание на проект Manticore Search, который базируется на форке последней Open Source версии движка Sphinx и имеет множество улучшений и фич!