home

Миграция на поисковый движок Manticore Search

manticore.png

Изначально в ELiS для полнотекстового поиска был использован отечественный поисковый движок Sphinx второй версии. Я собрал для него RPM-пакеты для CentOS7 и CentOS8 (пакеты доступны в открытом репозитории), но только для второй версии (актуальная - третья версия).

В результате внутренних проблем в 2017 году был создан форк Sphinx под названием Manticore Search.

И тот и другой поисковые движки развиваются под открытой лицензией GPL, но политика развития Manticore более открытая, исходный код доступен на GitHub, регулярно производятся релизы, есть RPM-пакеты для CentOS. Sphinx-же релизится раз в год, в открытом доступе исходников нет (предоставляются по запросу), RPM-пакетов нет, несколько хуже документация.

В целом и дальше можно было бы использовать Sphinx, но по историческим причинам в ELiS используется Sphinx без обновления индексов в реальном времени (т.е. чтобы изменения попали в поисковый индекс, необходимо переиндексировать полностью все документы и если вы хотите, чтобы изменения и добавления сущностей быстрее попадали в поиск надо чаще запускать полное переиндексирование).

Переиндексация требует перезаписи файлов больших объемов, что означает, что ее не выгодно производить слишком часто, а значит будет лаг между добавлением новых документов и тем как они появятся в индексе (обычно 1 час, но если индекс большой, то обновление индекса делается реже).

Второй отрицательный момент связан с механизмом резервного копирования виртуальных машин: есть средства, которые позволяют при резервном копировании производить копирование не всей виртуальной машины целиком, а только разницы того, что было записано за время последнего резервного копирования (дельта-диск). Но если регулярно делать переиндексацию, то даже за день дельта-диск будет составлять гигабайты информации, эффективность резервного копирования при этом резко падает. Можно, конечно, индекс хранить на диске, который исключается из резервного копирования, но это требует более сложной установки и более объемных инструкций, чего хотелось-бы избежать.

Эти два момента приводят к желанию изменить механизм поиска, отказавшись от переиндексирования и перейти на использование реалтаймовых индексов. Такие индексы позволяют сразу видеть новые документы в поиске без переиндексирования. Они на самом деле появились еще во второй версии Sphinx и можно было бы их включить не меняя и даже не обновляя сервер, но возникли некоторые проблемы с тем, что во второй версии имеются различные ошибки, которые уже не будут исправляться, а если мигрировать на третью версию Sphinx, то это потребует определенной ручной работы и тогда можно уже выбирать между Sphinx 3 и Manticore 3.

Т.к. сборка RPM-пакета Sphinx 3 оказалась сложнее, чем вначале предполагалось, а Manticore продемонстрировала более высокий темп развития и лучшую открытость ПО, решено мигрировать поисковый движок на Manticore.

Итак, в результате миграции:

1) Появляется HTTP-интерфейс для поисковых запросов (на случай, если вы захотите использовать поисковый индекс напрямую, минуя API ELiS и HTTP-интерфейс для вас предпочтительнее SQL.

2) Используется новый генератор конфигурации поисковика, который теперь делает поисковыми полями не только те, что создаются при установке ELiS, но и те, которые вы добавите сами.

3) Атрибуты сущностей теперь будут храниться в формате JSON (rt_attr_json) в атрибуте с именем 'fields', что делает добавление атрибутов бессхемным. Теперь многие поля сущностей будут сохраняться в атрибуты просто при сохранении сущности и при этом ничего не надо настраивать!

4) Создаются три новых индекса: 'node', 'user', 'term', в которых хранятся соответствующие сущности Drupal. В будущем это позволит искать не только по документам, но и по терминам и по пользователям со всеми добавленными к ним полями!

5) Переиндексация теперь понадобится только при добавлении или изменении полей.

6) Изменения сущностей попадают в индекс сразу (реалтаймовая индексация) не дожидаясь запуска переиндексации.

7) Конфигурация поисковика теперь хранится в /etc/manticoresearch/manticore.conf и для реалтаймовых индексов ее теперь намного проще читать.

Миграция со Sphinx на Manticore[править]

Поддержка Manticore появилась в модуле ELiSsearch с 7.x-2.1

Установите этот модуль при наличии поддержки и сбросьте кеш

# dnf update drupal7-elis-mod-search

Остановите Sphinx:

# systemctl stop searchd

Установите репозитарий Manticore и из него соответствующий сервер (используйте вместо dnf пакетный менеджер yum на CentOS7):

# dnf install https://repo.manticoresearch.com/manticore-repo.noarch.rpm
# dnf install manticore
# mkdir -p /var/lib/manticore/binlog
# chown -R manticore:manticore /var/lib/manticore


Сгенерируйте конфигурацию для Manticore:

# chown manticore:elis /etc/manticoresearch/manticore.conf
# chmod 0664 /etc/manticoresearch/manticore.conf
# cd /var/www/vh/library
# su elis
$ drush cc drush
$ drush elis-search-reconfigure
$ exit
Удалите из crontab задачу на индексирование Sphinx, для чего в файле /usr/share/elis/crontab удалите строку с содержанием
sudo -u sphinx /usr/bin/indexer --rotate --all
и выполните
# crontab /usr/share/elis/crontab

Запустите сервер Manticore:

# systemctl enable manticore
# systemctl start manticore

Запустите индексирование:

# cd /var/www/vh/library
# su elis
$ drush cc drush
$ drush elis-search-reindex
$ exit

Переиндексирование[править]

После добавления или удаления любых полей требуется перестроить реалтаймовый индекс.

Для этого остановите сервер:

# systemctl stop manticore

Удалите существующие индексы и бинарные логи:

# rm -f /var/lib/manticore/node.*
# rm -f /var/lib/manticore/user.*
# rm -f /var/lib/manticore/term.*
# rm -f /var/lib/manticore/binlog/*

Пересоздайте конфигурацию:

# chown manticore:elis /etc/manticoresearch/manticore.conf
# chmod 0664 /etc/manticoresearch/manticore.conf
# cd /var/www/vh/library
# sudo -u elis /home/elis/drush/vendor/bin/drush elis-search-reconfigure

Запустите поисковый сервер:

# systemctl start manticore

Запустите переиндексацию:

# cd /var/www/vh/library
# su elis
$ drush elis-search-reindex

Если в процессе переиндексации произойдут ошибки и скрипт аварийно завершится из-за нехватки памяти, запустите переиндескацию несколько раз (прогресс запоминается) до корректного завершения работы.

Прогресс переиндексирования можно посмотреть в логах admin/reports/dblog, где через каждых 100 переиндексированных сущности пишется событие.

Команды drush для работы с поиском[править]

Модуль ELiS Search позволяет выполнять две команды:

elis-search-reindex[править]

$ drush elis-search-reindex

Команда полностью перестраивает индекс реального времени (обновляет все сущности в индексе). Выполняется долго и в случае нехватки оперативной памяти может аварийно завершаться. При аварийном завершении можно команду перезапустить, она запоминает прогресс импорта.

elis-search-reconfigure[править]

$ drush elis-search-reconfigure

Запускает генерацию конфигурации для Manticore Search. Чтобы конфигурация успешно сохранилась в /etc/manticoresearch/manticore.conf у пользователя под которым запущена команда (обычно это пользователь "elis"), должны быть права на запись в файл.

Чтобы поиск подхватил изменения, необходимо остановить сервер, удалить индексы и запустить сервер. Дальше необходимо провести повторное индексирование командой drush elis-search-reindex.