Sphinx — система полнотекстового поиска, а можно даже сказать база данных с ориентацией на поиск. Эта статья представляет собой пошаговую инструкцию по установке Sphinx на Windows и созданию простого realtime индекса.
Здесь всё предельно просто. Скачиваем архив с последней версией Sphinx c официального сайта. На момент написания статьи это версия 3.3.1.
Распаковываем архив в любую папку. В моём случае это c:\utils\sphinx
.
На этом установка окончена. Можно пользоваться :)
Конфигурацию Sphinx и все данные, логи и прочее нужно где-то хранить: можно создать папку в самой директории sphinx
, можно в любом другом месте. Я пошёл по первому пути и сделал папку data
, в которой буду хранить все конфигурации, а в ней папку test
для примера.
Итак, для начала создаём файл с конфигурация Sphinx c:\utils\sphinx\data\test\sphinx.conf
со следующим содержимым:
# realtime индекс
index products
{
# Тип индекса
type = rt
# Файл с данными индекса
path = c:/utils/sphinx/data/test/indexes/products
# Атрибуты
rt_attr_string = name
rt_attr_string = color
# Поля для полнотекстового поиска
rt_field = name
rt_field = desc
}
# Конфигурация
searchd
{
listen = 9306:mysql41
log = c:/utils/sphinx/data/test/searchd.log
query_log = c:/utils/sphinx/data/test/query.log
read_timeout = 5
client_timeout = 300
max_children = 30
persistent_connections_limit = 30
pid_file = c:/utils/sphinx/data/test/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads
binlog_path = c:/utils/sphinx/data/test/binlog
}
Обратите внимание, что все пути, указанные в конфиге, нужно предварительно создать вручную:
c:/utils/sphinx/data/test/indexes/
c:/utils/sphinx/data/test/binlog/
Конфигурация готова, можем попробовать запустить демон searchd.exe
(находится в папке bin
), указав путь к конфигурации с помощью параметра -c
:
searchd.exe -c ../data/test/sphinx.conf
Если всё сделали правильно, то увидим в командной строке что-то похожее на это:
Realtime индекс нужно наполнять вручную. Напишем небольшой PHP-скрипт populate.php
:
<?php
declare(strict_types=1);
// Подключаемся к Sphinx
$dbh = new PDO('mysql:host=localhost;port=9306;dbname=products', '', '');
// Очистка индекса
$dbh->exec('TRUNCATE RTINDEX products');
// Данные для добавления
$products = [
[1, 'Стол складной розовый', 'Прекрасный стол, чтобы встретить новый год', 'pink'],
[2, 'Стул зелёный', '', 'green'],
[3, 'Стол зелёный', '', 'green'],
];
// Добавляем данные в индекс
foreach ($products as $product) {
$statement = $dbh->prepare(
'INSERT INTO products (id,name,desc,color) ' .
'VALUES (:id,:name,:desc,:color)'
);
$statement->bindParam(':id', $product[0]);
$statement->bindParam(':name', $product[1]);
$statement->bindParam(':desc', $product[2]);
$statement->bindParam(':color', $product[3]);
$statement->execute();
}
... и запустим его (в этом время демон sphinx должен работать):
php populate.php
Подключиться к Sphinx можно с помощью клиента mysql:
mysql -h127.0.0.1 -P9306
Примеры запросов к индексу:
Как применить изменения в структуре realtime индекса?
После изменения конфигурации индекса в файле sphinx.conf
необходимо остановить демон Sphinx, удалить все файлы индекса и запустить демон заново.
При написании статьи использовалось следующее ПО: