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

4 хв. читання

Багато хто використовує для повнотекстового пошуку рушій 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 - повністю сумісний.

Інтеграція

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

composer require manticoresoftware/manticoresearch-php

<?php

$client = new \Manticoresearch\Client(
    [
        'host' => '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. Наразі містить в своєму індексі близько 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кундному режимі зберігання).

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

#/etc/manticoresearch/manticore.conf
searchd {
    ...
    binlog_flush = 1
}

Посилання

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
p.s. 368
Приєднався: 1 місяць тому
Коментарі (6)
  1. Kamilla Larina

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

    1. як реалізувати транслітерацію, щоб це окремими полями у індексі не робити [1]
    2. чи є якийсь генератор для словників, де б вхідним массивом надати дані, а генератор би опрацював вхідні закінчення для словоформ [2]
    3. обробник помилок [3]

    прикладом є рядок: "дивовижна дистанція марафону передбачає біг та пробіжку на велику дистанцію усіх учасників забігу по всьому континенту ,su gj lbcnfywszv" [1] щоб корректно знайшло всі документи, де фігурує ",su" (на транслітерації корень слова "біг") [2] розумію, що є словник exceptions, але руками туди багатотисячні збіги вносити теж не корректно, по типу: "біганина, забіг, пробіжка, вибігати... тощо" [3] якщо введено по типу "бііг", "перебіжка" (корректне слово пробіжка), тощо.

    3 тижні тому ·
    0
    1. p.s.
      як реалізувати транслітерацію, щоб це окремими полями у індексі не робити [1]

      я користуюсь сторонньою бібліотекою дані транслітерую на етапі вводу, додаю в умову extended search. взагалі, може варто зробити це словником, але то довго, тому так.

      чи є якийсь генератор для словників, де б вхідним массивом надати дані, а генератор би опрацював вхідні закінчення для словоформ [2]

      хороше питання, поки не було такої потреби (зокрема для української мови) але поділюсь як буде практичний досвід!

      обробник помилок [3]

      яких саме помилок? шляхи внутрішніх журналів вказані в налаштуваннях searchd

      програмні помилки - стандартними методами обраної мови / бібліотеки відповідно

      3 тижні тому ·
      1
      Kamilla Larina
      1. Kamilla Larina

        Дякую за відповідь, зокрема задача по транслітерації знайшла новий оберт, щодо "extended search", чи не напишете кілька рядків", бо я через PHP клієнт працюю, не чистими query відправляю запити. Щодо обробника помилок, то малось на увазі, якщо по прикладу з попереднім повідомленнням, якщо вводити "біііг", щоб знаходило той же ж "біг", тобто коррекція, морфологію підключала як саундекс так і метафон, попередньо стіми enru ну і відповідно lemmatize_uk_all, і всерівно, пошук по типу:

        $search->match('@name біііг')
        

        результатом видає 0

        p.s. також не до кінця розумію, як грамотно прописати mantocore.conf, оскільки на сервері немає MYSQL, тільки сам мантікор крутиться на 9308, то ж дані передаю безпосередньо через PHP, створюючи індекси, але щось не розумію по секціям, зокрема common, чи можу там якось універсально вказати базу по лемматизатору, морфології, синонімам, charset_table, тощо. якщо є якісь приклади, буду вдячною, бо по документації вже 2-й тиждень розбираюсь і ніяк не докручу, зокрема з транслітерацією, оскільки ",su" -> "біг", так і не ловить ні зі словника словоформ ні з exceptions, а при перегляді call keywords, видно, що нормалізація не бачить переклади, можливо порядок підключення модулів по ключу:

        'morphology' => 'soundex,metaphone,lemmatize_ru_all,stem_enru,lemmatize_uk_all'
        

        грає роль і тому не опрацьовує ?

        3 тижні тому ·
        0
        p.s.
  2. p.s.
    $search->match('@name біііг')

    Тут я взагалі не знаю, як рушій має визначити термін, хіба що ви якось налаштуєте суфікси окремо, або інтегруєте корекцію орфографії до вводу.

    ",su" -> "біг"

    Це не транслітерація, а швидше питання по конкретній розкладці клавіатури (не у всіх ці літери на вказаних клавішах), це до слова.

    Якщо у вас нестандартний ввід і немає бажання розбиратись зі словниками / keymap, то я б радив обробляти корекцію на рівні php. Сюди ж не забудьте про екранування спец. символів - це у вашому випадку може також збивати з толку.

    Підключитись до сервера можна командою mysql -P9306 -h0 але спочатку встановіть MySQL клієнт для запитів SQL (не плутати з сервером).

    Питання краще задавати напряму на GitHub Issues або Discussions (посилання вище), якщо проблеми з перекладом то через Google translator, або тут в розділ Q&A. Бо як мінімум можна виділити 3 питання на 3 окремі треди, таке в коментах не вирішується

    3 тижні тому ·
    1
  3. Kamilla Larina

    Ще раз вдячна за відповідь, вирішилось все досить простіше (як Ви й писали раніше, мантікора дивує рішеннями з коробки), тобто в першу чергу (пріоритетом), роблю пошук по прямому входженню пошукового ключа, якщо к-сть документів 0, тоді 2-га ітерація йде по повнотекстовому пошуку, якщо і там 0-вий результат, тоді вже через suggest, якщо є значення (docs) тоді вже вибірка ключа і повнотекстовий пошук по ньому, як на мене, оптимальна покроковість для отримання результату, якраз suggest і вирішує автокоррекцію помилок та транслітерацію алгоритм пошуку

    3 тижні тому ·
    1
Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація