Text
Page: 1
Groongaで
Redmineを
高速全文検索
須藤功平
株式会社クリアコード
redmine.tokyo第12回勉強会
2017-05-13
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 2
よく活用されたRedmine
情報の宝庫
問題解決の経緯
Wikiに整理したノウハウ
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 3
さらに活用するために
必要なときに
必要な情報に
素早くアクセスしたい!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 4
活用方法:検索!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 5
活用の壁
よく活用されたRedmine
大量の情報(ただし玉石混合)
さらに活用するための課題
大量→必要な情報を見つけにくい
大量→探す時間が増える
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 6
課題例1:検索ノイズが多い
これ以外全部ノイズ
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 7
課題例2:検索が遅い
本当に大量だとね!
↓これくらいだと遅くない
チケット数:3629
コメント数:35721
Wikiページ数:1016
1秒以内に返ってくる
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 8
解決策
Groongaで
Redmineを
高速・高精度
全文検索
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 9
解決例1:検索ノイズがない
全部それっぽい!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 10
検索ノイズ?
上位N件でがっかりする?
がっかり→ノイズ多い
ユーザーは上位N件しか確認しない
Groongaはスコアを調整してソート
件数は関係ない
実はこの例ではヒット件数は同じ
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 11
解決例2:検索が速い
↓これくらいだと誤差
チケット数:3629
コメント数:35721
Wikiページ数:1016
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 12
200万チケットのケース
https://twitter.com/akahane92/status/733832496945594368
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 13
ここまでのまとめ
Redmineをさらに活用したい!
素早く必要な情報にアクセス!
検索をがんばらないと!
Groongaで全文検索!
検索ノイズが少ない!
速い!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 14
ここからの話
導入したくなる
情報を紹介
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 15
インストール:RDBMS
対応RDBMS
MySQLもPostgreSQLも!
RDBMSにGroonga対応
プラグインをインストール
プラグイン:別途サービス管理不要→運用コスト増加な
し
MySQL:Mroonga
PostgreSQL:PGroonga
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 16
インストール:Mroonga
http://mroonga.org/ja/docs/install.html
パッケージで簡単インストール
対応プラットフォーム
Debian GNU/Linux, Ubuntu
CentOS Fedora
macOS
Windows
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 17
インストール:PGroonga
https://pgroonga.github.io/ja/install/
パッケージで簡単インストール
対応プラットフォーム
Debian GNU/Linux, Ubuntu
CentOS Fedora
macOS
Windows
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 18
設定:PGroonga
Redmine用のユーザーに
PGroongaを使う権限を付与
CREATE EXTENSION pgroonga;
GRANT USAGE ON pgroonga TO ユーザー名;
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 19
インストール:プラグイン
% cd redmine
% git clone \
https://github.com/okkez/redmine_full_text_search.git \
plugins/full_text_search
% bin/rake redmine:plugins RAILS_ENV=production
再起動で完了!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 20
高度な検索1:AND/OR/NOT
キーワード単位でのAND/OR/NOT
従来:AND/ORのみ
従来:キーワード全体で切り替え
例:
(Groonga OR Mroonga) -PostgreSQL
GroongaまたはMroongaを含むが
PostgreSQLは含まない
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 21
高度な検索2:並び順の変更
ソート対象:スコア・更新時刻
従来:更新時刻のみ
ソート順:昇順・降順
従来:降順のみ
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 22
並び順の変更UI
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 23
ここまでのまとめ
簡単にインストールできる
運用も楽
AND/OR/NOTを使える
絞り込みに便利
並び順をカスタマイズできる
スコアと更新時刻で十分
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 24
ここからの話
今後の野望
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 25
類似issue検索
issue作成時・閲覧時
自動で類似issueを提示
手動設定の関連issueとは別
類似しているかは計算する
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 26
類似issue:ユースケース
新しい問題が発生!
あれ?どこかで見たような…
プラグイン:
「このissue、似ていませんか?」
→問題の早期解決!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 27
類似issue検索:実装
Groonga内のデータを活用
テキストデータだけでなく
メタデータも活用
メタデータ例:関連issue
開発協力者を募集
実装・データ提供・発注など
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 28
入力補完
検索ボックス
入力に応じてキーワードを随時提示
↑ヒットするもののみ
各種入力欄(タイトルなど)
入力に応じて既存内容を随時提示
ローマ字でインクリメンタルサーチ
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 29
入力補完:ユースケース
検索ボックス
自然と適切な検索に誘導!
例:typoを防ぐ・表記揺れを吸収
各種入力欄
自然と表記を統一!
→検索しやすい・理解しやすい
例:typoを防ぐ・表記揺れを吸収
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 30
入力補完:実装
Groonga内のデータを活用
どのくらいヒットするキーワード?
ログも活用:検索頻度は?
メタデータも活用:
プロジェクト・トラッカー毎に
文脈をわける
開発協力者を募集
実装・データ提供・発注など
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 31
同義語展開
表記揺れを吸収
例:「打ち合わせ」・「打合せ」
吸収:「打ち合わせ OR 打合せ」
同義語は管理が大変!
文脈で異なる!増減する!
同義語管理を支援
例:同義語候補を自動生成
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 32
同義語展開:ユースケース
検索ボックス
欲しい情報にたどり着ける!
表記揺れによる未発見を解消
同義語管理のコスト削減
Redmine内のデータを
より低コストで有効活用!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 33
同義語展開:実装
Groongaの組み込み機能を活用
高速に同義語展開が可能
同義語候補を機械学習
Groonga内のデータを活用
開発協力者を募集
実装・データ提供・発注など
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 34
スマートナビ(仮)
言わなくても欲しいものを提示
例:駅の近くでスマホを見る
→その駅の時刻表を自動で表示
ポイント:ユーザーは
「駅名 時刻表」で
明示的に検索していない!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 35
スマートナビ:ユースケース
.oO(打ち合わせのアジェンダ
をWikiにまとめておこう)
Redmine:ホーム画面に該当Wikiペ
ージのリンクを表示
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 36
スマートナビ:実装
行動履歴から知識を学習
打ち合わせ前にいつもWikiを更新
内容から事実を収集
Wikiページ内のテキスト
「参加者:○○…」から抽出
開発協力者を募集
実装・データ提供・発注など
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 37
ここまでのまとめ
このプラグインの現状
Redmineの不便を解消
(マイナスを少しプラスに)
このプラグインの今後
Redmineをさらに有効活用!
(少しプラスをすごくプラスに)
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 38
ここからの話
Redmineの開発に
参加しよう!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 39
開発に参加?
Redmine本体のコードを書く
だけじゃない
バグレポート・テスト・issue対応
ドキュメント作成・宣伝
プラグインを作る
だけじゃない
本体と同様↑のことも大事な開発
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 40
開発の参加例
Groongaプラグイン開発時の
知見をフィードバック
Defect #21993: サイズ上限が小
Patch #23153: フックを追加
Feature #25198: スコアを表示
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 41
敷居が高そう?
OSS Gateワークショップへ
参加してみよう
「OSS開発に参加」を経験できる
(Redmineもプラグインの多くもOSS!)
(もちろんこのプラグインもGroongaもOSS!)
https://oss-gate.doorkeeper.jp/
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1
Page: 42
まとめ
Redmineをさらに活用するなら
Groongaプラグインを使おう!
Redmineの開発に参加しよう!
OSS Gateワークショップが役立つ
宣伝:全文検索のことは
クリアコードに相談しよう!
Groongaで Redmineを 高速全文検索
Powered by Rabbit 2.2.1