Вступление
Sphinx - это поисковая система с открытым исходным кодом, которая позволяет осуществлять полнотекстовый поиск. Наиболее известен тем, что выполняет поиск по большим данным очень эффективно. Индексируемые данные, как правило, могут поступать из самых разных источников: базы данных SQL, текстовые файлы, файлы HTML, почтовые ящики и т. Д.
-
Некоторые ключевые функции Sphinx: *
-
Высокая производительность индексации и поиска
-
Расширенные инструменты индексации и запросов
-
Расширенная обработка результатов
-
Проверенная масштабируемость до миллиардов документов, терабайт данных и тысяч запросов в секунду
-
Простая интеграция с источниками данных SQL и XML, а также с поисковыми интерфейсами SphinxQL, SphinxAPI или SphinxSE
-
Простое масштабирование с распределенными поисками
В этом уроке мы настроим Sphinx с сервером MySQL, используя пример файла SQL, включенного в дистрибутив. Это даст вам основную идею о том, как использовать Sphinx для вашего проекта.
Предпосылки
Прежде чем начать это руководство, вам понадобится:
-
A Ubuntu 14.04 Droplet.
-
Пользователь не-root, который вы можете настроить, следуя https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-ubuntu-14-04- VPS [этот урок].
Шаг 1 - Установка MySQL Server
-
Примечание: * Вам необходимо заполнить этот раздел, только если у вас еще не установлен сервер MySQL.
В этом разделе мы установим сервер MySQL. MySQL позволит нам хранить базу данных с примерами данных, которые мы можем использовать для проверки поисковых возможностей Sphinx.
Обновите список пакетов.
sudo apt-get update
Затем установите сервер MySQL.
sudo apt-get install mysql-server
При появлении запроса введите пароль для пользователя root и еще раз введите тот же пароль для подтверждения.
Шаг 2 - Установка Сфинкса
В этом разделе мы установим Sphinx.
Чтобы установить Sphinx, запустите:
sudo apt-get install sphinxsearch
Теперь вы успешно установили Sphinx на свой сервер. Перед запуском демона Sphinx давайте настроим его.
Шаг 3 - Создание тестовой базы данных
В этом разделе мы настроим базу данных, используя пример файла SQL, поставляемого с пакетом.
Давайте импортируем пример файла SQL в базу данных.
Войдите в оболочку сервера MySQL.
mysql -u root -p
При появлении запроса введите пароль для пользователя root MysQL. Ваше приглашение изменится на + mysql> +
.
Создайте базу данных с именем + test
.
CREATE DATABASE test;
Импортируйте файл SQL.
SOURCE /etc/sphinxsearch/example.sql;
Затем выйдите из оболочки MySQL.
quit
Теперь у вас должна быть тестовая база данных, заполненная данными.
Шаг 4 - Настройка сфинкса
В этом разделе мы настроим файл конфигурации Sphinx.
Создайте файл + sphinx.conf +
.
sudo nano /etc/sphinxsearch/sphinx.conf
Конфигурация Sphinx состоит из 3 основных блоков, которые необходимы для работы. Это * index *, * searchd * и * source *. Каждый из этих блоков описан ниже, и в конце этого шага включается полный набор + sphinx.conf +
для вставки в файл.
Блок * source * содержит тип источника, имя пользователя и пароль для сервера MySQL. Первый столбец запроса SQL должен быть уникальным идентификатором. Запрос SQL будет выполняться для каждого индекса и выводить данные в файл индекса Sphinx. Ниже приведены описания каждого поля и самого исходного блока.
-
+ sql_host +
: имя хоста для хоста MySQL. В нашем примере это * localhost *. Это может быть домен или IP-адрес. -
+ sql_user +
: имя пользователя для входа в MySQL. В нашем примере это * root *. -
+ sql_pass +
: пароль для пользователя MySQL. В нашем примере это пароль пользователя * root * MySQL -
+ 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 +
: имя исходного блока. В нашем примере это * src1 *. -
+ путь +
: этот путь для сохранения индекса. -
+ charset_type +
: это кодировка индекса. Вы также устанавливаете это в * 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 src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = # 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 - Добавление данных в индекс
В этом разделе мы добавим данные в индекс Сфинкса.
Добавьте данные в индекс, используя конфигурацию, которую мы создали ранее.
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
Чтобы поддерживать индекс в актуальном состоянии, давайте создадим cronjob.
Откройте crontab.
crontab -e
Вас могут спросить, какой текстовый редактор вы хотите использовать. Выберите тот, который вы предпочитаете; В этом уроке мы использовали + nano +
.
Скопируйте и вставьте следующее в конец файла, затем сохраните и закройте его.
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
Вышеупомянутый cronjob будет запускаться каждый час и добавлять новые данные в индекс, используя файл конфигурации по умолчанию.
Шаг 6 - Запуск Сфинкса
В этом разделе мы запустим демон Sphinx.
По умолчанию демон Sphinx отключен. Чтобы включить Sphinx, сначала откройте + / etc / default / sphinxsearch +
.
sudo nano /etc/default/sphinxsearch
Найдите строку + START = no +
и установите для нее значение yes.
START=yes
Затем сохраните и закройте файл.
Наконец, запустите демон Сфинкса.
sudo service sphinxsearch start
Шаг 7 - Тестирование поиска
В этом разделе мы проверим наш поиск. Введите следующую команду.
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
Выше вы можете найти 2 совпадения из нашего тестового индекса для нашего поискового запроса. Вы также можете найти совпадения по слову.
Заключение
В этом уроке мы показали вам очень простой поиск с использованием командной строки. Вы также можете найти официальные встроенные реализации SphinxAPI для PHP, Perl, Python, Ruby и Java here.
Если вы используете PHP, here - несколько удобных примеров для тестирования Sphinx.
Используя Sphinx, вы можете легко добавить пользовательский поиск на свой сайт. Для получения дополнительной информации об использовании Sphinx, посетите http://sphinxsearch.com [веб-сайт проекта].