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

Sphinx – это открытая система для полнотекстового поиска, которая приобрела популярность благодаря своей эффективности и дружественности. Система Sphinx может искать данные в любых источниках: в базах SQL, текстовых и HTML-файлах, почтовых ящиках, и т.д.

Sphinx имеет следующие функции:

  • Высокопроизводительная индексация и поиск
  • Продвинутые инструменты индексации и запросов
  • Продвинутая постобработка
  • Масштабируемость до миллиардов документов, терабайтов данных и тысяч запросов в секунду
  • Простая интеграция с источниками данных SQL и XML и поисковыми интерфейсами SphinxQL, SphinxAPI или SphinxSE
  • Распределенный поиск.

В данном руководстве речь пойдет об установке Sphinx и настройке системы для взаимодействия с MySQL.

Требования

Для выполнения руководства нужны:

  • Предварительно настроенный сервер Ubuntu 14.04;
  • Не-рутовый пользователь с расширенными привилегиями sudo (подробнее – в этой статье).

1: Установка MySQL

Примечание: Если СУБД MySQL уже установлена, пропустите данный раздел.

Итак, для начала нужно установить сервер MySQL для хранения данных, на которых позже будет продемонстрирована работа Sphinx.

Обновите список пакетов:

sudo apt-get update

А затем установите MySQL:

sudo apt-get install mysql-server

При запросе введите root-пароль MySQL и подтвердите его.

2: Установка Sphinx

Теперь можно приступать к установке Sphinx. Для этого запустите:

sudo apt-get install sphinxsearch

Система поиска Sphinx успешно установлена на сервер, но её необходимо настроить перед запуском.

3: Создание базы данных для Sphinx

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

Войдите в оболочку MySQL:

mysql -u root -p

Введите root-пароль MySQL, после чего появится командная строка:

mysql>

Создайте БД по имени test:

CREATE DATABASE test;

Импортируйте SQL-файл.

SOURCE /etc/sphinxsearch/example.sql;

Затем закройте оболочку MySQL:

quit

Теперь БД test заполнена данными.

4: Настройка Sphinx

Теперь приступайте к настройке системы Sphinx.

Создайте конфигурационный файл sphinx.conf:

sudo nano /etc/sphinxsearch/sphinx.conf

Конфигурации Sphinx состоят из трёх основных блоков: index, searchd и source. Описание каждого из них и общий вид конфигурационного файла можно найти ниже.

Блок source содержит тип источника данных, имя пользователя и пароль MySQL. Первый столбец запроса SQL  должен содержать уникальный ID. Запрос SQL будет выполняться для каждого индекса, а затем передавать данные в индексный файл Sphinx. Блок source состоит из таких полей:

  • sql_host: имя хоста MySQL; в данном случае это localhost. В это поле нужно внести домен или IP-адрес.
  • sql_user: имя пользователя MySQL (в данном случае это root).
  • sql_pass: пароль MySQL (в данном случае – password).
  • sql_db: имя БД, в которой хранятся нужные данные (в этом руководстве – БД test).
  • sql_query: запрос, который сбрасывает данные в индексный файл.

В целом данный блок кода выглядит так:

source src1
{
type          = mysql
sql_host      = localhost
sql_user      = root
sql_pass      = password
sql_db        = test
sql_port      = 3306 # optional, default is 3306
sql_query     = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents
sql_attr_uint     = group_id
sql_attr_timestamp    = date_added
sql_query_info        = SELECT * FROM documents WHERE id=$id
}

Блок index содержит информацию об источнике и путь к местонахождению данных.

  • source: имя блока source. В данном случае это src1.
  • path: путь к индексному файлу.
  • charset_type: набор символов (charset) индекса; в данном случае – utf-8.

Этот блок выглядит так:

index test1
{
source            = src1
path          = /var/lib/sphinxsearch/data/test1
docinfo           = extern
charset_type      = sbcs
}

Блок searchd содержит порты и переменные для запуска демона Sphinx.

  • listen: порт, на котором нужно запустить Sphinx (в руководстве – 9312).
  • query_log: путь к логу запросов.
  • pid_file: путь к PID-файлу Sphinx.
  • max_matches: максимальное количество совпадений, которое нужно выводить за один раз.
  • seamless_rotate: предотвращает останов searchd при кэшировании большого объема данных.
  • preopen_indexes: указывает, нужно ли предварительно открывать все индексы.
  • unlink_old: указывает, нужно ли отключить старые копии индекс-файлов.

searchd
{
listen            = 9312   # Port to listen on
log           = /var/log/sphinxsearch/searchd.log
query_log     = /var/log/sphinxsearch/query.log
read_timeout      = 5
max_children      = 30
pid_file      = /var/run/sphinxsearch/searchd.pid
max_matches       = 1000
seamless_rotate       = 1
preopen_indexes       = 1
unlink_old        = 1
binlog_path       = /var/lib/sphinxsearch/data
}

Ниже приведены все конфигурации для файла, которые можно просто скопировать и вставить. Единственная переменная, которую нужно отредактировать – это sql_pass в блоке source.

source src1
{
type          = mysql
sql_host      = localhost
sql_user      = root
sql_pass      = password # change this to your root users MySQL password
sql_db        = test
sql_port      = 3306
sql_query     = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents
sql_attr_uint         = group_id
sql_attr_timestamp    = date_added
sql_query_info        = SELECT * FROM documents WHERE id=$id
}
index test1
{
source            = src1
path              = /var/lib/sphinxsearch/data/test1
docinfo           = extern
charset_type      = sbcs
}
searchd
{
listen            = 9312
log               = /var/log/sphinxsearch/searchd.log
query_log         = /var/log/sphinxsearch/query.log
read_timeout      = 5
max_children      = 30
pid_file          = /var/run/sphinxsearch/searchd.pid
max_matches       = 1000
seamless_rotate   = 1
preopen_indexes   = 1
unlink_old        = 1
binlog_path       = /var/lib/sphinxsearch/data
}

5: Добавление данных в индекс

В данном разделе показано, как добавить данные в индекс Sphinx. Для этого используется ранее созданный конфигурационный файл.

sudo indexer --all

Вывод имеет примерно такой вид:

Sphinx 2.0.4-id64-release (r3135)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinxsearch/sphinx.conf'...
indexing index 'test1'...
WARNING: collect_hits: mem_limit=0 kb too low, increasing to 25600 kb
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.005 sec, 33788 bytes/sec, 700.28 docs/sec
total 3 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
total 9 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg

Чтобы поддерживать индекс в актуальном состоянии, нужно настроить работу cron. Откройте crontab:

crontab -e

Возможно, подсказка спросит, какой текстовый редактор вы предпочитаете; выберите любой удобный редактор. В данном руководстве используется nano.

Скопируйте и вставьте следующий код в конец файла, а затем сохраните и закройте его.

@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all

Этот cronjob будет запускаться каждый час и добавлять данные в индекс, обращаясь к конфигурационному файлу.

6: Запуск Sphinx

Итак, система Sphinx готова к запуску.

По умолчанию демон Sphinx отключен. Чтобы включить Sphinx, откройте /etc/default/sphinxsearch:

sudo nano /etc/default/sphinxsearch

Найдите строку START=no и установите значение yes:

START=yes

Сохраните и закройте файл.

Теперь можно запустить демон Sphinx:

sudo service sphinxsearch start

7: Тестовый поиск

Итак, попробуйте использовать Sphinx для поиска данных. Для этого используйте команду:

search this is my test document number

На экране появится примерно такой вывод:

Sphinx 2.0.4-id64-release (r3135)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinxsearch/sphinx.conf'...
index 'test1': query 'this is my test document number ': returned 2 matches of 2 total in 0.002 sec
displaying matches:
1. document=1, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014
id=1
group_id=1
group_id2=5
date_added=2014-12-16 09:49:04
title=test one
content=this is my test document number one. also checking search within phrases.
2. document=2, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014
id=2
group_id=1
group_id2=6
date_added=2014-12-16 09:49:04
title=test two
content=this is my test document number two
words:
1. 'this': 4 documents, 4 hits
2. 'is': 4 documents, 4 hits
3. 'my': 2 documents, 2 hits
4. 'test': 3 documents, 5 hits
5. 'document': 2 documents, 2 hits
6. 'number': 3 documents, 3 hits

Выше можно найти два совпадения из тестового индекса. Можно также выполнять поиск по слову.

Заключение

Данное руководство охватывает основы поиска данных при помощи Sphinx. По этой ссылке можно найти Sphinx API для PHP, Perl, Python, Ruby и Java.

Пользователи PHP могут найти могут найти полезные примеры использования Sphinx по этой ссылке.

Sphinx позволяет добавить пользовательский поиск на сайт. Более подробную информацию по использованию Sphinx можно найти на сайте проекта.

Tags: , , , , ,

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