Установка и настройка Sphinx

Дата: 23.04.2017 Автор Admin

Относительно недавно, мне было нужно настроить sphinxsearch для одного проекта на Bitrix.

Поэтому в этой статье я  поделюсь с вами информацией как просто это сделать.

И так, (англ. SQL Phrase Index) — система полнотекстового поиска, разработанная Андреем Аксёновым и распространяемая по лицензии GNU GPL.

Отличительной особенностью является высокая скорость индексации и поиска, а также интеграция с существующими СУБД (MySQL, PostgreSQL) и API для распространённых языков веб-программирования (официально поддерживаются PHP, Python, Java; существуют реализованные сообществом API для Perl, Ruby,.NET[1] и C++). Так что интегрировать эту систему реально и достаточно просто.

Рассмотрим основные плюсы Sphinx перед обычными (встроенными) системами поиска:

  • Высокая скорость индексации (до 10-15 МБ/сек на каждое процессорное ядро);
  • Высокая скорость поиска (до 150—250 запросов в секунду на каждое процессорное ядро с 1 000 000 документов);
  • Высокая масштабируемость (крупнейший известный кластер индексирует до 3 000 000 000 документов и поддерживает более 50 миллионов запросов в день);
  • Поддержка распределенного поиска;
  • Поддержка нескольких полей полнотекстового поиска в документе (до 32 по умолчанию);
  • Поддержка нескольких дополнительных атрибутов для каждого документа (то есть группы, временные метки и т. д.);
  • Поддержка стоп-слов;
  • Поддержка однобайтовых кодировок и UTF-8;
  • Поддержка морфологического поиска — имеются встроенные модули для английского, русского и чешского языков; доступны модули для французского, испанского, португальского, итальянского, румынского, немецкого, голландского, шведского, норвежского, датского, финского, венгерского языков;
  • Нативная поддержка MySQL (всех типов таблиц, в том числе MyISAM, InnoDB, NDB, архив и т. д.);
  • Нативная поддержка PostgreSQL;

Поддержка ODBC совместимых баз данных (MS SQL, Oracle и т. д.).

Впечатляет? Вот небольшой список тех кто использует Sphinx:

  • Хабрахабр
  • Викимапия
  • Буквоед
  • BitTorrent-трекер Пиратская бухта

Перейдем к установке.

Все операции проводились на 14.04 LTS, но инструкция должна подойти и для более свежих версий.

Добавляем репозиторий со свежим sphinx

Далее обновляем пакеты и устанавливаем сам Sphinx

Теперь создадим конфиг Sphinx c именем sphinx.conf  в каталоге  /etc/sphinxsearch/

Вот пример конфига Sphinx:

 

Рассмотрим секции конфига по порядку:

  • type — тип источника из которого мы будем брать данные, в данном случае БД mysql
  • sql_host — адрес сервера с БД
  • sql_user — пользователь для подключения к БД
  • sql_pass — пароль пользователя
  • sql_db — имя БД из которой мы будем импортировать данные для поиска
  • sql_port — порт подключения к БД, в данном случае используется стандартный порт Mysql
  • sql_query — SQL запрос для импорта данных, в которых нужно проводить поиск
  • sql_attr_uint и sql_attr_timestamp используемые атрибуты.
  • sql_query_info — вспомогательный запрос, не обязательный атрибут. В последних версиях игнорируется. Изначально его удобно использовать для дебага в консоли.

Давайте разберем из каких секций может состоять конфиг Sphinx

  1. source — Источник данных, откуда мы делаем импорт и будем проводить поиск
  2. index — Индекс это специальная структура данных, которая помогает Sphinx проводить поиск именно по ней.

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

Makes Matches Query Sortable Groupable Filterable Retreivable
first column Document ID YES [1] YES ALWAYS
(no definition) FIELD YES [2]
sql_attr_uint ATTRIBUTE YES YES YES YES
sql_attr_bool ATTRIBUTE YES YES YES YES
sql_attr_bigint ATTRIBUTE YES YES YES YES
sql_attr_timestamp ATTRIBUTE YES YES YES YES
sql_attr_str2ordinal ATTRIBUTE YES YES [3] [3]
sql_attr_float ATTRIBUTE YES YES YES YES
sql_attr_multi ATTRIBUTE YES YES YES YES
sql_attr_string ATTRIBUTE YES YES YES
sql_attr_str2wordcount ATTRIBUTE YES [3] YES YES
sql_field_string ATTRIBUTE + FIELD YES YES YES [2] YES
sql_field_str2wordcount ATTRIBUTE + FIELD YES YES [3] YES YES
sql_joined_field FIELD YES

Ниже мы рассмотрим реальный пример интеграции Sphinx в CMS , без использования плагинов.

Составим следующий конфиг Sphinx:

В данном примере мы будем проводить поиск по постам в блоге, нас интересуют следующие данные в БД wordpress:

  • ID
  • post_title
  • post_type
  • guid
  • post_content
  • post_date

Этих данных нам достаточно для идентификации постов WordPress при поиске через Sphinx.

Разберем сам конфиг.

Источник данных у нас Mysql

Подключение к нашей БД с wordpress

SQL запрос для импорта данных

Устанавливаем атрибуты

Далее идет сам индекс

Рассмотрим индекс поближе:

  • source — наш источник данных
  • path — системный путь, где будет лежать индекс
  • docinfo — способ хранения индекса может быть none, inline, extern
  • charset_type — кодировка, в данном случае я ее не использую
  • min_word_len — минимальный размер слова
  • enable_star — позволяет использовать звездочки в поисковых запросах.
  • min_infix_len — позволяет индексировать части слов

И последняя часть конфига, настройка самой службы Sphinx

Тут мы указываем на каком порту слушать запросы к sphinx, где хранить логи, timeout на чтение, максимальное кол-во параллельных поисковых запросов(30).

Стоит отметить что строка

позволит нам использовать при поиске синтаксис аля mysql, тоесть это значит что мы может подключаться к Sphinx нативными средствами для работы с Mysql и проводить поиск через них. Сейчас покажу как мы это сделаем в WordPress на PHP.

Сохраняем наш конфиг и перезапускаем службу Sphinx

Следующей командой мы можем проиндексировать все существующие индексы Sphinx

Следующей командой мы проиндексируем все изменения в индексе test1

Теперь в WordPress я изменю стандартную тему Twenty Sixteen , а именно файл поиска —  /-content/themes/twentysixteen/search.php

В сам файл я добавлю следующий код, для нативной работы со Sphinx через PHP

Что мы тут делаем? Да все просто:

  1. Подключаемся к Sphinx как к mysql серверу
  2. Проверяем подключение
  3. Выполняем поисковый запрос
  4. Формируем таблицу, по найденным результатам

Выглядит это вот так, я выполнил поиск по слову «привет»

Результаты выглядят так:

Собственно в таблице вы можете видеть следующие данные:

  • ID поста
  • Содержимое поста
  • Заголовок поста
  • тип поста
  • GUID
  • Дату

Сам пример файла search.php вы можете найти тут

Чтобы поиск в Sphinx обновлялся , вам нужно добавить в Cron задания по обновлению индекса.

В данном случае достаточно выполнить crontab -e и добавить в него строку

Для обновления нашего индекса test1 каждые 10 минут.

Из консоли Ubuntu вы можете подключиться к Sphinx через mysql клиент

Еще вы можете использовать дельта индексы, но об этом я постараюсь рассказать в рамках другой статьи.

Также дополню что для Bitrix настройка не отличается особенной сложностью, все описано в документации.

Но продублирую эту информацию для вас тут.

Создаем конфиг Sphinx для Bitrix

Скачиваем словари для Sphinx тут и копируем их в каталог /etc/sphinxsearch/dicts/

Перезапускаем службу Sphinx

Далее переходим на страницу настройки модуля «Поиск» (Настройки > Настройки продукта > Настройки модулей > Поиск) и указываем Sphinx как основной поиск.


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

На этом настройка связки Sphinx + Bitrix завершена, как видите тут нет ничего сложного, однако пример с WordPress и PHP показывает что возможности интеграции полнотекстового движка Sphinx впечатляющие =)

Удачной вам настройки!


Добавить комментарий

Ваш e-mail не будет опубликован.