Predvoditelev.RU
Заметки

Установка Sphinx на Windows и создание realtime индекса

Sphinx — система полнотекстового поиска, а можно даже сказать база данных с ориентацией на поиск. Эта статья представляет собой пошаговую инструкцию по установке Sphinx на Windows и созданию простого realtime индекса.

Установка Sphinx на Windows

Здесь всё предельно просто. Скачиваем архив с последней версией Sphinx c официального сайта. На момент написания статьи это версия 3.3.1.

Ссылка на скачивание Sphinx для Windows
Страница загрузки Sphinx

Распаковываем архив в любую папку. В моём случае это c:\utils\sphinx.

Содержимое папки sphinx
Содержимое папки sphinx

На этом установка окончена. Можно пользоваться :)

Создание конфигурации Sphinx с realtime индексом

Конфигурацию 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

Если всё сделали правильно, то увидим в командной строке что-то похожее на это:

Работа демона Sphinx в консоли
Запуск демона Sphinx

Наполнение индекса

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

Подключиться к Sphinx можно с помощью клиента mysql:

mysql -h127.0.0.1 -P9306

Примеры запросов к индексу:

Запросы к Sphinx через клиент mysql
Запросы к индексу Sphinx

Вопросы/Ответы

Как применить изменения в структуре realtime индекса?

После изменения конфигурации индекса в файле sphinx.conf необходимо остановить демон Sphinx, удалить все файлы индекса и запустить демон заново.

При написании статьи использовалось следующее ПО:

  • Sphinx 3.3.1
  • Windows 10
  • MySQL 8.0.19
  • PHP 8.0.1
@sergei_predvoditelev — Авторский канал в Telegram: заметки о веб-разработке, PHP, открытом ПО, развитии и немного о жизни.