Размер шрифта:
Установка Sphinx под Linux - строим свой поисковый сервер
Play

Установка 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 и имеет множество улучшений и фич!

📎📎📎📎📎📎📎📎📎📎