Как установить и настроить Sphinx на CentOS 7

Вступление

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

Некоторые ключевые функции Sphinx:

  • Высокая производительность индексации и поиска

  • Расширенные инструменты индексации и запросов

  • Расширенная обработка результатов

  • Проверенная масштабируемость до миллиардов документов, терабайт данных и тысяч запросов в секунду

  • Простая интеграция с источниками данных SQL и XML, а также с поисковыми интерфейсами SphinxQL, SphinxAPI или SphinxSE

  • Простое масштабирование с распределенными поисками

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

Предпосылки

Прежде чем начать это руководство, вам понадобится:

Шаг 1 - Установка Сфинкса

На момент написания последней версии Sphinx является 2.2.11. Вы можете найти последнюю версию on на сайте Sphinx.

Перед установкой Sphinx сначала необходимо установить его зависимости.

sudo yum install -y postgresql-libs unixODBC

Перейдите в каталог + tmp +, чтобы загрузить файлы Sphinx в ненавязчивом месте.

cd /tmp

Загрузите последнюю версию Sphinx, используя + wget +.

wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm

Наконец, установите его, используя + yum +.

sudo yum install -y sphinx-2.2.11-1.rhel7.x86_64.rpm

Теперь вы успешно установили Sphinx на свой сервер. Перед запуском демона Sphinx давайте настроим его.

Шаг 2 - Создание тестовой базы данных

Здесь мы настроим базу данных, используя примеры данных в файле SQL, поставляемом с пакетом. Это позволит нам проверить, что поиск Sphinx работает позже.

Давайте импортируем образец файла SQL в базу данных. Сначала войдите в оболочку сервера MySQL.

mysql -u root -p

Введите пароль для пользователя root MySQL, когда его спросят. Ваше приглашение изменится на + MariaDB> +.

Создать фиктивную базу данных. Здесь мы называем это «тест», но вы можете назвать его как хотите.

CREATE DATABASE ;

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

SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;

Затем выйдите из оболочки MySQL.

quit

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

Шаг 3 - Настройка сфинкса

Конфигурация Sphinx должна находиться в файле с именем + sphinx.conf + в + / etc / sphinx +. Конфигурация состоит из 3 основных блоков: * index *, * searchd * и * source *.

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

Сначала переместите существующий файл + sphinx.conf +.

sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2

Создайте новый файл + sphinx.conf с помощью` + vi` или вашего любимого текстового редактора.

sudo vi /etc/sphinx/sphinx.conf

Каждый из блоков * index *, * searchd * и * source * описан ниже. Затем, в конце этого шага, весь + sphinx.conf + включен для вас, чтобы скопировать и вставить в файл.

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

  • + type +: тип источника данных для индексации. В нашем примере это * mysql *. Другие поддерживаемые типы включают pgsql, mssql, xmlpipe2, odbc и другие.

  • + sql_host +: имя хоста для хоста MySQL. В нашем примере это + localhost +. Это может быть домен или IP-адрес.

  • + sql_user +: имя пользователя для входа в MySQL. В нашем примере это * root *.

  • + sql_pass +: пароль для пользователя MySQL. В нашем примере это пароль пользователя root MySQL.

  • + sql_db +: имя базы данных, в которой хранятся данные. В нашем примере это * test *.

  • + sql_query +: запрос, который сбрасывает данные из базы данных в индекс.

Это исходный блок:

исходный блок для sphinx.conf

source src1
{
 type          = mysql

 #SQL settings (for ‘mysql’ and ‘pgsql’ types)

 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
}

Компонент * index * содержит источник и путь для хранения данных. + in

  • + source +: имя исходного блока. В нашем примере это * src1 *.

  • + путь +: путь для сохранения индекса.

индексный блок для sphinx.conf

index test1
{
 source        = src1
 path          = /var/lib/sphinx/test1
 docinfo       = extern
}

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

  • + listen +: порт, на котором будет работать демон Sphinx, за которым следует протокол. В нашем примере это * 9306: mysql41 *. Известные протоколы: : sphinx (SphinxAPI) и : mysql41 (SphinxQL)

  • + query_log +: путь для сохранения журнала запросов.

  • + pid_file +: путь к файлу PID демона Sphinx.

  • + seamless_rotate +: предотвращает сбои searchd при вращении индексов с огромными объемами данных для предварительного кэширования.

  • + preopen_indexes +: принудительно ли открывать все индексы при запуске.

  • + unlink_old +: удалять ли старые копии индекса при успешной ротации.

Блок поиска для sphinx.conf

searchd
{
 listen            = 9312:sphinx       #SphinxAPI port
 listen            = 9306:mysql41      #SphinxQL port
 log               = /var/log/sphinx/searchd.log
 query_log         = /var/log/sphinx/query.log
 read_timeout      = 5
 max_children      = 30
 pid_file          = /var/run/sphinx/searchd.pid
 seamless_rotate   = 1
 preopen_indexes   = 1
 unlink_old        = 1
 binlog_path       = /var/lib/sphinx/
}

Полная конфигурация для копирования и вставки приведена ниже. Единственная переменная, которую вам нужно изменить ниже, это переменная + sql_pass + в блоке источника, которая подсвечивается.

Полный файл sphinx.conf

source src1
{
 type          = mysql

 sql_host      = localhost
 sql_user      = root
 sql_pass      =
 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
}
index test1
{
 source            = src1
 path              = /var/lib/sphinx/test1
 docinfo           = extern
}
searchd
{
 listen            = 9306:mysql41
 log               = /var/log/sphinx/searchd.log
 query_log         = /var/log/sphinx/query.log
 read_timeout      = 5
 max_children      = 30
 pid_file          = /var/run/sphinx/searchd.pid
 seamless_rotate   = 1
 preopen_indexes   = 1
 unlink_old        = 1
 binlog_path       = /var/lib/sphinx/
}

Чтобы изучить дополнительные конфигурации, вы можете взглянуть на файл + / usr / share / doc / sphinx-2.2.11 / sphinx.conf.dist +, в котором подробно описаны все переменные.

Шаг 4 - Управление индексом

На этом шаге мы добавим данные в индекс Sphinx и обеспечим актуальность индекса с помощью + cron +.

Сначала добавьте данные в индекс, используя конфигурацию, которую мы создали ранее.

sudo indexer --all

Вы должны получить что-то похожее на следующее.

OutputSphinx 2.2.11-id64-release (95ae9a6)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file '/etc/sphinx/sphinx.conf'...
indexing index 'test1'...
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.006 sec, 29765 bytes/sec, 616.90 docs/sec
total 4 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
total 12 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg

В производственных средах необходимо поддерживать индекс в актуальном состоянии. Для этого давайте создадим работу Cron. Сначала откройте + crontab +.

crontab -e

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

кронтаб

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

Теперь, когда Sphinx полностью настроен и настроен, мы можем запустить сервис и попробовать его.

Шаг 5 - Запуск Сфинкса

Используйте + systemctl + для запуска демона Sphinx.

sudo systemctl start searchd

Чтобы проверить, работает ли демон Sphinx правильно, выполните:

sudo systemctl status searchd

Вы должны получить что-то похожее на следующее.

Output●  searchd.service - SphinxSearch Search Engine
  Loaded: loaded (/usr/lib/systemd/system/searchd.service; disabled; vendor preset: disabled)
  Active: active (running) since Fri 2016-08-19 17:48:39 UTC; 5s ago
  . . .

Sphinx полностью настроен и работает, поэтому мы проверим, работает ли он правильно в следующем.

Шаг 6 - Тестирование функциональности поиска

Теперь, когда все настроено, давайте проверим функциональность поиска. Подключитесь к SphinxQL с помощью интерфейса MySQL. Ваше приглашение изменится на + MySQL> +.

mysql -h0 -P9306

Давайте искать предложение.

SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;

Вы должны получить что-то похожее на следующее.

Output+------+----------+------------+
| id   | group_id | date_added |
+------+----------+------------+
|    1 |        1 | 1465979047 |
|    2 |        1 | 1465979047 |
+------+----------+------------+
2 rows in set (0.00 sec)

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| total         | 2        |
| total_found   | 2        |
| time          | 0.000    |
| keyword[0]    | test     |
| docs[0]       | 3        |
| hits[0]       | 5        |
| keyword[1]    | document |
| docs[1]       | 2        |
| hits[1]       | 2        |
+---------------+----------+
9 rows in set (0.00 sec)

В приведенном выше результате вы можете видеть, что Sphinx нашел 2 совпадения из нашего индекса + test1 + для нашего тестового предложения. Команда + SHOW META; + также показывает попадания по ключевому слову в предложении.

Давайте искать некоторые ключевые слова.

CALL KEYWORDS ('test one three', 'test1', 1);

Вы должны получить что-то похожее на следующее.

Output+------+-----------+------------+------+------+
| qpos | tokenized | normalized | docs | hits |
+------+-----------+------------+------+------+
| 1    | test      | test       | 3    | 5    |
| 2    | one       | one        | 1    | 2    |
| 3    | three     | three      | 0    | 0    |
+------+-----------+------------+------+------+
3 rows in set (0.00 sec)

В приведенном выше результате вы можете видеть, что в индексе * test1 * Sphinx обнаружил:

  • 5 совпадений в 3 документах по ключевому слову "тест"

  • 2 совпадения в 1 документе по ключевому слову «один»

  • 0 совпадений в 0 документах по ключевому слову "три"

Теперь, когда вы протестировали Sphinx, вы можете удалить тестовую базу данных с помощью + DROP DATABASE test; +, если хотите.

Когда вы закончите, покиньте оболочку MySQL.

quit

Заключение

В этом руководстве мы показали, как установить Sphinx и выполнить простой поиск с использованием SphinxQL и MySQL.

Вы также можете найти официальные native реализации SphinxAPI для PHP, Perl, Python, Ruby и Java. Если вы используете Nodejs, вы также можете использовать the пакет SphinxAPI.

Используя Sphinx, вы можете легко добавить пользовательский поиск на свой сайт. Для получения дополнительной информации об использовании Sphinx посетите http://sphinx.com [веб-сайт проекта].

Related