2.2.6. Sphinx

Sphinx (SQL Phrase Index) — система полнотекстового поиска с поддержкой морфологии различных языков. Позволяет быстро и гибко искать информацию в базе данных по произвольному тексту.

Важные моменты:

  • На тарифах бизнес-хостинга Sphinx доступен по умолчанию. Заказывать его отдельно не нужно.
  • Заказывать Sphinx может только владелец хостинг-аккаунта.
  • При первом заказе Sphinx доступен бесплатный 7-дневный тестовый период.
  1. Откройте раздел «Хостинг».
  2. В блоке «Дополнительные сервисы» нажмите «Sphinx»:
  3. В блоке «Основные данные» нажмите «Заказать»:
  4. Нажмите «Заказать»:
  5. Если услуга заказывается впервые, пропустите этот шаг, чтобы воспользоваться бесплатным 7-дневным тестовым периодом. В противном случае оплатите автоматически сформированный счёт любым из доступных способов и дождитесь зачисления оплаты.
  6. Подождите примерно 30 минут, пока активируется услуга.

Для использования Sphinx на сайте нужно настроить как сам Sphinx, так и сайт.

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

Вкладка содержит правила, описывающие, с какими данными и как должен работать Sphinx. По умолчанию в конфигурацию подставляется шаблон с примером:

Конфигурация состоит из двух секций:

  • Источник данных (source) — конфигурация источника данных и его название (в примере db_source):
    • Тип данных (type) — тип источника данных (в примере mysql).
    • Данные для подключения к базе данных (sql_host, sql_port, sql_user, sql_pass, sql_db) — данные для подключения к базе данных MySQL, откуда будет браться информация для индексирования.
    • Предварительный запрос (sql_query_pre) — запрос, который будет перед основным запросом на получение данных из базы (в примере SET NAMES utf8 — установка кодировки UTF-8).
    • Основной запрос (sql_query) — запрос на получение из базы данных необходимых данных для индексирования (в примере select id, title, content from table — столбцы id, title и content из таблицы table).
    • Другие директивы — позволяют определять порядок группировки, фильтрации, сортировки (подробную информацию можно найти в официальной документации).
  • Параметры индексации (index) — конфигурация индекса и его название (в примере test_index):
    • Источник данных для индексирования (source) — название источника данных, откуда будет браться информация для индексирования (в примере db_source — см. выше).
    • Путь, по которому будут храниться данные индекса (path) — абсолютный путь к файлу с индексами (в примере /home/example/.system/sphinx/test_index).
    • Настройки морфологии (morphology) — название библиотеки (в примере stem_ru), которая будет использоваться для поиска слова с разными словоформами — например, по запросу «собака» будут возвращаться результаты с вариантами «собаки», «собакой», «собаками» и т. д.
    • Сохранение в индексе слов в исходном виде (index_exact_words) — при использовании совместно с директивой expand_keywords позволяет возвращать по запросу более релевантные результаты (в примере 1 — включено).
    • Минимальная длина слова для индексации (min_word_len) — по умолчанию используется 1, но слова такой длины обычно не несут смысловой нагрузки (в примере 3).
    • Другие директивы — позволяют определять порядок группировки, фильтрации, сортировки (подробную информацию можно найти в официальной документации).

Для включения поддержки лемматизации нужно разместить в хостинг-аккаунте файлы нужных словарей и добавить в конфигурацию секцию:

common {
    lemmatizer_base = /home/example/path/to/sphinx/dicts/
}

С подробным описанием работы Sphinx и списком всех его параметров можно ознакомиться в официальной документации (англ.).

Ниже можно:

  • Выбрать протокол доступа к поисковому демону Sphinx (searchd):
    • «MySQL» — доступ через SphinxQL, разновидность SQL, похожую на MySQL.
    • «Sphinx» — доступ через SphinxAPI, собственный API Sphinx.
  • Включить или отключить ведение лога запросов к Sphinx — query_log.

После нажатия «Сохранить конфигурацию»:

  • Sphinx будет перезапущен.
  • Если в конфигурации будут обнаружены секции, описывающие дисковые поисковые индексы:
    • Для них автоматически будут созданы отдельные cron-задачи на вкладке «Индексы» с периодичностью обновления раз в 15 минут.
    • Сразу после сохранения конфигурационного файла будет запущено создание индексов (может занять некоторое время).
Вкладка содержит список добавленных индексов:

Колонки:

  • «Индекс» — название индекса. Указывается в конфигурации в секции с параметрами индексации.
  • «Частота обновления» — текущее расписание запуска индексирования в стандартном формате cron. По умолчанию индексирование запускается раз в 15 минут.
  • «Размер» — размер индекса. Данные кешируются на 10 минут.
  • Кнопки:
    • Приостановка/запуск — кнопка приостановки/запуска индексирования по расписанию.
    • Редактирование — кнопка изменения расписания запуска индексирования.
    • Удаление — кнопка удаления индекса. Внимание! После нажатия из конфигурации будет удалена секция с параметрами индексации для данного индекса.

Внимание!

Перед использованием плагинов для работы со Sphinx внимательно ознакомьтесь с их требованиями, а также совместимостью. Большинство плагинов давно не поддерживаются и работают с версией Sphinx 2.2 или ниже, на хостинге используется версия 3.

Настройка сайта для работы со Sphinx находится в компетенции разработчика сайта или привлечённых сторонних специалистов.

Задача сводится к следующим этапам:

  1. Изучить содержимое базы данных сайта и определить, по каким именно данным требуется быстрый поиск.
  2. Сконфигурировать Sphinx с нужными параметрами: указать, из какой базы данных нужно брать данные, какие таблицы и столбцы нужно индексировать, задать правила индексации.
  3. Добавить на сайт код, который вместо стандартного поиска в базе данных будет искать данные в созданном индексе Sphinx. Код может быть написан разработчиком либо самостоятельно, либо за основу могут быть взяты готовые плагины или модули, упомянутые на официальном сайте.

Подключение сайта к Sphinx выполняется через сокет. Путь к сокету можно найти на странице управления Sphinx. Порт следует указывать в зависимости от конфигурации подключаемого плагина, в целом портом можно пренебречь, указав его как 0 или 9312.

SphinxApi

Для работы со Sphinx можно использовать PHP-библиотеку ShpinxApi. Пример использования библиотеки доступен в том же репозитории в качестве консольного скрипта SphinxTest.

Для тестирования можно взять следующий пример скрипта:

<?php
include('sphinxapi.php');
 
$cl = new SphinxClient();
$cl->SetServer("/home/" . get_current_user() . "/.system/sphinx/sphinx.socket", 9312);
 
$cl->SetMatchMode(SPH_MATCH_ANY); 
$result = $cl->Query("Example Search Phrase"); // поисковый запрос
 
// обработка результатов запроса
if ($result === false) { 
      echo "Query failed: " . $cl->GetLastError() . ".\n"; 
  } else {
      if ($cl->GetLastWarning()) {
          echo "WARNING: " . $cl->GetLastWarning() . "\n\n";
      }
      if (!empty($result["matches"])) { 
          foreach ($result["matches"] as $found => $info) {
                echo $found . "<br />"; 
          }
      }
  }
exit;
  1. Скопируйте путь к логу из раздела управления Sphinx.
  2. Выполните одну из команд:
    • Просмотр полного лога:
      cat ~/.system/sphinx/searchd.log
    • Мониторинг лога в реальном времени (для завершения используйте сочетание Ctrl+C):
      tail -f ~/.system/sphinx/searchd.log
Содержание