Text
Page: 1
全文検索で
Redmineを
さらに活用!
須藤功平
株式会社クリアコード
Redmine大阪 第17回勉強会
2017-08-26
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 2
よく活用されたRedmine
情報の宝庫
問題解決の経緯
Wikiに整理したノウハウ
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 3
さらに活用するために
必要なときに
必要な情報に
素早くアクセスしたい!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 4
活用方法:検索!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 5
活用の壁
よく活用されたRedmine
大量の情報(ただし玉石混合)
さらに活用するための課題
大量→必要な情報を見つけにくい
大量→探す時間が増える
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 6
課題例1:検索ノイズが多い
これ以外全部ノイズ
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 7
課題例2:検索が遅い
本当に大量だとね!
↓これくらいだと遅くない
チケット数:4049
コメント数:41264
Wikiページ数:1081
1秒以内に返ってくる
キャッシュが効く:0.1sくらい
キャッシュが効かない:0.7sくらい
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 8
解決策
Groongaで
Redmineを
高速・高精度
全文検索
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 9
解決例1:検索ノイズがない
全部それっぽい!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 10
検索ノイズ?
上位N件でがっかりする?
がっかり→ノイズ多い
ユーザーは上位N件しか確認しない
Groongaはスコアを調整してソート
件数は関係ない
実はこの例ではヒット件数は同じ
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 11
解決例2:検索が速い
↓これくらいだと誤差
チケット数:4049
コメント数:41264
Wikiページ数:1081
参考:
既存(キャッシュあり)と
Groonga(キャッシュなし)が
同じくらい
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 12
200万チケットのケース
https://twitter.com/akahane92/status/733832496945594368
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 13
ここまでのまとめ
Redmineをさらに活用したい!
素早く必要な情報にアクセス!
検索をがんばらないと!
Groongaで全文検索!
検索ノイズが少ない!
速い!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 14
ここからの話
導入したくなる
情報を紹介
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 15
インストール:RDBMS
対応RDBMS
MySQLもPostgreSQLも!
RDBMSにGroonga対応
プラグインをインストール
プラグイン:別途サービス管理不要→運用コスト増加な
し
MySQL:Mroonga
PostgreSQL:PGroonga
全文検索で 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
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 17
インストール:PGroonga
https://pgroonga.github.io/ja/install/
パッケージで簡単インストール
対応プラットフォーム
Debian GNU/Linux, Ubuntu
CentOS Fedora
macOS
Windows
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 18
インストール:プラグイン
% cd redmine
% git clone \
https://github.com/okkez/redmine_full_text_search.git \
plugins/full_text_search
% bin/rake redmine:plugins RAILS_ENV=production
再起動で完了!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 19
高度な検索1:AND/OR/NOT
キーワード単位でのAND/OR/NOT
従来:AND/ORのみ
従来:キーワード全体で切り替え
例:
(Groonga OR Mroonga) -PostgreSQL
GroongaまたはMroongaを含むが
PostgreSQLは含まない
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 20
高度な検索2:並び順の変更
ソート対象:スコア・更新時刻
従来:更新時刻のみ
ソート順:昇順・降順
従来:降順のみ
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 21
並び順の変更UI
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 22
ここまでのまとめ
簡単にインストールできる
運用も楽
AND/OR/NOTを使える
絞り込みに便利
並び順をカスタマイズできる
スコアと更新時刻で十分
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 23
2017年5月以降の話
redmine.tokyo 第12回勉強会
2017年5月
ノイズが少なくて高速
その後
高速化
類似issue検索対応
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 24
高速化
旧
LIKE検索をGroongaに置き換え
他の条件はそのまま
新
すべてGroongaで検索
高速・柔軟・高度な検索をサポート
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 25
データの扱い
旧
正規化してデータを保存
検索時に複数回のSELECT
新
1つのテーブルにデータを保存
1回のSELECTで検索(速い)
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 26
柔軟
ドリルダウンで対象を分別
チケットn件・Wikiページn件とか
標準でもあるやつ
ハイライト・スニペット
標準よりもいい感じ
類似文書検索
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 27
類似文書検索
活用例
類似issue検索
実装着手
類似Wiki検索
未実装
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 28
類似issue検索
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 29
類似issue:ユースケース
新しい問題が発生!
あれ?どこかで見たような…
プラグイン:
「このissue、似ていませんか?」
→問題の早期解決!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 30
類似issue検索:現実装
issue閲覧時
自動で類似issueを提示
Groonga内のデータを活用
テキストデータで類似文書検索
精度
まぁまぁ
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 31
ここからの話
今後の野望
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 32
類似issue検索精度向上
メタデータを活用
手動設定の関連issue情報使用
属性情報使用
カテゴリとかトラッカーとか
同一プロジェクトに限定する
Wikiも対象に加える
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 33
類似issue検索精度向上
機械学習技術を活用
字面でなく意味で類似文書検索
例:メールのthreadとプログラムの
threadは違う
例:MroongaでMySQLも類似度向上
回答の自動生成
RNNを用いた機械翻訳とか
類似issueの結論を探さなくてよい
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 34
データ活用に向けて
GroongaにPython組込
Rubyでデータ処理
Red Data Tools
Apache Arrow
次世代データ交換フォーマット
コミッターになった!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 35
類似issue
共同開発組織募集
精度向上にはデータが不可欠
データを持っていそうな組織
大量ユーザー・長期間運用組織
マネージドサービス提供組織
Redmine内データを活用したい
組織はぜひ!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 36
添付ファイル内全文検索
現状:ファイル名と説明
テキスト抽出できれば検索可能
テキスト抽出ツール例:ChupaText
Groongaプロジェクトのテキスト抽出ツール
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 37
添付ファイル内全文検索
実装案
テキスト抽出部分をプラグイン
できるようにすればRedmine本
体に入れられるのでは!?
ChupaTextよりApache Tikaを使いた
い人もいそう
検索はLIKEでよい
Groongaプラグインを入れたら高速になる、でよい
だれかチャレンジしない?
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 38
入力補完
検索ボックス
入力に応じてキーワードを随時提示
↑ヒットするもののみ
各種入力欄(タイトルなど)
入力に応じて既存内容を随時提示
ローマ字でインクリメンタルサーチ
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 39
入力補完:ユースケース
検索ボックス
自然と適切な検索に誘導!
例:typoを防ぐ・表記揺れを吸収
各種入力欄
自然と表記を統一!
→検索しやすい・理解しやすい
例:typoを防ぐ・表記揺れを吸収
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 40
入力補完:実装
Groonga内のデータを活用
どのくらいヒットするキーワード?
ログも活用:検索頻度は?
メタデータも活用:
プロジェクト・トラッカー毎に
文脈をわける
開発協力者を募集
実装・データ提供・発注など
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 41
同義語展開
表記揺れを吸収
例:「打ち合わせ」・「打合せ」
吸収:「打ち合わせ OR 打合せ」
同義語は管理が大変!
文脈で異なる!増減する!
同義語管理を支援
例:同義語候補を自動生成
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 42
同義語展開:ユースケース
検索ボックス
欲しい情報にたどり着ける!
表記揺れによる未発見を解消
同義語管理のコスト削減
Redmine内のデータを
より低コストで有効活用!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 43
同義語展開:実装
Groongaの組み込み機能を活用
高速に同義語展開が可能
同義語候補を機械学習
Groonga内のデータを活用
開発協力者を募集
実装・データ提供・発注など
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 44
スマートナビ(仮)
言わなくても欲しいものを提示
例:駅の近くでスマホを見る
→その駅の時刻表を自動で表示
ポイント:ユーザーは
「駅名 時刻表」で
明示的に検索していない!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 45
スマートナビ:ユースケース
.oO(打ち合わせのアジェンダ
をWikiにまとめておこう)
Redmine:ホーム画面に該当Wikiペ
ージのリンクを表示
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 46
スマートナビ:実装
行動履歴から知識を学習
打ち合わせ前にいつもWikiを更新
内容から事実を収集
Wikiページ内のテキスト
「参加者:○○…」から抽出
開発協力者を募集
実装・データ提供・発注など
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 47
ここまでのまとめ
このプラグインの現状
Redmineの不便を解消
(マイナスを少しプラスに)
このプラグインの今後
Redmineをさらに有効活用!
(少しプラスをすごくプラスに)
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 48
ここからの話
Redmineの開発に
参加しよう!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 49
開発に参加?
Redmine本体のコードを書く
だけじゃない
バグレポート・テスト・issue対応
ドキュメント作成・宣伝
プラグインを作る
だけじゃない
本体と同様↑のことも大事な開発
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 50
開発の参加例
Groongaプラグイン開発時の
知見をフィードバック
Defect #21993: サイズ上限が小
Patch #23153: フックを追加
Feature #25198: スコアを表示
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 51
敷居が高そう?
OSS Gateワークショップへ
参加してみよう
「OSS開発に参加」を経験できる
(Redmineもプラグインの多くもOSS!)
(もちろんこのプラグインもGroongaもOSS!)
https://oss-gate.doorkeeper.jp/
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 52
添付ファイル内全文検索を
実装したい!
私に相談だ!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1
Page: 53
まとめ
Redmineをさらに活用するなら
Groongaプラグインを使おう!
Redmineの開発に参加しよう!
OSS Gateワークショップが役立つ
宣伝:全文検索のことは
クリアコードに相談しよう!
全文検索で Redmineを さらに活用!
Powered by Rabbit 2.2.1