

Redmineのプロジェクトおよびタスク管理システムを使用します。 使いやすさを向上させ、機能を拡張するために、ニーズに合わせて仕上げを続けます。 別のタスクは、検索を高速化することでした。
Redmineのタスク数が数十万に増加したため、検索クエリの処理に数十秒かかりましたが、これは許容できないほど長い時間です。 したがって、 Elasticsearchに基づいて全文検索を実装することにしました。 この投稿はこれについてです。
Elasticsearchが何であるか、なぜ必要なのか、Elasticsearchをインストールおよび構成する方法については説明しません。 habrには多くの記事があります(たとえば、 one 、 two 、 three )。 実装について直接説明しましょう。
プラグインのリストの中に、一見完全にredmine_elasticsearchが見つかりました。 しかし、すべてがそれほど単純ではないことが判明しました。このプラグインは数年間サポートされておらず、非常に時代遅れです(変更ログではRedmine 2.5.xで最新の互換性が示されています)。 ただし、タスクは設定されており、解決する必要があります。
実装手順を説明します
プラグインには多くの依存関係が必要です。 最初に、redmine_elasticsearchはResqueを使用してバックグラウンドインデックス付けタスクを実行します。 しかし、Redmineでは、いくつかのプラグインがこれらのタスクにすでにSidekiqを使用しており、Resqueを接続することは依然として意味をなしません。 したがって、最初のステップはResqueをSidekiqに置き換えました。
第二に、Elasticsearch gemで動作するために「タイヤ」が使用されますが 、これは非推奨です。 さらに、代わりにelasticsearch-railsを使用することがますます推奨されます。 これにより、消しゴムのバージョンに厳しい制限が課せられます。 バージョン1.7.Xでのみ操作性を実現しました。 タイヤ交換作業は行わず、将来のために残しました。
第三に、消しゴムには、2つの追加プラグインが必要です。
それらのインストールでは問題はありません。
インストールについて
プラグインは標準でインストールされます。 リポジトリからプラグインフォルダーにコードを複製します。 この場合、次のようになります。
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分かかりました。
「index_queue」という名前のキューに対してSidekiqを開始します。
sidekiq -q index_queue
redmineを再起動します。
それだけです プラグインはすぐに動作し、標準のRedmine検索をフルテキストに置き換えます。
まとめると
もちろん、将来の消しゴムのバージョンへの厳しい依存をなくすために、タイヤをelasticsearch-railsに置き換える作業はまだたくさんあることを理解しています。 しかし、見つかったソリューションには存在する権利があり、その効率性はすでに証明されています。 プラグインの導入後、検索速度は0.11〜0.16秒まで低下しましたが、プラグインがない場合は12秒でした。 これは素晴らしい結果だと思います。 そして、私たちのスタッフからの感謝のフィードバックは、この意見を確認します。
この記事がお役に立てば幸いです。 質問/コメントおよび提案はコメントに書き込みます。 ご清聴ありがとうございました!
改善されたforkへのリンク: redmine_elasticsearch