Поиск

Хотя в Drupal может использовать встроенный в РСУБД поиск, в ELiS используется отдельный поисковый сервер Manticore.

Manticore - быстрый отечественный поисковый сервер с предопределяемой схемой хранения, созданный на базе Sphinx.

Сервер написан на С и поддерживает обращение к себе как по SQL, так и по HTTP.

Установка сервера

Сервер устанавливается автоматически при установке ELiS на тот же сервер, где будет работать электронная библиотека и автоматически настраивается. Руками ничего делать не надо.

При необходимости, сервер может быть вынесен на отдельное оборудование.

Для установки на отдельном сервере скопируйте с сервера с Drupal файл /etc/yum.repos.d/manticore.repo на сервер для поиска, установите Manticore командой # dnf install manticore и перенести файл конфигурации сервера с Drupal файл /etc/manticore/manticore.conf. Добавить автозагрузку можно systemctl enable manticore и запустить systemctl start manticore. Укажите куда надо подключить сервер на сайте ELiS admin/config/search/elis.

Настройка

ELiS обеспечивает команды drush для настройки сервера.

drush elis-search-reconfigure

Производит генерацию файла /etc/manticore/manticore.conf из полей в Drupal.

Manticore надо задать предварительно конфигурацию полей которые он будет индексировать и если вы добавили или удалили в Drupal поля, необходимо произвести заново генерацию конфигурации Manticore с перезапуском сервера.

Конфигурация:

# cd /var/www/vh/library
# su elis
$ drush elis-search-reconfigure
$ exit
# systemctl stop manticore
# systemctl start manticore

Если файл конфигурации не изменился, добавьте пользователю elis права на запись на него:

# chown manticore:elis /etc/manticore/manticore.conf
# chmod 0664 /etc/manticore/manticore.conf

drush elis-search-reindex

В некоторых случаях требуется полностью перестроить поисковый индекс, для чего и выполняется команда elis-search-reindex.

Команда проходит по всем сущностям в Drupal и обновляет их в поисковом индексе.

Если команда прервется, повторный запуск команды продолжит с места прерывания.

При этом команда не удаляет старый индекс, а обновляет для всех существующих сущностей в Drupal.

При большой базе вероятно падение при переиндексации из-за исчерпания памяти. При этом ошибка будет содержать слова Error: Allowed memory size of … exhausted (tried to allocate … bytes). Это нормально, просто повторно запустите переиндексацию

Если при индексировании и повторном запуске происходит падение в одном и том же месте, повторный запуск индексирования пропустит сбойную ноду. Если не помогает, выполните:

drush vget elis_sphinx_search_rebuild_last_nid

В результате увидите номер ноды на которой происходит сбой (например 1234). Чтобы пропустить индексирование этой ноды, добавьте единицу к номеру сбойной (1234+1=1235) и продолжите индексирование:

drush vset elis_sphinx_search_rebuild_last_nid '1235'
drush elis-search-reindex

При успешном окончании последней строкой будет:

Real-time index rebuild completed

Если у вас реиндексирование регулярно прерывается, вы можете запустить его в цикле, например 10 раз:

su elis
for ((i=0; i<10; i++)); do cd /var/www/vh/library; drush elis-search-reindex; done

Полная перестройка индекса с удалением старого

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

Для этого надо остановить поисковый сервер, удалить старый индекс, запустить поисковый сервер, запустить повторное индексирование.

Делается это так:

# systemctl stop manticore
# rm -Rf /var/lib/manticore/*.*
# rm -Rf /var/lib/manticore/binlog/*
# cd /var/www/vh/library
# su elis
$ drush elis-search-reconfigure
$ exit
# systemctl start manticore
# su elis
$ drush elis-search-reindex
$ exit

Если будет прерывание переиндексирования (на этапе drush elis-search-reindex) просто запускайте индексирование несколько раз, пока оно не закончится. Прогресс виден в https://elis.example.com/admin/reports/dblog.

Порты сервера

По умолчанию сервер слушает адрес 127.0.0.1 и порты 9308, 9306, 9312. Проверить можно командой netstat -tnlp.

Сервер не использует авторизацию для создания в него запросов, поэтому в случае изменения сетевых настроек необходимо убедиться, что эти порты не открыты неавторизованному доступу.

Веса для поиска по полям

Попадание термина поискового запроса увеличивает ранг документа (см. документацию к ранкеру sph04 https://manual.manticoresearch.com/Searching/Sorting_and_ranking). Ранг попадание в отдельные поля суммируется по некоторой формуле и в результате строится ранг документа по отношению к поисковому запросу.

Можно в ручном режиме управлять весами попаданий терминов в отдельные поля, чтобы улучшать качество поиска. Так если увеличить вес попадания в поле title, попадание поискового термина в заголовок ресурса будет давать больший вклад чем попадание в текст, а значит документы будут двигаться в выдаче выше попаданий в фрагменты документов.

В ELiS уже есть преднастроенное увеличение веса для некоторых полей, но вы можете добавить или переопределить вес по любому полю в настройках поиска на странице admin/config/search/elis

Формат записи в текстовом поле - валидный JSON:

{
"fieldWeights": ["title":10,"email":30,"text":1]
}

Как узнать какие поля можно использовать? Все допустимые поля можно посмотреть в /etc/manticore/manticore.conf, где они указаны после rf_field. Так строка “rf_field: classification” означает, что имя поля “classification”, причем это поле соответствует “field_classification”.

Следует обратить внимание, что поля в Drupal обычно начинаются на “field_”, в то время как в поиске этот “field_” отрезается, чтобы удобней было формировать поисковые запросы, т.о. “field_classification” в Drupal будет соответствовать “classification” в поиске, а для попадания в поисковый запрос следует формировать его как “@classification searchedKeyword”.