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