Простая настройка и запуск Sphinx на debian для полнотекстового поиска на сайте

Стандартный полнотекстовый поиск MySQL не решает многих задач и не настолько производителен, как поиск Sphinx. Привожу простой пример установки и настройки Sphinx в debian для организации поиска на сайтах. Установим версию 2.2.11 из стандартного репозитория: apt install sphinxsearch

Далее заходим /etc/sphinxsearch/sphinx.conf и настраиваем конфиг подобным образом:

Для первичного запуска хватит, потом желательно добавить стоп слова и прочие настройки на основе лога запросов и их скорости. В общем в этот файл придется заглянуть ещё раз 100500(простая настройка и запуск Sphinx да) Перезапустим службу и проиндексируем все добавленные конфиги:

Индексация/переиндексация БД таблицы объемом 5 млн записей в 2.7 гига занимает чуть больше 2 минут. Скорость отменная. Чтобы поиск заработал необходимо запустить демон с соответствующим конфигом:

Теперь мы можем искать по индексу из консоли или из под php. Для поиска из консоли mysql -h0 -P9806 и собственно запрос:

Из под php соединяемся так: $db_index = new mysqli('localhost:9806');  бд выбирать не нужно, сразу можно делать запросы, как в обычной базе. Только запросы делаются не к таблице, а к её индексу. Сервис слушает порт 9806 на локальной lo петле и протоколу SphinxQL. В примерах по данному протоколу обычно указывается порт 9306, но у меня он занят. Также в образцах конфигов данный порт зачем-то открыт для всех желающих извне… Хм… это 100% точно есть хорошо. Например, если в конфиге настроено обновление индексов в реальном времени, то это получается, можно с сервера дяди Васи «обновить» чего-нибудь кому-нибудь тому, кто не вдумчиво скопипастил конфиг? А  таких товарищей 99%, прям бери в гугл бей «9306:mysql41», находи где они постят свои проблемы со sphinx на форумах, определяй их серваки и в путь. Поэтому в конфиге обязательно 127.0.0.1:9806:mysql41 Слушает только локалка!

Для переиндексации необходимо выполнить:

Можно поставить данные задачи на крон, обновляя индексацию всех ресурсов и перезапуская демон. Одной командой:

Но лучше сделать по другому. Демон нужно запускать при каждом перезапуске системы, поэтому создадим соответствующий unit файл, который будет это делать. И теперь наша крон задача на переиндексацию будет выглядеть так:

2 комментария

  1. Здравствуйте!
    1. Как осуществляется сортировка на уровне запроса к Spinhx.
    2. Почему максимум 1000 резултатов?
    3. Кажись что не всё индексируется, то есть — некоторые запросы не вазращают результат.

    Не помешала бы инструкция по Manticore — это что то вроде нового Spinhxsa.

    1. Здравствуйте! 1. Для каждого запроса расчитывается WEIGHT() это вес, релевантность. По ней и сортировка автоматически, как она там осуществляется это уже сам движок копать надо. 2. В старых версиях в конфиге был параметр max_matches, теперь это можно задавать в самом запросе через OPTION
      select * from index_tab where match(‘1’) limit 7898 OPTION max_matches=5000;
      Параметр влияет насколько я понимаю на производительность, чем он меньше, тем быстрее. 3. Зависит от настроек конфига, там масса параметров в директивах индексации.
      Manticore весьма интересный проект судя по всему, спасибо, буду иметь его ввиду на будущее.

Оставить комментарий

Ваш адрес email не будет опубликован.