Изначально в 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.