Manticore як сучасна альтернатива Sphinx

Багато хто використовує для повнотекстового пошуку рушій Sphinx:

і пише для нього нові програми, але мало хто знає про його сучасну реалізацію - Manticore:

Класично, сферою застосування може бути пошуковий сервер для сайту, будь якої бази даних, індекс кравлера інтернет / локальної мережі, тощо.

У той час, як Sphinx версії 3 і досі має закритий код, Manticore - це форк відкритого Sphinx 2.

Наразі активно розробляється, має живу спільноту і містить багато доповнень, особливо в плані автоматизації real-time індексів.

Окрім того, Manticore у більшості випадків може замінити собою сервер PostgreSQL або MySQL, де не потрібна гнучка вибірка і багаторівневі запити.

Таким чином, можна значно заощадити на використанні жорсткого диску для великих індексів а також зменшити використання пам'яті у разі, якщо MySQL використовується просто як основна база даних (до якої раніше звертався Sphinx через document ID).

Встановлення

На прикладі Debian / Linux, доволі просте:

wget https://repo.manticoresearch.com/manticore-repo.noarch.deb
dpkg -i manticore-repo.noarch.deb
apt update
apt install manticore manticore-extra

Сервіс одразу буде доступний через systemd:

systemctl start manticore

Працює сервер на порті `9308`

Після запуску, можна підключитись клієнтом MySQL і взаємодіяти через SphinxQL:

mysql -P9306 -h0

В рамках цього матеріалу не будуть описані детальні мануали.

Оскільки проєкт має хорошу документацію:

досвідчені користувачі Sphinx з легкістю можуть застосовувати свій досвід, наприклад в "searchd", що має таку само архітектуру, а синтаксис "extended-search":

- повністю сумісний.

Інтеграція

Проєкт має багато офіційних бібліотек для різних мов програмування, зокрема:

Розгортання програми з цією бібліотекою настільки просте, що зводиться до наступних рядків:

composer require manticoresoftware/manticoresearch-php
 'localhost',
        'port' => 9308
    ]
);

$index = $client->index(
    'test_index'
);

$index->create(
    [
        'field1' => [ 'type' => 'text' ],
        'field2' => [ 'type' => 'text' ]
    ]
);

$index->addDocument(
    [
        'field1' => 'hello',
        'field1' => 'world'
    ],
);

$results = $index->search('hello')->get();

Кому цікавий приклад програми на PHP, може відвідати сторінку дуже простого кравлера з веб інтерфейсом:

який був написаний в максимально короткі терміни для мережі Yggdrasil:

Yggdrasil - мережа з децентралізованим роутингом

Наразі містить в своєму індексі близько 10.000.000 сторінок, при цьому потужності серверу рівні мінімальному тарифу VPS за 5 євро.

Для роботи з SphinxSQL в PHP зручно використовувати "php-pdo"; для фільтрації деяких текстових полів - можна додати окреме поле "crc32", також такий підхід можна використовувати у якості Document ID (коли є потреба зменшити об'єм даних і не критична точність)

Бекапи

Декілька слів про бекапи: їх традиційно два типи - логічний і фізичний.

Логічний бекап

Дозволяє генерувати SQL дампи, які наприклад зручно читати, але вони потребують більше ресурсів, тому виконуються рідше.

Приклад створення дампу буде таким:

mysqldump -h0 -P9306 manticore test_index > test_index.sql

Фізичний бекап

Такий спосіб передбачає копіювання "сирих" даних до відповідної теки, не вимагає багато ресурсів на обчислення і виконується частіше:

/usr/bin/manticore-backup --backup-dir=/home/backup/manticore

Власний досвід

Працювати з Manticore одне задоволення, що доводилось робити руками в Sphinx - вже працює з коробки.

Маю не перший проєкт на цьому рушії, подекуди повністю відмовився від MySQL, хоч іноді це не дуже зручно, але більше не витрачаю свій час на

проєктування в MySQL Workbench і віддаю перевагу прямому зберіганню даних до індексу в менш нормалізованому, але більш швидкому в розробці форматі.

Єдине, що б радив зробити, це перемкнути стандартний рівень "binlog" в режим "1", інакше можуть бути незручності з останніми транзакціями, якщо ваш сервер чутливий до вимикання світла, а транзакції відбуваються часто (у разі ймовірності отримати збій в посeкундному режимі зберігання).

Зробити це можна у файлі:

searchd {
    ...
    binlog_flush = 1
}
Детальніше про стратегії бінарних журналів

Посилання

Офіційний сайт Manticore

Дивіться також

Незручні моменти в роботі з Manticore як основної БД