- PVSM.RU - https://www.pvsm.ru -
У нас [1] используется система управления проектами и задачами Redmine [2]. Мы продолжаем допиливать ее под свои нужды, чтобы повысить удобство работы и расширить функционал. Очередной задачей стало ускорение поиска.
С тех пор как количество задач в Redmine выросло до нескольких сотен тысяч, время на обработку поискового запроса стало занимать десятки секунд, что недопустимо долго для нас. Поэтому мы решили внедрить полнотекстовый поиск на основе Elasticsearch [3]. Про это и будет данный пост.
Описывать, что такое Elasticsearch, для чего он нужен, как его установить и настроить, я не буду. Есть много статей на хабре (например раз [4], два [5], три [6]). Остановимся непосредственно на внедрении.
Среди списка плагинов был найден, казалось бы, полностью подходящий redmine_elasticsearch [7]. Но оказалось, не все так просто: этот плагин уже пару лет не поддерживается и сильно устарел (в changelog последняя совместимость указана с Redmine 2.5.x). Однако задача поставлена, и надо ее решать.
Для работы плагина необходим ряд зависимостей. Во-первых, для выполнения фоновых задач по индексированию сущностей redmine_elasticsearch использует Resque. Но в нашем Redmine несколько плагинов уже использовали Sidekiq для этих задач, и подключать еще Resque не было смысла. Поэтому первым шагом мы заменили Resque на Sidekiq.
Во-вторых, для работы с Elasticsearch используется gem 'tire' [8], который устарел. Более того, все чаще рекомендуется использовать вместо него elasticsearch-rails [9]. Это накладывает жесткое ограничение на версию еластика. Нам удалось добиться работоспособности, но только на версии 1.7.Х. Работу по замене tire мы не проводили и оставили на будущее.
В-третьих, для еластика необходимо два дополнительных плагина:
С их установкой проблем не возникает.
Ставится плагин стандартно. Клонируем код из репозитория в папку с плагинами. В нашем случае это выглядит так:
git clone https://github.com/centosadmin/redmine_elasticsearch.git /opt/redmine/plugins
Ставим необходимые гемы:
bundle install
Теперь нужно произвести индексирование всех сущностей Redmine. Это делается командой:
bundle exec rake redmine_elasticsearch:reindex_all RAILS_ENV=production
Обратите внимание: процесс индексирования довольно длительный, в нашем случае он занял ~40 минут.
Стартуем Sidekiq для очереди с именем 'index_queue':
sidekiq -q index_queue
Перезапускаем редмайн.
Все. Плагин готов к работе и заменяет стандартный поиск Redmine на полнотекстовый.
Мы, конечно, понимаем, что предстоит еще много работы по замене tire на elasticsearch-rails, чтобы устранить жесткую зависимость от версии еластика в будущем. Но найденное решение имеет право на существование и уже доказало свою работоспособность. После внедрения плагина скорость поиска сократилась до ~0.11–0.16 секунды против десятка секунд без него. Мы считаем, это отличный результат. И благодарные отзывы наших сотрудников подтверждают это мнение.
Надеюсь, статья будет вам полезна. Вопросы/замечания и предложения пишите в комментариях. Спасибо за внимание!
Ссылка на форк с нашими доработками: redmine_elasticsearch [12]
Автор: Centos-admin.ru
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/plugin/220968
Ссылки в тексте:
[1] нас: https://centos-admin.ru/
[2] Redmine: http://www.redmine.org
[3] Elasticsearch: https://www.elastic.co/
[4] раз: https://habrahabr.ru/post/280488/
[5] два: https://habrahabr.ru/post/122531/
[6] три: https://habrahabr.ru/post/275815/
[7] redmine_elasticsearch: http://www.redmine.org/plugins/redmine_elasticsearch
[8] gem 'tire': https://github.com/karmi/retire
[9] elasticsearch-rails: https://github.com/elastic/elasticsearch-rails
[10] Morphological Analysis Plugin for ElasticSearch: https://github.com/imotov/elasticsearch-analysis-morphology
[11] Mapper Attachments Type for Elasticsearch: https://github.com/elasticsearch/elasticsearch-mapper-attachments
[12] redmine_elasticsearch: https://github.com/centosadmin/redmine_elasticsearch
[13] Источник: https://habrahabr.ru/post/317524/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.